diff --git a/DEPS b/DEPS
index af07cafe..ae52034 100644
--- a/DEPS
+++ b/DEPS
@@ -229,7 +229,7 @@
   #
   # CQ_INCLUDE_TRYBOTS=luci.chrome.try:lacros-amd64-generic-chrome-skylab
   # CQ_INCLUDE_TRYBOTS=luci.chrome.try:lacros-arm-generic-chrome-skylab
-  'lacros_sdk_version': '15294.0.0',
+  'lacros_sdk_version': '15295.0.0',
 
   # Generate location tag metadata to include in tests result data uploaded
   # to ResultDB. This isn't needed on some configs and the tool that generates
@@ -304,15 +304,15 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '809e328ed55c2dddbfb2730dc16014edaab7b239',
+  'skia_revision': '9f79e2c50c4fa5bb6f45c090882237903cf705ba',
   # 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': 'bf8535c4da85fd0e7e0efc140299c8a52fec04c3',
+  'v8_revision': '9c53a581a4233fa121c5d4aaf5bc6e3fe2e7fcd5',
   # 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': 'efbccf447128f9027bcdd3dff0167b70938aa57e',
+  'angle_revision': '1afc4d5b4fe796f23bb171bf5535788637bdc38c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -331,7 +331,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Fuchsia sdk
   # and whatever else without interference from each other.
-  'fuchsia_version': 'version:11.20230102.2.1',
+  'fuchsia_version': 'version:11.20230103.0.1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling google-toolbox-for-mac
   # and whatever else without interference from each other.
@@ -383,7 +383,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': '16885b80b3c77fdd9f805acc90efff51767329cf',
+  'devtools_frontend_revision': 'f6fcc24d91d06aa9fb47ffd7a261bbeb076a6212',
   # 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.
@@ -419,7 +419,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': 'da3ea990eb6e7593b6c7b74429720c9949aa1ce1',
+  'dawn_revision': '0f870965df7e14f16d7f59dc93d13587e670c86f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -744,14 +744,8 @@
   },
 
   'src/chrome/test/data/password/captured_sites': {
-    'packages': [
-      {
-        'package': 'chromium/chrome/test/data/password/captured_sites',
-        'version': '9wov5BqIgpBX5S5_U8V_kKNw0tPVWNdPf9ESRYF16R8C',
-      }
-    ],
+    'url': 'https://chrome-internal.googlesource.com/chrome/test/captured_sites/password.git' + '@' + '78d725fdd5d4b247272228d8baa7438ce9400379',
     'condition': 'checkout_chromium_password_manager_test_dependencies',
-    'dep_type': 'cipd',
   },
 
   'src/chrome/test/data/perf/canvas_bench':
@@ -776,7 +770,7 @@
 
   'src/clank': {
     'url': 'https://chrome-internal.googlesource.com/clank/internal/apps.git' + '@' +
-    '6c18464f257201d4529a2929b916059676c21a9c',
+    '54fb2fd8a83a0264f79657cb06fc6755ce5943af',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -965,7 +959,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': '4MVpxj6fO_bPSoLbKyHjcicDLboUXV6_yFVT5JxSfj4C',
+          'version': 'H9Ep8OpANaAxsKa3ESrE0rPns3wq7mko8JxZUGiJTNgC',
       },
     ],
     'condition': 'checkout_android',
@@ -1216,7 +1210,7 @@
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '473dd7d5e2bd61f1dfb900f9c1a4c2c03b134a35',
+      'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '932d1f2719c8b684792a13eda90c28878172fd2d',
     'condition': 'checkout_src_internal',
   },
 
@@ -1830,7 +1824,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '030f44dcf868629f3b5776bd69207d342873ed3d',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '4f74385b4f568df77055f99b04de41557ffd022a',
+    Var('webrtc_git') + '/src.git' + '@' + '0dbce83d1a0a399acfa8e8c8a08590a0b86e4cb9',
 
   # Wuffs' canonical repository is at github.com/google/wuffs, but we use
   # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file.
@@ -1919,7 +1913,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/eche_app/app',
-        'version': 'Xg3c0nAcF9uIrrWVlrctF1UANbKTCdfdRQcOKwQWMtwC',
+        'version': '54ZJUxRhJo3jq4-3RvHM-X8azCp-Iw7oun80E5wiKIIC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -1952,7 +1946,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/projector_app/app',
-        'version': 'ko8b2XAIHTyZan-AXsQ9yu_MOuOBNJgoRbX7CFEe9uAC',
+        'version': '4PAbbqYdyqc5eZow1WtJq4s3LCezhXhQMpIwu8H6PkAC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/ash/webui/file_manager/resources/labs/labs.html b/ash/webui/file_manager/resources/labs/labs.html
index d5c668c..4740962a 100644
--- a/ash/webui/file_manager/resources/labs/labs.html
+++ b/ash/webui/file_manager/resources/labs/labs.html
@@ -89,6 +89,10 @@
     <div theme="refresh23">
       <h2>Refresh23</h2>
 
+      <h3 class="widget-title">Breadcrumb</h3>
+      <xf-breadcrumb path="My Files/Downloads"></xf-breadcrumb>
+      <xf-breadcrumb path="My Files/Downloads/AAA/BBB/CCC"></xf-breadcrumb>
+
       <h3 class="widget-title">Tree</h3>
       <xf-tree>
         <xf-tree-item label="Level 1 (2 children)" icon="my_files">
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1
index 9024e0a..01d385a 100644
--- a/build/fuchsia/linux_internal.sdk.sha1
+++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@
-11.20230102.1.1
+11.20230103.1.1
diff --git a/chrome/VERSION b/chrome/VERSION
index 6c44403..5b54a21 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=111
 MINOR=0
-BUILD=5516
+BUILD=5517
 PATCH=0
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 160fdf1..62cd662 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -7348,6 +7348,9 @@
       <message name="IDS_BOOKMARK_FOLDER_CHILD_COUNT" desc="Text description for the number of children of a bookmark folder">
         {NUM_BOOKMARKS, plural, =1 {1 bookmark} other {# bookmarks}}
       </message>
+      <message name="IDS_BOOKMARKS_EDIT_MORE" desc="Tooltip for the menu button in the bookmarks side panel bulk edit mode that shows more actions the user can take on selected bookmarks.">
+        More
+      </message>
 
       <!-- Read Anything strings -->
       <!-- TODO(crbug.com/1266555): Add final strings and make them translateable. -->
@@ -12459,6 +12462,9 @@
       <message name="IDS_DEVICE_LOG_TYPE_GEOLOCATION" desc="Checkbox to enable showing events of type Geolocation">
         Geolocation
       </message>
+      <message name="IDS_DEVICE_LOG_TYPE_EXTENSIONS" desc="Checkbox to enable showing events reported by extensions">
+        Extensions
+      </message>
       <message name="IDS_DEVICE_LOG_FILEINFO" desc="File info checkbox in device event log">
         File Info
       </message>
diff --git a/chrome/app/generated_resources_grd/IDS_BOOKMARKS_EDIT_MORE.png.sha1 b/chrome/app/generated_resources_grd/IDS_BOOKMARKS_EDIT_MORE.png.sha1
new file mode 100644
index 0000000..95a6634
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_BOOKMARKS_EDIT_MORE.png.sha1
@@ -0,0 +1 @@
+745816e3713e38f99ad8359c553390d04d4eaa5d
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_DEVICE_LOG_TYPE_EXTENSIONS.png.sha1 b/chrome/app/generated_resources_grd/IDS_DEVICE_LOG_TYPE_EXTENSIONS.png.sha1
new file mode 100644
index 0000000..fe4e3d0
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_DEVICE_LOG_TYPE_EXTENSIONS.png.sha1
@@ -0,0 +1 @@
+3e5401ed3799e3a6ba68abbd96aefcb393d8af8f
\ No newline at end of file
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index 54cf4c79..dad2da66 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -1907,7 +1907,7 @@
     Aenean
   </message>
   <message name="IDS_SETTINGS_TOPICS_PAGE_FOOTER" translateable="false" desc="Footer with more information at the bottom of the Topics preferences page.">
-    Quisque eu auctor purus, id tempus nulla. Pellentesque porta orci purus. Donec dictum, justo nec ultricies semper, eros mauris varius nibh, sit amet molestie quam arcu id urna. Donec vulputate dui ut lorem egestas, ac sollicitudin metus fermentum.
+    Quisque eu auctor purus, id tempus nulla. Pellentesque porta orci purus. Donec dictum, <ph name="BEGIN_LINK1">&lt;a href="$1" target="_blank"&gt;</ph>justo nec ultricies semper<ph name="LINK_END1">&lt;/a&gt;</ph>, eros mauris varius nibh, <ph name="BEGIN_LINK2">&lt;a href="$2" target="_blank"&gt;</ph>sit amet molestie quam<ph name="LINK_END2">&lt;/a&gt;</ph> arcu id urna. Donec vulputate dui ut lorem egestas, ac sollicitudin metus fermentum.
   </message>
   <message name="IDS_SETTINGS_TOPICS_PAGE_LEARN_MORE_HEADING" translateable="false" desc="Heading on 'Learn more' dialog in the Topics preferences page.">
     Suspendisse sit amet consectetur sapien
@@ -1957,7 +1957,7 @@
     Vivamus non urna sit amet turpis euismod semper. Phasellus sodales turpis ipsum.
   </message>
   <message name="IDS_SETTINGS_FLEDGE_PAGE_FOOTER" translateable="false" desc="Footer with more information at the bottom of the FLEDGE preferences page.">
-    Pellentesque sollicitudin purus sit amet felis fringilla blandit. Donec a eleifend ligula, et fringilla nunc. Vivamus sit amet cursus quam. Etiam ultricies rutrum orci, eget accumsan purus mattis in.
+    Pellentesque sollicitudin purus sit amet felis fringilla blandit. Donec a eleifend ligula, <ph name="BEGIN_LINK1">&lt;a href="$1" target="_blank"&gt;</ph>et fringilla nunc<ph name="LINK_END1">&lt;/a&gt;</ph>. Vivamus sit amet cursus quam. <ph name="BEGIN_LINK2">&lt;a href="$2" target="_blank"&gt;</ph>Etiam ultricies rutrum orci<ph name="LINK_END2">&lt;/a&gt;</ph>, eget accumsan purus mattis in.
   </message>
   <message name="IDS_SETTINGS_FLEDGE_PAGE_LEARN_MORE_HEADING" translateable="false" desc="Heading on 'Learn more' dialog in the FLEDGE preferences page.">
     Nam a ornare ligula, nec auctor enim
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index d5aadbf..091c3e3 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -5685,11 +5685,6 @@
      flag_descriptions::kSidePanelWebViewDescription, kOsDesktop,
      FEATURE_VALUE_TYPE(features::kSidePanelWebView)},
 
-    {flag_descriptions::kUnifiedSidePanelFlagId,
-     flag_descriptions::kUnifiedSidePanelName,
-     flag_descriptions::kUnifiedSidePanelDescription, kOsDesktop,
-     FEATURE_VALUE_TYPE(features::kUnifiedSidePanel)},
-
     {"tab-outlines-in-low-contrast-themes",
      flag_descriptions::kTabOutlinesInLowContrastThemesName,
      flag_descriptions::kTabOutlinesInLowContrastThemesDescription, kOsDesktop,
@@ -7430,6 +7425,10 @@
          search_features::kLauncherFuzzyMatchForOmnibox,
          kLauncherFuzzyMatchForOmniboxVariations,
          "LauncherFuzzyMatchForOmnibox")},
+    {"launcher-system-info-answer-cards",
+     flag_descriptions::kLauncherSystemInfoAnswerCardsName,
+     flag_descriptions::kLauncherSystemInfoAnswerCardsDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(search_features::kLauncherSystemInfoAnswerCards)},
     {"quick-gesture-show-launcher",
      flag_descriptions::kQuickActionShowBubbleLauncherName,
      flag_descriptions::kQuickActionShowBubbleLauncherDescription, kOsCrOS,
diff --git a/chrome/browser/apps/app_deduplication_service/OWNERS b/chrome/browser/apps/app_deduplication_service/OWNERS
index 61c80ca..6e0c459a 100644
--- a/chrome/browser/apps/app_deduplication_service/OWNERS
+++ b/chrome/browser/apps/app_deduplication_service/OWNERS
@@ -1,3 +1,4 @@
+melzhang@chromium.org
 mxcai@chromium.org
 tsergeant@chromium.org
 
diff --git a/chrome/browser/apps/app_preload_service/app_preload_service_unittest.cc b/chrome/browser/apps/app_preload_service/app_preload_service_unittest.cc
index d5c5904..0cab3fa 100644
--- a/chrome/browser/apps/app_preload_service/app_preload_service_unittest.cc
+++ b/chrome/browser/apps/app_preload_service/app_preload_service_unittest.cc
@@ -47,10 +47,10 @@
 
 void FillWebExtras(
     apps::proto::AppProvisioningListAppsResponse_WebExtras* extras,
-    const std::string& manifest_id,
-    const std::string& manifest_url) {
-  extras->set_manifest_id(manifest_id);
+    const std::string& manifest_url,
+    const std::string& original_manifest_url) {
   extras->set_manifest_url(manifest_url);
+  extras->set_original_manifest_url(original_manifest_url);
 }
 
 }  // namespace
@@ -196,11 +196,11 @@
   proto::AppProvisioningListAppsResponse response;
   auto* app = response.add_apps_to_install();
   app->set_name("Peanut Types");
-  app->set_platform(proto::AppProvisioningListAppsResponse::PLATFORM_WEB);
   app->set_install_reason(
       proto::AppProvisioningListAppsResponse::INSTALL_REASON_OEM);
-  FillWebExtras(app->mutable_web_extras(), "https://peanuttypes.com/app",
-                "https://meltingpot.googleusercontent.com/manifest.json");
+  FillWebExtras(app->mutable_web_extras(),
+                "https://meltingpot.googleusercontent.com/manifest.json",
+                "https://peanuttypes.com/app");
 
   url_loader_factory_.AddResponse(
       AppPreloadServerConnector::GetServerUrl().spec(),
@@ -228,11 +228,11 @@
   proto::AppProvisioningListAppsResponse response;
   auto* app = response.add_apps_to_install();
   app->set_name("Peanut Types");
-  app->set_platform(proto::AppProvisioningListAppsResponse::PLATFORM_WEB);
   app->set_install_reason(
       proto::AppProvisioningListAppsResponse::INSTALL_REASON_DEFAULT);
-  FillWebExtras(app->mutable_web_extras(), "https://peanuttypes.com/app",
-                "https://meltingpot.googleusercontent.com/manifest.json");
+  FillWebExtras(app->mutable_web_extras(),
+                "https://meltingpot.googleusercontent.com/manifest.json",
+                "https://peanuttypes.com/app");
 
   url_loader_factory_.AddResponse(
       AppPreloadServerConnector::GetServerUrl().spec(),
@@ -258,11 +258,8 @@
   proto::AppProvisioningListAppsResponse response;
   auto* app = response.add_apps_to_install();
   app->set_name("Peanut Types");
-  app->set_platform(proto::AppProvisioningListAppsResponse::PLATFORM_ANDROID);
   app->set_install_reason(
       proto::AppProvisioningListAppsResponse::INSTALL_REASON_OEM);
-  app->mutable_android_extras()->set_package_name(kPackageName);
-  app->mutable_android_extras()->set_activity_name(kActivityName);
 
   url_loader_factory_.AddResponse(
       AppPreloadServerConnector::GetServerUrl().spec(),
@@ -284,9 +281,11 @@
 
 // TODO(b/261632289): temporarily disabled while refactoring is in progress.
 TEST_F(AppPreloadServiceTest, DISABLED_InstallOverUserApp) {
-  constexpr char kManifestId[] = "https://www.example.com/";
+  constexpr char kManifestId[] = "https://www.peanuttypes.app/";
   constexpr char kManifestUrl[] =
       "https://meltingpot.googleusercontent.com/manifest.json";
+  constexpr char kOriginalManifestUrl[] =
+      "https://peanuttypes.app/manifest.json";
   constexpr char kUserAppName[] = "User Installed App";
 
   auto app_id = web_app::test::InstallDummyWebApp(GetProfile(), kUserAppName,
@@ -296,10 +295,9 @@
   auto* app = response.add_apps_to_install();
 
   app->set_name("OEM Installed app");
-  app->set_platform(proto::AppProvisioningListAppsResponse::PLATFORM_WEB);
   app->set_install_reason(
       proto::AppProvisioningListAppsResponse::INSTALL_REASON_OEM);
-  FillWebExtras(app->mutable_web_extras(), kManifestId, kManifestUrl);
+  FillWebExtras(app->mutable_web_extras(), kManifestUrl, kOriginalManifestUrl);
 
   url_loader_factory_.AddResponse(
       AppPreloadServerConnector::GetServerUrl().spec(),
diff --git a/chrome/browser/apps/app_preload_service/preload_app_definition.cc b/chrome/browser/apps/app_preload_service/preload_app_definition.cc
index a706f7f1..797fc89 100644
--- a/chrome/browser/apps/app_preload_service/preload_app_definition.cc
+++ b/chrome/browser/apps/app_preload_service/preload_app_definition.cc
@@ -12,15 +12,13 @@
   return app_proto_.name();
 }
 
+// TODO(b/263437253): fix up once supporting libraries are in place.
 AppType PreloadAppDefinition::GetPlatform() const {
-  switch (app_proto_.platform()) {
-    case proto::AppProvisioningListAppsResponse::PLATFORM_UNKNOWN:
-      return AppType::kUnknown;
-    case proto::AppProvisioningListAppsResponse::PLATFORM_WEB:
-      return AppType::kWeb;
-    case proto::AppProvisioningListAppsResponse::PLATFORM_ANDROID:
-      return AppType::kArc;
+  if (app_proto_.has_web_extras()) {
+    return AppType::kWeb;
   }
+
+  return AppType::kUnknown;
 }
 
 bool PreloadAppDefinition::IsOemApp() const {
@@ -28,12 +26,6 @@
          proto::AppProvisioningListAppsResponse::INSTALL_REASON_OEM;
 }
 
-std::string PreloadAppDefinition::GetWebAppManifestId() const {
-  DCHECK_EQ(GetPlatform(), AppType::kWeb);
-
-  return app_proto_.web_extras().manifest_id();
-}
-
 GURL PreloadAppDefinition::GetWebAppManifestUrl() const {
   DCHECK_EQ(GetPlatform(), AppType::kWeb);
 
@@ -54,7 +46,6 @@
 
   if (app.GetPlatform() == AppType::kWeb) {
     os << "- Web Extras:" << std::endl;
-    os << "  - Manifest ID: " << app.GetWebAppManifestId() << std::endl;
     os << "  - Manifest URL: " << app.GetWebAppManifestUrl() << std::endl;
     os << "  - Original Manifest URL: " << app.GetWebAppOriginalManifestUrl()
        << std::endl;
diff --git a/chrome/browser/apps/app_preload_service/preload_app_definition.h b/chrome/browser/apps/app_preload_service/preload_app_definition.h
index e2c49e7b..cdb3dd9c 100644
--- a/chrome/browser/apps/app_preload_service/preload_app_definition.h
+++ b/chrome/browser/apps/app_preload_service/preload_app_definition.h
@@ -30,13 +30,6 @@
   AppType GetPlatform() const;
   bool IsOemApp() const;
 
-  // Returns the Web App manifest ID for the app, which is the canonical
-  // identifier for this app, as specified by
-  // https://www.w3.org/TR/appmanifest/#id-member. Does not attempt to validate
-  // the value returned. Must only be called if `GetPlatform()` returns
-  // `AppType::kWeb`.
-  std::string GetWebAppManifestId() const;
-
   // Returns the Web App manifest URL for the app, which hosts the manifest of
   // the app in a JSON format. The URL could point to a local file, or a web
   // address. Does not attempt to validate the GURL. Must only be called if
diff --git a/chrome/browser/apps/app_preload_service/preload_app_definition_unittest.cc b/chrome/browser/apps/app_preload_service/preload_app_definition_unittest.cc
index 7ffa611d..e268f19 100644
--- a/chrome/browser/apps/app_preload_service/preload_app_definition_unittest.cc
+++ b/chrome/browser/apps/app_preload_service/preload_app_definition_unittest.cc
@@ -21,7 +21,7 @@
 proto::AppProvisioningListAppsResponse_App CreateTestWebApp() {
   proto::AppProvisioningListAppsResponse_App app;
   app.set_name("Test app");
-  app.set_platform(proto::AppProvisioningListAppsResponse::PLATFORM_WEB);
+  app.mutable_web_extras()->set_manifest_url("https://example.com");
   return app;
 }
 }  // namespace
@@ -57,8 +57,8 @@
 TEST_F(PreloadAppDefinitionTest, GetPlatform) {
   proto::AppProvisioningListAppsResponse_App app;
 
-  app.set_platform(proto::AppProvisioningListAppsResponse_Platform::
-                       AppProvisioningListAppsResponse_Platform_PLATFORM_WEB);
+  app.mutable_web_extras()->set_manifest_url("https://example.com");
+
   auto app_def = PreloadAppDefinition(app);
   ASSERT_EQ(app_def.GetPlatform(), AppType::kWeb);
 }
@@ -90,25 +90,6 @@
   ASSERT_FALSE(app_def.IsOemApp());
 }
 
-TEST_F(PreloadAppDefinitionTest, GetWebAppManifestId) {
-  proto::AppProvisioningListAppsResponse_App app = CreateTestWebApp();
-  app.mutable_web_extras()->set_manifest_id(
-      "https://www.example.com/manifest_id/");
-
-  PreloadAppDefinition app_def(app);
-
-  ASSERT_EQ(app_def.GetWebAppManifestId(),
-            "https://www.example.com/manifest_id/");
-}
-
-TEST_F(PreloadAppDefinitionTest, GetWebAppManifestIdNotSpecified) {
-  proto::AppProvisioningListAppsResponse_App app = CreateTestWebApp();
-
-  PreloadAppDefinition app_def(app);
-
-  ASSERT_TRUE(app_def.GetWebAppManifestId().empty());
-}
-
 TEST_F(PreloadAppDefinitionTest, GetWebAppManifestUrlWebsite) {
   proto::AppProvisioningListAppsResponse_App app = CreateTestWebApp();
   app.mutable_web_extras()->set_manifest_url(
@@ -146,8 +127,9 @@
   ASSERT_FALSE(app_def.GetWebAppManifestUrl().is_valid());
 }
 
-TEST_F(PreloadAppDefinitionTest, GetWebAppManifestUrlNotSpecified) {
+TEST_F(PreloadAppDefinitionTest, GetWebAppManifestUrlEmpty) {
   proto::AppProvisioningListAppsResponse_App app = CreateTestWebApp();
+  app.mutable_web_extras()->set_manifest_url("");
 
   PreloadAppDefinition app_def(app);
 
diff --git a/chrome/browser/apps/app_preload_service/proto/app_provisioning.proto b/chrome/browser/apps/app_preload_service/proto/app_provisioning.proto
index 070c15a3..346155f 100644
--- a/chrome/browser/apps/app_preload_service/proto/app_provisioning.proto
+++ b/chrome/browser/apps/app_preload_service/proto/app_provisioning.proto
@@ -36,6 +36,25 @@
     USERTYPE_GUEST = 4;
   }
 
+  enum Channel {
+    // Default for deserialization when an unexpected value is encountered.
+    // Indicates to the client that the server has a new platform and needs
+    // the proto file updated.
+    CHANNEL_UNKNOWN = 0;
+
+    // Canary channel.
+    CHANNEL_CANARY = 1;
+
+    // Developer channel.
+    CHANNEL_DEV = 2;
+
+    // Beta channel.
+    CHANNEL_BETA = 3;
+
+    // Stable channel.
+    CHANNEL_STABLE = 4;
+  }
+
   // The board identifier for the device sending the request.
   optional string board = 1;
 
@@ -64,6 +83,9 @@
 
     // Chrome OS platform version.
     optional string platform = 2;
+
+    // The channel the device is using.
+    optional Channel channel = 3;
   }
 
   // The type of user account making this request.
@@ -74,19 +96,6 @@
   // A list of zero or more apps for APS to install.
   repeated App apps_to_install = 1;
 
-  enum Platform {
-    // Default for deserialization when an unexpected value is encountered.
-    // Indicates to the client that the server has a new platform and needs
-    // the proto file updated.
-    PLATFORM_UNKNOWN = 0;
-
-    // A Web App.
-    PLATFORM_WEB = 1;
-
-    // An Android app managed by Play.
-    PLATFORM_ANDROID = 2;
-  }
-
   enum InstallReason {
     // Default for deserialization when an unexpected value is encountered.
     // Indicates to the client that the server has a new reason and needs
@@ -116,49 +125,42 @@
     optional bool is_masking_allowed = 4;
   }
 
-  // Every platform has its own [Platform]Extras message to store platform
-  // specific metadata.
   // For Android-only metadata.
-  message AndroidExtras {
-    // |package_name| and |activity_name| uniquely identify each Android app.
-    optional string package_name = 1;
-    optional string activity_name = 2;
-  }
+  message AndroidExtras {}
 
   // For Web-only metadata.
   message WebExtras {
-    // |manifest_id| uniquely identifies a web app.
-    optional string manifest_id = 1;
-
     // A URL to the web app's manifest in json format. This will always be from
     // the host meltingpot.googleusercontent.com.
-    optional string manifest_url = 2;
+    optional string manifest_url = 1;
 
     // The URL for the original source used to retrieve the contents of the
     // manifest above. This is needed to resolve the file on the client-side.
-    optional string original_manifest_url = 3;
+    optional string original_manifest_url = 2;
   }
 
   message App {
+    // The primary key for the installer. This will always be of the format
+    // "platform:primary_key". For now we support "android:package_name" and
+    // "web:http://manifest/id".
+    optional string package_id = 1;
+
     // The identifier for the App Group that Fondue used to derive this app
     // instance in the response.
     // Note: this may not be unique in the apps_to_install collection.
-    optional string app_group_uuid = 1;
+    optional string app_group_uuid = 2;
 
     // The App's UTF-8 encoded name in the requested language (or next best).
-    optional string name = 2;
+    optional string name = 3;
 
     // One or more Icons for this App for the requested language (or next best).
-    repeated Icon icons = 3;
-
-    // Specifies the platform this app uses to install. This will match the
-    // contents of the extras.
-    optional Platform platform = 4;
+    repeated Icon icons = 4;
 
     // The reason why this app is in the list.
     optional InstallReason install_reason = 5;
 
-    // Platform-specific information for installing this app.
+    // Every platform has its own [Platform]Extras message to store platform
+    // specific metadata.
     oneof extras {
       AndroidExtras android_extras = 6;
       WebExtras web_extras = 7;
diff --git a/chrome/browser/apps/app_preload_service/web_app_preload_installer.cc b/chrome/browser/apps/app_preload_service/web_app_preload_installer.cc
index 138de70..412455fd 100644
--- a/chrome/browser/apps/app_preload_service/web_app_preload_installer.cc
+++ b/chrome/browser/apps/app_preload_service/web_app_preload_installer.cc
@@ -126,10 +126,12 @@
                      weak_ptr_factory_.GetWeakPtr(), app, std::move(callback)));
 }
 
+// TODO(b/263437253): fix up once supporting libraries are in place.
 std::string WebAppPreloadInstaller::GetAppId(
     const PreloadAppDefinition& app) const {
   // The app's "Web app manifest ID" is the equivalent of the unhashed app ID.
-  return web_app::GenerateAppIdFromUnhashed(app.GetWebAppManifestId());
+  // return web_app::GenerateAppIdFromUnhashed(app.GetWebAppManifestId());
+  return "";
 }
 
 void WebAppPreloadInstaller::InstallAppImpl(
diff --git a/chrome/browser/apps/app_preload_service/web_app_preload_installer_unittest.cc b/chrome/browser/apps/app_preload_service/web_app_preload_installer_unittest.cc
index fccffe1..2461e18 100644
--- a/chrome/browser/apps/app_preload_service/web_app_preload_installer_unittest.cc
+++ b/chrome/browser/apps/app_preload_service/web_app_preload_installer_unittest.cc
@@ -49,12 +49,10 @@
 
   proto::AppProvisioningListAppsResponse_App app;
   app.set_name("Test app");
-  app.set_platform(proto::AppProvisioningListAppsResponse::PLATFORM_WEB);
   app.set_install_reason(
       proto::AppProvisioningListAppsResponse::INSTALL_REASON_OEM);
 
   auto* web_extras = app.mutable_web_extras();
-  web_extras->set_manifest_id("https://www.example.com/home");
   web_extras->set_manifest_url("https://www.example.com/home");
 
   base::test::TestFuture<bool> result;
@@ -71,33 +69,16 @@
   ASSERT_TRUE(found);
 }
 
-TEST_F(WebAppPreloadInstallerTest, InstallFailure) {
-  WebAppPreloadInstaller installer(profile());
-
-  proto::AppProvisioningListAppsResponse_App app;
-  app.set_name("Test app");
-  app.set_platform(proto::AppProvisioningListAppsResponse::PLATFORM_WEB);
-  app.set_install_reason(
-      proto::AppProvisioningListAppsResponse::INSTALL_REASON_OEM);
-
-  // Installation should fail due to missing web_extras field.
-  base::test::TestFuture<bool> result;
-  installer.InstallApp(PreloadAppDefinition(app), result.GetCallback());
-  ASSERT_FALSE(result.Get());
-}
-
 // TODO(b/261632289): temporarily disabled while refactoring is in progress.
 TEST_F(WebAppPreloadInstallerTest, DISABLED_InstallWithManifestId) {
   WebAppPreloadInstaller installer(profile());
 
   proto::AppProvisioningListAppsResponse_App app;
   app.set_name("Test app");
-  app.set_platform(proto::AppProvisioningListAppsResponse::PLATFORM_WEB);
   app.set_install_reason(
       proto::AppProvisioningListAppsResponse::INSTALL_REASON_OEM);
 
   auto* web_extras = app.mutable_web_extras();
-  web_extras->set_manifest_id("https://www.example.com/app");
   web_extras->set_manifest_url("https://www.example.com/manifest.json");
 
   base::test::TestFuture<bool> result;
@@ -127,12 +108,10 @@
 
   proto::AppProvisioningListAppsResponse_App app;
   app.set_name("OEM Installed app");
-  app.set_platform(proto::AppProvisioningListAppsResponse::PLATFORM_WEB);
   app.set_install_reason(
       proto::AppProvisioningListAppsResponse::INSTALL_REASON_OEM);
 
   auto* web_extras = app.mutable_web_extras();
-  web_extras->set_manifest_id(kStartUrl);
   web_extras->set_manifest_url(kManifestUrl);
 
   base::test::TestFuture<bool> result;
@@ -147,12 +126,11 @@
   ASSERT_TRUE(found);
 }
 
-TEST_F(WebAppPreloadInstallerTest, GetAppId) {
+// TODO(b/263437253): fix up once supporting libraries are in place.
+TEST_F(WebAppPreloadInstallerTest, DISABLED_GetAppId) {
   WebAppPreloadInstaller installer(profile());
 
   proto::AppProvisioningListAppsResponse_App app;
-  app.set_platform(proto::AppProvisioningListAppsResponse::PLATFORM_WEB);
-  app.mutable_web_extras()->set_manifest_id("https://cursive.apps.chrome/");
 
   ASSERT_EQ(installer.GetAppId(PreloadAppDefinition(app)),
             "apignacaigpffemhdbhmnajajaccbckh");
diff --git a/chrome/browser/apps/app_service/app_icon/app_icon_reader.h b/chrome/browser/apps/app_service/app_icon/app_icon_reader.h
index 0f9e792..6f2e8886 100644
--- a/chrome/browser/apps/app_service/app_icon/app_icon_reader.h
+++ b/chrome/browser/apps/app_service/app_icon/app_icon_reader.h
@@ -22,8 +22,6 @@
 
 // AppIconReader reads app icons from the icon image files in the local
 // disk and provides an ImageSkia for UI code to use.
-//
-// TODO(crbug.com/1380608): Implement the icon reading function.
 class AppIconReader {
  public:
   explicit AppIconReader(Profile* profile);
diff --git a/chrome/browser/apps/app_service/app_icon/app_icon_util.cc b/chrome/browser/apps/app_service/app_icon/app_icon_util.cc
index c9de4f00..dc707c8 100644
--- a/chrome/browser/apps/app_service/app_icon/app_icon_util.cc
+++ b/chrome/browser/apps/app_service/app_icon/app_icon_util.cc
@@ -19,6 +19,8 @@
 // Template for the icon name.
 constexpr char kIconNameTemplate[] = "%d.png";
 constexpr char kMaskableIconNameTemplate[] = "mask_%d.png";
+constexpr char kForegroundIconNameTemplate[] = "foreground_%d.png";
+constexpr char kBackgroundIconNameTemplate[] = "background_%d.png";
 
 }  // namespace
 
@@ -40,6 +42,28 @@
       .AppendASCII(icon_file_name);
 }
 
+base::FilePath GetForegroundIconPath(const base::FilePath& base_path,
+                                     const std::string& app_id,
+                                     int32_t icon_size_in_px) {
+  auto icon_file_name =
+      base::StringPrintf(kForegroundIconNameTemplate, icon_size_in_px);
+  return base_path.AppendASCII(kAppService)
+      .AppendASCII(kIcon)
+      .AppendASCII(app_id)
+      .AppendASCII(icon_file_name);
+}
+
+base::FilePath GetBackgroundIconPath(const base::FilePath& base_path,
+                                     const std::string& app_id,
+                                     int32_t icon_size_in_px) {
+  auto icon_file_name =
+      base::StringPrintf(kBackgroundIconNameTemplate, icon_size_in_px);
+  return base_path.AppendASCII(kAppService)
+      .AppendASCII(kIcon)
+      .AppendASCII(app_id)
+      .AppendASCII(icon_file_name);
+}
+
 IconValuePtr ReadOnBackgroundThread(const base::FilePath& base_path,
                                     const std::string& app_id,
                                     int32_t icon_size_in_px) {
diff --git a/chrome/browser/apps/app_service/app_icon/app_icon_util.h b/chrome/browser/apps/app_service/app_icon/app_icon_util.h
index d512948f..8f59454 100644
--- a/chrome/browser/apps/app_service/app_icon/app_icon_util.h
+++ b/chrome/browser/apps/app_service/app_icon/app_icon_util.h
@@ -64,13 +64,25 @@
   return a;
 }
 
-// Constructs path to an app icon file for the given `app_id` and
+// Constructs the path to an app icon file for the given `app_id` and
 // `icon_size_in_px`.
 base::FilePath GetIconPath(const base::FilePath& base_path,
                            const std::string& app_id,
                            int32_t icon_size_in_px,
                            bool is_maskable_icon);
 
+// Constructs the path to an app foreground icon file for the given `app_id` and
+// `icon_size_in_px`.
+base::FilePath GetForegroundIconPath(const base::FilePath& base_path,
+                                     const std::string& app_id,
+                                     int32_t icon_size_in_px);
+
+// Constructs the path to an app background icon file for the given `app_id` and
+// `icon_size_in_px`.
+base::FilePath GetBackgroundIconPath(const base::FilePath& base_path,
+                                     const std::string& app_id,
+                                     int32_t icon_size_in_px);
+
 // Reads one single icon file for the given `app_id` and `icon_size_in_px`, and
 // returns the compressed icon. If there is a maskable icon file, reads the
 // maskable icon file. Otherwise, reads other icon file. If there is no
diff --git a/chrome/browser/apps/app_service/app_icon/app_icon_writer.cc b/chrome/browser/apps/app_service/app_icon/app_icon_writer.cc
index 118f673..2b71d0e6 100644
--- a/chrome/browser/apps/app_service/app_icon/app_icon_writer.cc
+++ b/chrome/browser/apps/app_service/app_icon/app_icon_writer.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/apps/app_service/app_icon/app_icon_writer.h"
 
+#include "base/containers/span.h"
 #include "base/files/file_util.h"
 #include "base/task/thread_pool.h"
 #include "chrome/browser/apps/app_service/app_icon/app_icon_util.h"
@@ -14,37 +15,55 @@
 
 namespace {
 
-void WriteIconFile(const base::FilePath& base_path,
-                   const std::string& app_id,
-                   int32_t icon_size_in_px,
-                   bool is_maskable_icon,
-                   const std::vector<uint8_t>& icon_data) {
-  if (icon_data.empty()) {
-    return;
+bool WriteIconFiles(const base::FilePath& base_path,
+                    const std::string& app_id,
+                    int32_t icon_size_in_px,
+                    apps::IconValuePtr iv) {
+  if (!iv || iv->icon_type != apps::IconType::kCompressed) {
+    return false;
   }
 
-  const auto icon_path =
-      apps::GetIconPath(base_path, app_id, icon_size_in_px, is_maskable_icon);
+  if (!iv->foreground_icon_png_data.empty() &&
+      !iv->background_icon_png_data.empty()) {
+    // For the adaptive icon, write the foreground and background icon data to
+    // the local files.
+    const auto foreground_icon_path =
+        apps::GetForegroundIconPath(base_path, app_id, icon_size_in_px);
+    const auto background_icon_path =
+        apps::GetBackgroundIconPath(base_path, app_id, icon_size_in_px);
+    if (!base::CreateDirectory(foreground_icon_path.DirName()) ||
+        !base::CreateDirectory(background_icon_path.DirName())) {
+      return false;
+    }
+
+    auto foreground_icon_data = base::make_span(
+        &iv->foreground_icon_png_data[0], iv->foreground_icon_png_data.size());
+    auto background_icon_data = base::make_span(
+        &iv->background_icon_png_data[0], iv->background_icon_png_data.size());
+    return base::WriteFile(foreground_icon_path, foreground_icon_data) &&
+           base::WriteFile(background_icon_path, background_icon_data);
+  }
+
+  if (iv->compressed.empty()) {
+    return false;
+  }
+
+  const auto icon_path = apps::GetIconPath(base_path, app_id, icon_size_in_px,
+                                           iv->is_maskable_icon);
   if (!base::CreateDirectory(icon_path.DirName())) {
-    return;
+    return false;
   }
 
-  base::WriteFile(icon_path, reinterpret_cast<const char*>(&icon_data[0]),
-                  icon_data.size());
+  auto icon_data = base::make_span(&iv->compressed[0], iv->compressed.size());
+  return base::WriteFile(icon_path, icon_data);
 }
 
 }  // namespace
 
 namespace apps {
 
-AppIconWriter::Key::Key(const std::string& app_id,
-                        int32_t size_in_dip,
-                        IconEffects icon_effects,
-                        IconType icon_type)
-    : app_id_(app_id),
-      size_in_dip_(size_in_dip),
-      icon_effects_(icon_effects),
-      icon_type_(icon_type) {}
+AppIconWriter::Key::Key(const std::string& app_id, int32_t size_in_dip)
+    : app_id_(app_id), size_in_dip_(size_in_dip) {}
 
 AppIconWriter::Key::~Key() = default;
 
@@ -52,13 +71,7 @@
   if (this->app_id_ != other.app_id_) {
     return this->app_id_ < other.app_id_;
   }
-  if (this->size_in_dip_ != other.size_in_dip_) {
-    return this->size_in_dip_ < other.size_in_dip_;
-  }
-  if (this->icon_effects_ != other.icon_effects_) {
-    return this->icon_effects_ < other.icon_effects_;
-  }
-  return this->icon_type_ < other.icon_type_;
+  return this->size_in_dip_ < other.size_in_dip_;
 }
 
 AppIconWriter::PendingResult::PendingResult() = default;
@@ -74,40 +87,31 @@
 void AppIconWriter::InstallIcon(AppPublisher* publisher,
                                 const std::string& app_id,
                                 int32_t size_in_dip,
-                                IconEffects icon_effects,
-                                IconType icon_type,
                                 base::OnceCallback<void(bool)> callback) {
   DCHECK(publisher);
 
-  if (icon_type == IconType::kUnknown) {
-    std::move(callback).Run(false);
-    return;
-  }
-
-  Key key(app_id, size_in_dip, icon_effects, icon_type);
+  Key key(app_id, size_in_dip);
   auto it = pending_results_.find(key);
   if (it != pending_results_.end()) {
     it->second.callbacks.push_back(std::move(callback));
     return;
   }
 
-  PendingResult pending_result;
+  pending_results_[Key(app_id, size_in_dip)].callbacks.push_back(
+      std::move(callback));
+  it = pending_results_.find(key);
+
   std::set<ui::ResourceScaleFactor> scale_factors;
-  if (icon_type == IconType::kCompressed &&
-      icon_effects == apps::IconEffects::kNone) {
-    scale_factors.insert(ui::GetSupportedResourceScaleFactor(
-        apps_util::GetPrimaryDisplayUIScaleFactor()));
-  } else {
-    for (auto scale_factor : ui::GetSupportedResourceScaleFactors()) {
-      scale_factors.insert(scale_factor);
-    }
+  // For the adaptive icon, we need to get the raw icon data for all scale
+  // factors to convert to the uncompressed icon, then generate the adaptive
+  // icon with both the foreground and the background icon files. Since we don't
+  // know whether the icon is an adaptive icon, we always get the raw icon data
+  // for all scale factors.
+  for (auto scale_factor : ui::GetSupportedResourceScaleFactors()) {
+    it->second.scale_factors.insert(scale_factor);
+    scale_factors.insert(scale_factor);
   }
 
-  pending_result.callbacks.push_back(std::move(callback));
-  pending_result.scale_factors = scale_factors;
-
-  pending_results_[Key(app_id, size_in_dip, icon_effects, icon_type)] =
-      std::move(pending_result);
   for (auto scale_factor : scale_factors) {
     auto pending_results_it = pending_results_.find(key);
     if (pending_results_it == pending_results_.end()) {
@@ -117,28 +121,26 @@
       return;
     }
 
-    pending_results_it->second.scale_factors.insert(scale_factor);
     publisher->GetCompressedIconData(
         app_id, size_in_dip, scale_factor,
         base::BindOnce(&AppIconWriter::OnIconLoad,
                        weak_ptr_factory_.GetWeakPtr(), app_id, size_in_dip,
-                       icon_effects, icon_type, scale_factor));
+                       scale_factor));
   }
 }
 
 void AppIconWriter::OnIconLoad(const std::string& app_id,
                                int32_t size_in_dip,
-                               IconEffects icon_effects,
-                               IconType icon_type,
                                ui::ResourceScaleFactor scale_factor,
                                IconValuePtr iv) {
-  auto it =
-      pending_results_.find(Key(app_id, size_in_dip, icon_effects, icon_type));
+  auto it = pending_results_.find(Key(app_id, size_in_dip));
   if (it == pending_results_.end()) {
     return;
   }
 
-  if (!iv || iv->icon_type != IconType::kCompressed || iv->compressed.empty()) {
+  if (!iv || iv->icon_type != IconType::kCompressed ||
+      (iv->compressed.empty() && iv->foreground_icon_png_data.empty() &&
+       iv->background_icon_png_data.empty())) {
     for (auto& callback : it->second.callbacks) {
       std::move(callback).Run(false);
     }
@@ -146,50 +148,37 @@
     return;
   }
 
-  if (it->second.scale_factors.find(scale_factor) ==
-      it->second.scale_factors.end()) {
-    // If the getting icon request for `scale_factor` has been removed (e.g. the
-    // compressed icon data has been written to the local disk), we can call
-    // OnWriteIconFile directly and don't need to call OnWriteIconFile to write
-    // the icon data.
-    OnWriteIconFile(app_id, size_in_dip, icon_effects, icon_type, scale_factor,
-                    std::move(iv));
-    return;
-  }
-
-  std::vector<uint8_t> icon_data = iv->compressed;
-  bool is_maskable_icon = iv->is_maskable_icon;
-  base::ThreadPool::PostTaskAndReply(
+  base::ThreadPool::PostTaskAndReplyWithResult(
       FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE},
       base::BindOnce(
-          &WriteIconFile, profile_->GetPath(), app_id,
+          &WriteIconFiles, profile_->GetPath(), app_id,
           apps_util::ConvertDipToPxForScale(size_in_dip, scale_factor),
-          is_maskable_icon, std::move(icon_data)),
+          std::move(iv)),
       base::BindOnce(&AppIconWriter::OnWriteIconFile,
                      weak_ptr_factory_.GetWeakPtr(), app_id, size_in_dip,
-                     icon_effects, icon_type, scale_factor, std::move(iv)));
+                     scale_factor));
 }
 
 void AppIconWriter::OnWriteIconFile(const std::string& app_id,
                                     int32_t size_in_dip,
-                                    IconEffects icon_effects,
-                                    IconType icon_type,
                                     ui::ResourceScaleFactor scale_factor,
-                                    IconValuePtr iv) {
-  auto it =
-      pending_results_.find(Key(app_id, size_in_dip, icon_effects, icon_type));
+                                    bool ret) {
+  auto it = pending_results_.find(Key(app_id, size_in_dip));
   if (it == pending_results_.end()) {
     return;
   }
 
-  it->second.scale_factors.erase(scale_factor);
-  if (!it->second.scale_factors.empty()) {
+  it->second.complete_scale_factors.insert(scale_factor);
+  if (it->second.scale_factors != it->second.complete_scale_factors) {
     // There are other icon fetching requests, so wait for other icon data.
     return;
   }
 
+  // The icon fetching requests have returned for all scale factors, so we can
+  // call callbacks to return the result, and remove the icon request from
+  // `pending_results_`.
   for (auto& callback : it->second.callbacks) {
-    std::move(callback).Run(true);
+    std::move(callback).Run(ret);
   }
 
   pending_results_.erase(it);
diff --git a/chrome/browser/apps/app_service/app_icon/app_icon_writer.h b/chrome/browser/apps/app_service/app_icon/app_icon_writer.h
index 05496f3e..5959ead 100644
--- a/chrome/browser/apps/app_service/app_icon/app_icon_writer.h
+++ b/chrome/browser/apps/app_service/app_icon/app_icon_writer.h
@@ -23,8 +23,6 @@
 class AppPublisher;
 
 // AppIconWriter writes app icons to the icon image files in the local disk.
-//
-// TODO(crbug.com/1380608): Implement the icon writing function.
 class AppIconWriter {
  public:
   explicit AppIconWriter(Profile* profile);
@@ -38,8 +36,6 @@
   void InstallIcon(AppPublisher* publisher,
                    const std::string& app_id,
                    int32_t size_in_dip,
-                   IconEffects icon_effects,
-                   IconType icon_type,
                    base::OnceCallback<void(bool)> callback);
 
  private:
@@ -47,10 +43,7 @@
   // it can be the "K" in a "map<K, V>".
   class Key {
    public:
-    Key(const std::string& app_id,
-        int32_t size_in_dip,
-        IconEffects icon_effects,
-        IconType icon_type);
+    Key(const std::string& app_id, int32_t size_in_dip);
 
     Key(const Key&) = delete;
     Key& operator=(const Key&) = delete;
@@ -64,8 +57,6 @@
 
     std::string app_id_;
     int32_t size_in_dip_;
-    IconEffects icon_effects_;
-    IconType icon_type_;
   };
 
   // Contains the scale factors and the callback for the compressed app icon
@@ -81,24 +72,32 @@
     PendingResult(PendingResult&&);
     PendingResult& operator=(PendingResult&&);
 
+    // The requested scale factors for the icon requests with `app_id` and
+    // `size_in_dip`.
     std::set<ui::ResourceScaleFactor> scale_factors;
+
+    // The finished icon requested for scale factors. E.g. the icon data for the
+    // scale factor(k100Percent) has been fetched, and saved in the icon file,
+    // and the icon data for the scale factor(k200Percent) has not been fetched.
+    // Then we have:
+    // scale_factors = {k100Percent, k200Percent}
+    // complete_scale_factors = {k100Percent}
+    std::set<ui::ResourceScaleFactor> complete_scale_factors;
+
+    // The callbacks for the icon requests with `app_id` and `size_in_dip`.
     std::vector<base::OnceCallback<void(bool)>> callbacks;
   };
 
   // Saves the compressed icon data in `iv` to the local disk.
   void OnIconLoad(const std::string& app_id,
                   int32_t size_in_dip,
-                  IconEffects icon_effects,
-                  IconType icon_type,
                   ui::ResourceScaleFactor scale_factor,
                   IconValuePtr iv);
 
   void OnWriteIconFile(const std::string& app_id,
                        int32_t size_in_dip,
-                       IconEffects icon_effects,
-                       IconType icon_type,
                        ui::ResourceScaleFactor scale_factor,
-                       IconValuePtr iv);
+                       bool ret);
 
   const raw_ptr<Profile> profile_;
 
diff --git a/chrome/browser/apps/app_service/app_icon/web_app_icon_unittest.cc b/chrome/browser/apps/app_service/app_icon/web_app_icon_unittest.cc
index a4cfc96..f55ebc2e 100644
--- a/chrome/browser/apps/app_service/app_icon/web_app_icon_unittest.cc
+++ b/chrome/browser/apps/app_service/app_icon/web_app_icon_unittest.cc
@@ -1021,6 +1021,28 @@
     return result.Take();
   }
 
+  // Call LoadIconFromIconKey twice with icon_key1 and icon_key2, to verify the
+  // icon loading process can handle the icon loading request multiple times
+  // with the different icon keys.
+  std::vector<apps::IconValuePtr> MultipleLoadIconFromIconKeys(
+      const std::string& app_id,
+      const IconKey& icon_key1,
+      const IconKey& icon_key2,
+      IconType icon_type) {
+    base::test::TestFuture<std::vector<apps::IconValuePtr>> result;
+    auto barrier_callback =
+        base::BarrierCallback<apps::IconValuePtr>(2, result.GetCallback());
+
+    app_service_proxy().LoadIconFromIconKey(
+        AppType::kWeb, app_id, icon_key1, icon_type, kSizeInDip,
+        /*allow_placeholder_icon=*/false, barrier_callback);
+    app_service_proxy().LoadIconFromIconKey(
+        AppType::kWeb, app_id, icon_key2, icon_type, kSizeInDip,
+        /*allow_placeholder_icon=*/false, barrier_callback);
+
+    return result.Take();
+  }
+
   AppServiceProxy& app_service_proxy() { return *proxy_; }
 
  private:
@@ -1066,6 +1088,95 @@
       src_data, *LoadIconFromIconKey(app_id, icon_key, IconType::kCompressed));
 }
 
+// Verify AppIconWriter when write icon files multiple times for compressed
+// icons with icon effects and without icon effects separately.
+TEST_F(AppServiceWebAppIconTest, GetNonMaskableCompressedIconDatasSeparately) {
+  auto web_app = web_app::test::CreateWebApp();
+  const std::string app_id = web_app->app_id();
+
+  const float scale1 = 1.0;
+  const float scale2 = 2.0;
+  const int kIconSize1 = kSizeInDip * scale1;
+  const int kIconSize2 = kSizeInDip * scale2;
+  const std::vector<int> sizes_px{kIconSize1, kIconSize2};
+  const std::vector<SkColor> colors{SK_ColorGREEN, SK_ColorYELLOW};
+  WriteIcons(app_id, {IconPurpose::ANY}, sizes_px, colors);
+
+  web_app->SetDownloadedIconSizes(IconPurpose::ANY, sizes_px);
+  RegisterApp(std::move(web_app));
+
+  ASSERT_TRUE(icon_manager().HasIcons(app_id, IconPurpose::ANY, sizes_px));
+
+  apps::ScaleToSize scale_to_size_in_px = {{1.0, kIconSize1},
+                                           {2.0, kIconSize2}};
+
+  std::vector<uint8_t> src_data1;
+  GenerateWebAppCompressedIcon(app_id, IconPurpose::ANY,
+                               apps::IconEffects::kNone, sizes_px,
+                               scale_to_size_in_px, scale1, src_data1);
+
+  std::vector<uint8_t> src_data2;
+  GenerateWebAppCompressedIcon(app_id, IconPurpose::ANY,
+                               apps::IconEffects::kRoundCorners, sizes_px,
+                               scale_to_size_in_px, scale1, src_data2);
+
+  // Verify the icon reading and writing function in AppService for the
+  // compressed icon without icon effects.
+  VerifyCompressedIcon(src_data1, *LoadIconFromIconKey(app_id, IconKey(),
+                                                       IconType::kCompressed));
+
+  // Verify the icon reading and writing function in AppService for the
+  // compressed icon with icon effects.
+  IconKey icon_key;
+  icon_key.icon_effects = apps::IconEffects::kRoundCorners;
+  VerifyCompressedIcon(
+      src_data2, *LoadIconFromIconKey(app_id, icon_key, IconType::kCompressed));
+}
+
+// Verify AppIconWriter when write icon files multiple times for compressed
+// icons with icon effects and without icon effects at the same time.
+TEST_F(AppServiceWebAppIconTest, GetNonMaskableCompressedIconDatas) {
+  auto web_app = web_app::test::CreateWebApp();
+  const std::string app_id = web_app->app_id();
+
+  const float scale1 = 1.0;
+  const float scale2 = 2.0;
+  const int kIconSize1 = kSizeInDip * scale1;
+  const int kIconSize2 = kSizeInDip * scale2;
+  const std::vector<int> sizes_px{kIconSize1, kIconSize2};
+  const std::vector<SkColor> colors{SK_ColorGREEN, SK_ColorYELLOW};
+  WriteIcons(app_id, {IconPurpose::ANY}, sizes_px, colors);
+
+  web_app->SetDownloadedIconSizes(IconPurpose::ANY, sizes_px);
+  RegisterApp(std::move(web_app));
+
+  ASSERT_TRUE(icon_manager().HasIcons(app_id, IconPurpose::ANY, sizes_px));
+
+  apps::ScaleToSize scale_to_size_in_px = {{1.0, kIconSize1},
+                                           {2.0, kIconSize2}};
+
+  std::vector<uint8_t> src_data1;
+  GenerateWebAppCompressedIcon(app_id, IconPurpose::ANY,
+                               apps::IconEffects::kNone, sizes_px,
+                               scale_to_size_in_px, scale1, src_data1);
+
+  std::vector<uint8_t> src_data2;
+  GenerateWebAppCompressedIcon(app_id, IconPurpose::ANY,
+                               apps::IconEffects::kRoundCorners, sizes_px,
+                               scale_to_size_in_px, scale1, src_data2);
+
+  // Verify the icon reading and writing function in AppService at the same time
+  // for the compressed icons with and without icon effects.
+  IconKey icon_key;
+  icon_key.icon_effects = apps::IconEffects::kRoundCorners;
+  auto ret = MultipleLoadIconFromIconKeys(app_id, IconKey(), icon_key,
+                                          IconType::kCompressed);
+
+  ASSERT_EQ(2U, ret.size());
+  VerifyCompressedIcon(src_data1, *ret[0]);
+  VerifyCompressedIcon(src_data2, *ret[1]);
+}
+
 TEST_F(AppServiceWebAppIconTest, GetNonMaskableStandardIconData) {
   auto web_app = web_app::test::CreateWebApp();
   const std::string app_id = web_app->app_id();
diff --git a/chrome/browser/apps/app_service/app_service_proxy_ash.cc b/chrome/browser/apps/app_service/app_service_proxy_ash.cc
index 71c4fdae..4070a72 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_ash.cc
+++ b/chrome/browser/apps/app_service/app_service_proxy_ash.cc
@@ -725,7 +725,7 @@
     }
 
     icon_writer_.InstallIcon(
-        publisher, app_id, size_in_dip, icon_effects, icon_type,
+        publisher, app_id, size_in_dip,
         base::BindOnce(&AppServiceProxyAsh::OnIconInstalled,
                        weak_ptr_factory_.GetWeakPtr(), app_id, size_in_dip,
                        icon_effects, icon_type, std::move(callback)));
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn
index 3415462..d5abfd9 100644
--- a/chrome/browser/ash/BUILD.gn
+++ b/chrome/browser/ash/BUILD.gn
@@ -1271,6 +1271,8 @@
     "fusebox/fusebox_errno.h",
     "fusebox/fusebox_moniker.cc",
     "fusebox/fusebox_moniker.h",
+    "fusebox/fusebox_read_writer.cc",
+    "fusebox/fusebox_read_writer.h",
     "fusebox/fusebox_server.cc",
     "fusebox/fusebox_server.h",
     "game_mode/game_mode_controller.cc",
diff --git a/chrome/browser/ash/app_list/app_list_model_updater.h b/chrome/browser/ash/app_list/app_list_model_updater.h
index ba9cb898..ff813f50 100644
--- a/chrome/browser/ash/app_list/app_list_model_updater.h
+++ b/chrome/browser/ash/app_list/app_list_model_updater.h
@@ -11,7 +11,6 @@
 
 #include "ash/public/cpp/app_list/app_list_types.h"
 #include "base/callback_forward.h"
-#include "base/containers/flat_map.h"
 #include "chrome/browser/ash/app_list/app_list_model_updater_observer.h"
 #include "chrome/browser/ash/app_list/app_list_syncable_service.h"
 #include "chrome/browser/ash/app_list/chrome_app_list_item.h"
@@ -103,10 +102,6 @@
   virtual ChromeAppListItem* ItemAtForTest(size_t index) = 0;
   virtual ChromeAppListItem* FindFolderItem(const std::string& folder_id) = 0;
   virtual bool FindItemIndexForTest(const std::string& id, size_t* index) = 0;
-  using GetIdToAppListIndexMapCallback =
-      base::OnceCallback<void(const base::flat_map<std::string, uint16_t>&)>;
-  virtual void GetIdToAppListIndexMap(GetIdToAppListIndexMapCallback callback) {
-  }
   // Returns a position which is before the first item in the item list.
   virtual syncer::StringOrdinal GetPositionBeforeFirstItem() const = 0;
 
diff --git a/chrome/browser/ash/app_list/chrome_app_list_model_updater.cc b/chrome/browser/ash/app_list/chrome_app_list_model_updater.cc
index eb9ba069f..9cd8a1ef 100644
--- a/chrome/browser/ash/app_list/chrome_app_list_model_updater.cc
+++ b/chrome/browser/ash/app_list/chrome_app_list_model_updater.cc
@@ -533,15 +533,6 @@
   return search_engine_is_google_;
 }
 
-void ChromeAppListModelUpdater::GetIdToAppListIndexMap(
-    GetIdToAppListIndexMapCallback callback) {
-  base::flat_map<std::string, uint16_t> id_to_app_list_index;
-  for (size_t i = 0; i < model_.top_level_item_list()->item_count(); ++i) {
-    id_to_app_list_index[model_.top_level_item_list()->item_at(i)->id()] = i;
-  }
-  std::move(callback).Run(id_to_app_list_index);
-}
-
 size_t ChromeAppListModelUpdater::BadgedItemCount() {
   return item_manager_->BadgedItemCount();
 }
diff --git a/chrome/browser/ash/app_list/chrome_app_list_model_updater.h b/chrome/browser/ash/app_list/chrome_app_list_model_updater.h
index 11bd639..bb04b93 100644
--- a/chrome/browser/ash/app_list/chrome_app_list_model_updater.h
+++ b/chrome/browser/ash/app_list/chrome_app_list_model_updater.h
@@ -94,7 +94,6 @@
   ChromeAppListItem* FindFolderItem(const std::string& folder_id) override;
   bool FindItemIndexForTest(const std::string& id, size_t* index) override;
   bool SearchEngineIsGoogle() override;
-  void GetIdToAppListIndexMap(GetIdToAppListIndexMapCallback callback) override;
   size_t BadgedItemCount() override;
   void GetContextMenuModel(const std::string& id,
                            ash::AppListItemContext item_context,
diff --git a/chrome/browser/ash/app_list/search/app_search_data_source.cc b/chrome/browser/ash/app_list/search/app_search_data_source.cc
index 0ade7e8b..68ab9909 100644
--- a/chrome/browser/ash/app_list/search/app_search_data_source.cc
+++ b/chrome/browser/ash/app_list/search/app_search_data_source.cc
@@ -269,8 +269,7 @@
   Refresh();
 }
 
-SearchProvider::Results AppSearchDataSource::GetRecommendations(
-    const base::flat_map<std::string, uint16_t>& id_to_app_list_index) {
+SearchProvider::Results AppSearchDataSource::GetRecommendations() {
   SearchProvider::Results recommendations;
   std::set<std::string> handled_results;
 
diff --git a/chrome/browser/ash/app_list/search/app_search_data_source.h b/chrome/browser/ash/app_list/search/app_search_data_source.h
index acadd3e6..4959f7b 100644
--- a/chrome/browser/ash/app_list/search/app_search_data_source.h
+++ b/chrome/browser/ash/app_list/search/app_search_data_source.h
@@ -10,7 +10,6 @@
 #include <vector>
 
 #include "base/callback_list.h"
-#include "base/containers/flat_map.h"
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_forward.h"
 #include "chrome/browser/ash/app_list/search/search_provider.h"
@@ -58,8 +57,7 @@
   void RefreshIfNeeded();
 
   // Returns app recommendations (zero-state search results).
-  SearchProvider::Results GetRecommendations(
-      const base::flat_map<std::string, uint16_t>& id_to_app_list_index);
+  SearchProvider::Results GetRecommendations();
 
   // Returns app results that match `query`. It uses exact matching algorithm.
   SearchProvider::Results GetExactMatches(const std::u16string& query);
diff --git a/chrome/browser/ash/app_list/search/app_search_provider_test_base.cc b/chrome/browser/ash/app_list/search/app_search_provider_test_base.cc
index c70ba08..8f608a6e 100644
--- a/chrome/browser/ash/app_list/search/app_search_provider_test_base.cc
+++ b/chrome/browser/ash/app_list/search/app_search_provider_test_base.cc
@@ -25,7 +25,6 @@
 #include "chrome/browser/ash/app_list/search/app_zero_state_provider.h"
 #include "chrome/browser/ash/app_list/search/search_provider.h"
 #include "chrome/browser/ash/app_list/search/test/test_search_controller.h"
-#include "chrome/browser/ash/app_list/test/fake_app_list_model_updater.h"
 #include "chrome/browser/ash/app_list/test/test_app_list_controller_delegate.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/test/base/testing_profile.h"
@@ -45,8 +44,6 @@
 void AppSearchProviderTestBase::SetUp() {
   AppListTestBase::SetUp();
 
-  model_updater_ = std::make_unique<FakeAppListModelUpdater>(
-      /*profile=*/nullptr, /*reorder_delegate=*/nullptr);
   controller_ = std::make_unique<::test::TestAppListControllerDelegate>();
   ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
 }
@@ -58,8 +55,7 @@
 
   std::unique_ptr<SearchProvider> app_search;
   if (zero_state_provider_) {
-    app_search = std::make_unique<AppZeroStateProvider>(data_source_.get(),
-                                                        model_updater_.get());
+    app_search = std::make_unique<AppZeroStateProvider>(data_source_.get());
   } else {
     app_search = std::make_unique<AppSearchProvider>(data_source_.get());
   }
diff --git a/chrome/browser/ash/app_list/search/app_search_provider_test_base.h b/chrome/browser/ash/app_list/search/app_search_provider_test_base.h
index 60c6491..8f39203 100644
--- a/chrome/browser/ash/app_list/search/app_search_provider_test_base.h
+++ b/chrome/browser/ash/app_list/search/app_search_provider_test_base.h
@@ -15,8 +15,6 @@
 #include "chrome/browser/ash/app_list/search/chrome_search_result.h"
 #include "extensions/common/mojom/manifest.mojom.h"
 
-class FakeAppListModelUpdater;
-
 namespace test {
 class TestAppListControllerDelegate;
 }
@@ -87,7 +85,6 @@
 
   base::SimpleTestClock clock_;
   base::ScopedTempDir temp_dir_;
-  std::unique_ptr<FakeAppListModelUpdater> model_updater_;
   std::unique_ptr<TestSearchController> search_controller_;
   std::unique_ptr<AppSearchDataSource> data_source_;
   SearchProvider* app_search_ = nullptr;
diff --git a/chrome/browser/ash/app_list/search/app_zero_state_provider.cc b/chrome/browser/ash/app_list/search/app_zero_state_provider.cc
index 61bd802f..7f1513703 100644
--- a/chrome/browser/ash/app_list/search/app_zero_state_provider.cc
+++ b/chrome/browser/ash/app_list/search/app_zero_state_provider.cc
@@ -4,22 +4,15 @@
 
 #include "chrome/browser/ash/app_list/search/app_zero_state_provider.h"
 
-#include <string>
-#include <utility>
-
-#include "ash/public/cpp/app_list/app_list_features.h"
-#include "base/bind.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/time/time.h"
-#include "chrome/browser/ash/app_list/app_list_model_updater.h"
 #include "chrome/browser/ash/app_list/search/app_search_data_source.h"
 #include "chrome/browser/ash/app_list/search/chrome_search_result.h"
 
 namespace app_list {
 
-AppZeroStateProvider::AppZeroStateProvider(AppSearchDataSource* data_source,
-                                           AppListModelUpdater* model_updater)
-    : data_source_(data_source), model_updater_(model_updater) {
+AppZeroStateProvider::AppZeroStateProvider(AppSearchDataSource* data_source)
+    : data_source_(data_source) {
   // NOTE: Unlike AppSearchProvider, AppZeroStateProvider does not have to
   // update search model when app status, or other app information changes. The
   // recent apps UI implementation updates app representations independently of
@@ -34,30 +27,16 @@
 AppZeroStateProvider::~AppZeroStateProvider() = default;
 
 void AppZeroStateProvider::StartZeroState() {
+  base::TimeTicks query_start_time = base::TimeTicks::Now();
   data_source_->RefreshIfNeeded();
-  UpdateResults();
+  SearchProvider::Results new_results = data_source_->GetRecommendations();
+  UMA_HISTOGRAM_TIMES("Apps.AppList.AppSearchProvider.ZeroStateLatency",
+                      base::TimeTicks::Now() - query_start_time);
+  SwapResults(&new_results);
 }
 
 ash::AppListSearchResultType AppZeroStateProvider::ResultType() const {
   return ash::AppListSearchResultType::kZeroStateApp;
 }
 
-void AppZeroStateProvider::UpdateRecommendedResults(
-    const base::flat_map<std::string, uint16_t>& id_to_app_list_index) {
-  SearchProvider::Results new_results =
-      data_source_->GetRecommendations(id_to_app_list_index);
-  UMA_HISTOGRAM_TIMES("Apps.AppList.AppSearchProvider.ZeroStateLatency",
-                      base::TimeTicks::Now() - query_start_time_);
-
-  SwapResults(&new_results);
-}
-
-void AppZeroStateProvider::UpdateResults() {
-  // Get the map of app ids to their position in the app list, and then
-  // update results.
-  // Unretained is safe because the callback gets called synchronously.
-  model_updater_->GetIdToAppListIndexMap(base::BindOnce(
-      &AppZeroStateProvider::UpdateRecommendedResults, base::Unretained(this)));
-}
-
 }  // namespace app_list
diff --git a/chrome/browser/ash/app_list/search/app_zero_state_provider.h b/chrome/browser/ash/app_list/search/app_zero_state_provider.h
index 06a2ac8d..bfb5c5f 100644
--- a/chrome/browser/ash/app_list/search/app_zero_state_provider.h
+++ b/chrome/browser/ash/app_list/search/app_zero_state_provider.h
@@ -5,24 +5,15 @@
 #ifndef CHROME_BROWSER_ASH_APP_LIST_SEARCH_APP_ZERO_STATE_PROVIDER_H_
 #define CHROME_BROWSER_ASH_APP_LIST_SEARCH_APP_ZERO_STATE_PROVIDER_H_
 
-#include <memory>
-#include <string>
-
-#include "base/containers/flat_map.h"
-#include "base/memory/weak_ptr.h"
-#include "base/time/time.h"
 #include "chrome/browser/ash/app_list/search/search_provider.h"
 
-class AppListModelUpdater;
-
 namespace app_list {
 
 class AppSearchDataSource;
 
 class AppZeroStateProvider : public SearchProvider {
  public:
-  AppZeroStateProvider(AppSearchDataSource* data_source,
-                       AppListModelUpdater* model_updater);
+  explicit AppZeroStateProvider(AppSearchDataSource* data_source);
 
   AppZeroStateProvider(const AppZeroStateProvider&) = delete;
   AppZeroStateProvider& operator=(const AppZeroStateProvider&) = delete;
@@ -34,18 +25,7 @@
   ash::AppListSearchResultType ResultType() const override;
 
  private:
-  void UpdateResults();
-
-  // Updates the zero-state app recommendations ("recent apps").
-  void UpdateRecommendedResults(
-      const base::flat_map<std::string, uint16_t>& id_to_app_list_index);
-
   AppSearchDataSource* const data_source_;
-  AppListModelUpdater* const model_updater_;
-
-  base::TimeTicks query_start_time_;
-
-  base::WeakPtrFactory<AppZeroStateProvider> weak_ptr_factory_{this};
 };
 
 }  // namespace app_list
diff --git a/chrome/browser/ash/app_list/search/search_controller_factory.cc b/chrome/browser/ash/app_list/search/search_controller_factory.cc
index 4107643..eec29cbe 100644
--- a/chrome/browser/ash/app_list/search/search_controller_factory.cc
+++ b/chrome/browser/ash/app_list/search/search_controller_factory.cc
@@ -70,7 +70,7 @@
   controller->AddProvider(std::make_unique<AppSearchProvider>(
       controller->GetAppSearchDataSource()));
   controller->AddProvider(std::make_unique<AppZeroStateProvider>(
-      controller->GetAppSearchDataSource(), model_updater));
+      controller->GetAppSearchDataSource()));
 
   if (crosapi::browser_util::IsLacrosEnabled()) {
     controller->AddProvider(std::make_unique<OmniboxLacrosProvider>(
diff --git a/chrome/browser/ash/app_list/search/search_features.cc b/chrome/browser/ash/app_list/search/search_features.cc
index e86954f7..c55d411 100644
--- a/chrome/browser/ash/app_list/search/search_features.cc
+++ b/chrome/browser/ash/app_list/search/search_features.cc
@@ -29,6 +29,10 @@
              "LauncherImageSearch",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+BASE_FEATURE(kLauncherSystemInfoAnswerCards,
+             "LauncherSystemInfoAnswerCards",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 bool IsLauncherGameSearchEnabled() {
   return base::FeatureList::IsEnabled(kLauncherGameSearch) ||
          chromeos::features::IsCloudGamingDeviceEnabled();
@@ -50,4 +54,8 @@
   return base::FeatureList::IsEnabled(kLauncherImageSearch);
 }
 
+bool isLauncherSystemInfoAnswerCardsEnabled() {
+  return base::FeatureList::IsEnabled(kLauncherSystemInfoAnswerCards);
+}
+
 }  // namespace search_features
diff --git a/chrome/browser/ash/app_list/search/search_features.h b/chrome/browser/ash/app_list/search/search_features.h
index 16e5e39..1711777 100644
--- a/chrome/browser/ash/app_list/search/search_features.h
+++ b/chrome/browser/ash/app_list/search/search_features.h
@@ -25,12 +25,14 @@
 // Enables image search in the launcher.
 BASE_DECLARE_FEATURE(kLauncherImageSearch);
 
+BASE_DECLARE_FEATURE(kLauncherSystemInfoAnswerCards);
+
 bool IsLauncherGameSearchEnabled();
 bool IsLauncherKeywordExtractionScoringEnabled();
 bool IsLauncherQueryFederatedAnalyticsPHHEnabled();
 bool IsLauncherImageSearchEnabled();
-
 bool isLauncherFuzzyMatchForOmniboxEnabled();
+bool isLauncherSystemInfoAnswerCardsEnabled();
 
 }  // namespace search_features
 
diff --git a/chrome/browser/ash/app_list/test/fake_app_list_model_updater.cc b/chrome/browser/ash/app_list/test/fake_app_list_model_updater.cc
index f94ce48a..e2d647d 100644
--- a/chrome/browser/ash/app_list/test/fake_app_list_model_updater.cc
+++ b/chrome/browser/ash/app_list/test/fake_app_list_model_updater.cc
@@ -7,7 +7,6 @@
 #include <utility>
 
 #include "ash/constants/ash_features.h"
-#include "base/containers/flat_map.h"
 #include "base/logging.h"
 #include "base/run_loop.h"
 #include "chrome/browser/ash/app_list/chrome_app_list_item.h"
@@ -160,14 +159,6 @@
   return (item && item->is_folder()) ? item : nullptr;
 }
 
-void FakeAppListModelUpdater::GetIdToAppListIndexMap(
-    GetIdToAppListIndexMapCallback callback) {
-  base::flat_map<std::string, uint16_t> id_to_app_list_index;
-  for (uint16_t i = 0; i < items_.size(); ++i)
-    id_to_app_list_index[items_[i]->id()] = i;
-  std::move(callback).Run(id_to_app_list_index);
-}
-
 syncer::StringOrdinal FakeAppListModelUpdater::GetPositionBeforeFirstItem()
     const {
   return GetPositionBeforeFirstItemInternal(GetTopLevelItems());
diff --git a/chrome/browser/ash/app_list/test/fake_app_list_model_updater.h b/chrome/browser/ash/app_list/test/fake_app_list_model_updater.h
index aaad8fa..dc13be8 100644
--- a/chrome/browser/ash/app_list/test/fake_app_list_model_updater.h
+++ b/chrome/browser/ash/app_list/test/fake_app_list_model_updater.h
@@ -62,7 +62,6 @@
   ChromeAppListItem* ItemAtForTest(size_t index) override;
   ChromeAppListItem* FindFolderItem(const std::string& folder_id) override;
   bool FindItemIndexForTest(const std::string& id, size_t* index) override;
-  void GetIdToAppListIndexMap(GetIdToAppListIndexMapCallback callback) override;
   syncer::StringOrdinal GetPositionBeforeFirstItem() const override;
   void GetContextMenuModel(const std::string& id,
                            ash::AppListItemContext item_context,
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest.cc b/chrome/browser/ash/file_manager/file_manager_browsertest.cc
index 1781f4e..e2cbe60e 100644
--- a/chrome/browser/ash/file_manager/file_manager_browsertest.cc
+++ b/chrome/browser/ash/file_manager/file_manager_browsertest.cc
@@ -1782,17 +1782,25 @@
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
     Search, /* search.js */
     FilesAppBrowserTest,
-    ::testing::Values(TestCase("searchDownloadsWithResults"),
-                      TestCase("searchDownloadsWithNoResults"),
-                      TestCase("searchDownloadsClearSearchKeyDown"),
-                      TestCase("searchDownloadsClearSearch"),
-                      TestCase("searchHidingViaTab"),
-                      TestCase("searchHidingTextEntryField"),
-                      TestCase("searchButtonToggles"),
-                      TestCase("searchOptions").EnableSearchV2()
-                      // TODO(b/189173190): Enable
-                      // TestCase("searchQueryLaunchParam")
-                      ));
+    ::testing::Values(
+        TestCase("searchDownloadsWithResults"),
+        TestCase("searchDownloadsWithResults").EnableSearchV2(),
+        TestCase("searchDownloadsWithNoResults"),
+        TestCase("searchDownloadsWithNoResults").EnableSearchV2(),
+        TestCase("searchDownloadsClearSearchKeyDown"),
+        TestCase("searchDownloadsClearSearchKeyDown").EnableSearchV2(),
+        TestCase("searchDownloadsClearSearch"),
+        TestCase("searchDownloadsClearSearch").EnableSearchV2(),
+        TestCase("searchHidingViaTab"),
+        TestCase("searchHidingViaTab").EnableSearchV2(),
+        TestCase("searchHidingTextEntryField"),
+        TestCase("searchHidingTextEntryField").EnableSearchV2(),
+        TestCase("searchButtonToggles"),
+        TestCase("searchButtonToggles").EnableSearchV2(),
+        TestCase("searchOptions").EnableSearchV2()
+        // TODO(b/189173190): Enable
+        // TestCase("searchQueryLaunchParam")
+        ));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
     Metrics, /* metrics.js */
diff --git a/chrome/browser/ash/fusebox/fusebox_read_writer.cc b/chrome/browser/ash/fusebox/fusebox_read_writer.cc
new file mode 100644
index 0000000..7995baf
--- /dev/null
+++ b/chrome/browser/ash/fusebox/fusebox_read_writer.cc
@@ -0,0 +1,233 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ash/fusebox/fusebox_read_writer.h"
+
+#include "chrome/browser/ash/fusebox/fusebox_errno.h"
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
+#include "net/base/net_errors.h"
+
+namespace fusebox {
+
+namespace {
+
+void RunRead2CallbackFailure(ReadWriter::Read2Callback callback,
+                             base::File::Error error_code) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  Read2ResponseProto response_proto;
+  response_proto.set_posix_error_code(FileErrorToErrno(error_code));
+  std::move(callback).Run(response_proto);
+}
+
+void RunRead2CallbackTypical(ReadWriter::Read2Callback callback,
+                             scoped_refptr<net::IOBuffer> buffer,
+                             int length) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  Read2ResponseProto response_proto;
+  if (length < 0) {
+    response_proto.set_posix_error_code(NetErrorToErrno(length));
+  } else {
+    *response_proto.mutable_data() = std::string(buffer->data(), length);
+  }
+  std::move(callback).Run(response_proto);
+
+  content::GetIOThreadTaskRunner({})->ReleaseSoon(FROM_HERE, std::move(buffer));
+}
+
+void RunWrite2CallbackFailure(ReadWriter::Write2Callback callback,
+                              base::File::Error error_code) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  Write2ResponseProto response_proto;
+  response_proto.set_posix_error_code(FileErrorToErrno(error_code));
+  std::move(callback).Run(response_proto);
+}
+
+void RunWrite2CallbackTypical(ReadWriter::Write2Callback callback, int length) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  Write2ResponseProto response_proto;
+  if (length < 0) {
+    response_proto.set_posix_error_code(NetErrorToErrno(length));
+  }
+  std::move(callback).Run(response_proto);
+}
+
+}  // namespace
+
+ReadWriter::ReadWriter(const storage::FileSystemURL& fs_url) : fs_url_(fs_url) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+}
+
+ReadWriter::~ReadWriter() {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+}
+
+// Some functions (marked with a §) below, take an fs_context argument that
+// looks unused, but we need to keep the storage::FileSystemContext reference
+// alive until the callbacks are run.
+
+void ReadWriter::Read(scoped_refptr<storage::FileSystemContext> fs_context,
+                      int64_t offset,
+                      int64_t length,
+                      Read2Callback callback) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+  DCHECK(!is_in_flight_);
+
+  // See if we can re-use the previous storage::FileStreamReader.
+  std::unique_ptr<storage::FileStreamReader> fs_reader;
+  if (fs_reader_ && (read_offset_ == offset)) {
+    fs_reader = std::move(fs_reader_);
+    read_offset_ = -1;
+  } else {
+    fs_reader = fs_context->CreateFileStreamReader(fs_url_, offset, INT64_MAX,
+                                                   base::Time());
+    if (!fs_reader) {
+      content::GetUIThreadTaskRunner({})->PostTask(
+          FROM_HERE,
+          base::BindOnce(&RunRead2CallbackFailure, std::move(callback),
+                         base::File::Error::FILE_ERROR_INVALID_URL));
+      return;
+    }
+  }
+
+  constexpr int64_t min_length = 256;
+  constexpr int64_t max_length = 262144;  // 256 KiB.
+  scoped_refptr<net::IOBuffer> buffer = base::MakeRefCounted<net::IOBuffer>(
+      std::max(min_length, std::min(max_length, length)));
+
+  // Save the pointer before we std::move fs_reader into a base::OnceCallback.
+  // The std::move keeps the underlying storage::FileStreamReader alive while
+  // any network I/O is pending. Without the std::move, the underlying
+  // storage::FileStreamReader would get destroyed at the end of this function.
+  auto* saved_fs_reader = fs_reader.get();
+
+  is_in_flight_ = true;
+  auto pair = base::SplitOnceCallback(base::BindOnce(
+      &ReadWriter::OnRead, weak_ptr_factory_.GetWeakPtr(), std::move(callback),
+      fs_context, std::move(fs_reader), buffer, offset));
+
+  int result =
+      saved_fs_reader->Read(buffer.get(), length, std::move(pair.first));
+  if (result != net::ERR_IO_PENDING) {  // The read was synchronous.
+    std::move(pair.second).Run(result);
+  }
+}
+
+void ReadWriter::OnRead(
+    base::WeakPtr<ReadWriter> weak_ptr,
+    Read2Callback callback,
+    scoped_refptr<storage::FileSystemContext> fs_context,  // See § above.
+    std::unique_ptr<storage::FileStreamReader> fs_reader,
+    scoped_refptr<net::IOBuffer> buffer,
+    int64_t offset,
+    int length) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+
+  ReadWriter* self = weak_ptr.get();
+  if (!self) {
+    Read2ResponseProto response_proto;
+    response_proto.set_posix_error_code(EBUSY);
+    content::GetUIThreadTaskRunner({})->PostTask(
+        FROM_HERE, base::BindOnce(std::move(callback), response_proto));
+    return;
+  }
+
+  DCHECK(self->is_in_flight_);
+  self->is_in_flight_ = false;
+
+  if (length >= 0) {
+    self->fs_reader_ = std::move(fs_reader);
+    self->read_offset_ = offset + length;
+  } else {
+    self->fs_reader_.reset();
+    self->read_offset_ = -1;
+  }
+
+  content::GetUIThreadTaskRunner({})->PostTask(
+      FROM_HERE, base::BindOnce(&RunRead2CallbackTypical, std::move(callback),
+                                std::move(buffer), length));
+}
+
+void ReadWriter::Write(scoped_refptr<storage::FileSystemContext> fs_context,
+                       scoped_refptr<net::StringIOBuffer> buffer,
+                       int64_t offset,
+                       int length,
+                       Write2Callback callback) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+  DCHECK(!is_in_flight_);
+
+  // See if we can re-use the previous storage::FileStreamWriter.
+  std::unique_ptr<storage::FileStreamWriter> fs_writer;
+  if (fs_writer_ && (write_offset_ == offset)) {
+    fs_writer = std::move(fs_writer_);
+    write_offset_ = -1;
+  } else {
+    fs_writer = fs_context->CreateFileStreamWriter(fs_url_, offset);
+    if (!fs_writer) {
+      content::GetUIThreadTaskRunner({})->PostTask(
+          FROM_HERE,
+          base::BindOnce(&RunWrite2CallbackFailure, std::move(callback),
+                         base::File::Error::FILE_ERROR_INVALID_URL));
+      return;
+    }
+  }
+
+  // Save the pointer before we std::move fs_writer into a base::OnceCallback.
+  // The std::move keeps the underlying storage::FileStreamWriter alive while
+  // any network I/O is pending. Without the std::move, the underlying
+  // storage::FileStreamWriter would get destroyed at the end of this function.
+  auto* saved_fs_writer = fs_writer.get();
+
+  is_in_flight_ = true;
+  auto pair = base::SplitOnceCallback(base::BindOnce(
+      &ReadWriter::OnWrite, weak_ptr_factory_.GetWeakPtr(), std::move(callback),
+      fs_context, std::move(fs_writer), buffer, offset));
+
+  int result =
+      saved_fs_writer->Write(buffer.get(), length, std::move(pair.first));
+  if (result != net::ERR_IO_PENDING) {  // The write was synchronous.
+    std::move(pair.second).Run(result);
+  }
+}
+
+void ReadWriter::OnWrite(
+    base::WeakPtr<ReadWriter> weak_ptr,
+    Write2Callback callback,
+    scoped_refptr<storage::FileSystemContext> fs_context,  // See § above.
+    std::unique_ptr<storage::FileStreamWriter> fs_writer,
+    scoped_refptr<net::IOBuffer> buffer,
+    int64_t offset,
+    int length) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+
+  ReadWriter* self = weak_ptr.get();
+  if (!self) {
+    Write2ResponseProto response_proto;
+    response_proto.set_posix_error_code(EBUSY);
+    content::GetUIThreadTaskRunner({})->PostTask(
+        FROM_HERE, base::BindOnce(std::move(callback), response_proto));
+    return;
+  }
+
+  DCHECK(self->is_in_flight_);
+  self->is_in_flight_ = false;
+
+  if (length >= 0) {
+    self->fs_writer_ = std::move(fs_writer);
+    self->write_offset_ = offset + length;
+  } else {
+    self->fs_writer_.reset();
+    self->write_offset_ = -1;
+  }
+
+  content::GetUIThreadTaskRunner({})->PostTask(
+      FROM_HERE,
+      base::BindOnce(&RunWrite2CallbackTypical, std::move(callback), length));
+}
+
+}  // namespace fusebox
diff --git a/chrome/browser/ash/fusebox/fusebox_read_writer.h b/chrome/browser/ash/fusebox/fusebox_read_writer.h
new file mode 100644
index 0000000..17de68f1
--- /dev/null
+++ b/chrome/browser/ash/fusebox/fusebox_read_writer.h
@@ -0,0 +1,96 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ASH_FUSEBOX_FUSEBOX_READ_WRITER_H_
+#define CHROME_BROWSER_ASH_FUSEBOX_FUSEBOX_READ_WRITER_H_
+
+#include "base/callback_forward.h"
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/ash/fusebox/fusebox.pb.h"
+#include "net/base/io_buffer.h"
+#include "storage/browser/file_system/file_stream_reader.h"
+#include "storage/browser/file_system/file_stream_writer.h"
+#include "storage/browser/file_system/file_system_context.h"
+
+namespace fusebox {
+
+// Caches a storage::FileStreamReader (and FileStreamWriter) and their offsets
+// so that, when consecutive reads (or consecutive writes) are adjacent (the
+// second one starts where the first one ends), the FileStreamReader (or
+// FileStreamWriter) is re-used.
+//
+// When serving a "stateless" I/O API that passes an offset each time (such as
+// the FUSE API), but the underlying storage::AsyncFileUtil doesn't support
+// seeking, then re-using a cached FileStreamReader can often avoid "Shlemiel
+// the Painter" quadratic performance. See
+// https://wiki.c2.com/?ShlemielThePainter
+//
+// Each ReadWriter instance lives entirely on the I/O thread, but its owner
+// (and the callbacks) must live on the UI thread (and wrap the ReadWriter in a
+// base::SequenceBound).
+//
+// The owner is also responsible for ensuring that only one operation is in
+// flight at any one time. "An operation" starts with a Read or Write call and
+// ends just before the corresponding callback is run.
+class ReadWriter {
+ public:
+  using Read2Callback =
+      base::OnceCallback<void(const Read2ResponseProto& response)>;
+  using Write2Callback =
+      base::OnceCallback<void(const Write2ResponseProto& response)>;
+
+  explicit ReadWriter(const storage::FileSystemURL& fs_url);
+  ~ReadWriter();
+
+  void Read(scoped_refptr<storage::FileSystemContext> fs_context,
+            int64_t offset,
+            int64_t length,
+            Read2Callback callback);
+
+  void Write(scoped_refptr<storage::FileSystemContext> fs_context,
+             scoped_refptr<net::StringIOBuffer> buffer,
+             int64_t offset,
+             int length,
+             Write2Callback callback);
+
+ private:
+  // The OnXxx methods are static (but take a WeakPtr) so that the callback
+  // will run even if the WeakPtr is invalidated.
+
+  static void OnRead(base::WeakPtr<ReadWriter> weak_ptr,
+                     Read2Callback callback,
+                     scoped_refptr<storage::FileSystemContext> fs_context,
+                     std::unique_ptr<storage::FileStreamReader> fs_reader,
+                     scoped_refptr<net::IOBuffer> buffer,
+                     int64_t offset,
+                     int length);
+
+  static void OnWrite(base::WeakPtr<ReadWriter> weak_ptr,
+                      Write2Callback callback,
+                      scoped_refptr<storage::FileSystemContext> fs_context,
+                      std::unique_ptr<storage::FileStreamWriter> fs_writer,
+                      scoped_refptr<net::IOBuffer> buffer,
+                      int64_t offset,
+                      int length);
+
+  const storage::FileSystemURL fs_url_;
+
+  std::unique_ptr<storage::FileStreamReader> fs_reader_;
+  // Unused whenever fs_reader_ is nullptr.
+  int64_t read_offset_ = -1;
+
+  std::unique_ptr<storage::FileStreamWriter> fs_writer_;
+  // Unused whenever fs_writer_ is nullptr.
+  int64_t write_offset_ = -1;
+
+  // TODO(b/255703917): snapshot management.
+
+  bool is_in_flight_ = false;
+
+  base::WeakPtrFactory<ReadWriter> weak_ptr_factory_{this};
+};
+
+}  // namespace fusebox
+
+#endif  // CHROME_BROWSER_ASH_FUSEBOX_FUSEBOX_READ_WRITER_H_
diff --git a/chrome/browser/ash/fusebox/fusebox_server.cc b/chrome/browser/ash/fusebox/fusebox_server.cc
index f42e089..14fbc5a 100644
--- a/chrome/browser/ash/fusebox/fusebox_server.cc
+++ b/chrome/browser/ash/fusebox/fusebox_server.cc
@@ -18,9 +18,11 @@
 #include "chrome/browser/ash/file_manager/fileapi_util.h"
 #include "chrome/browser/ash/file_manager/path_util.h"
 #include "chrome/browser/ash/fusebox/fusebox_errno.h"
+#include "chrome/browser/ash/fusebox/fusebox_read_writer.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
+#include "net/base/io_buffer.h"
 #include "storage/browser/file_system/async_file_util.h"
 #include "storage/browser/file_system/external_mount_points.h"
 #include "storage/browser/file_system/file_system_backend.h"
@@ -292,31 +294,6 @@
           metadata_fields, std::move(outer_callback)));
 }
 
-void RunRead2CallbackFailure(Server::Read2Callback callback,
-                             base::File::Error error_code) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-
-  Read2ResponseProto response_proto;
-  response_proto.set_posix_error_code(FileErrorToErrno(error_code));
-  std::move(callback).Run(response_proto);
-}
-
-void RunRead2CallbackTypical(Server::Read2Callback callback,
-                             scoped_refptr<net::IOBuffer> buffer,
-                             int length) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-
-  Read2ResponseProto response_proto;
-  if (length < 0) {
-    response_proto.set_posix_error_code(NetErrorToErrno(length));
-  } else {
-    *response_proto.mutable_data() = std::string(buffer->data(), length);
-  }
-  std::move(callback).Run(response_proto);
-
-  content::GetIOThreadTaskRunner({})->ReleaseSoon(FROM_HERE, std::move(buffer));
-}
-
 void RunRmDirCallback(
     Server::RmDirCallback callback,
     scoped_refptr<storage::FileSystemContext> fs_context,  // See § above.
@@ -409,25 +386,6 @@
   std::move(callback).Run(response_proto);
 }
 
-void RunWrite2CallbackFailure(Server::Write2Callback callback,
-                              base::File::Error error_code) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-
-  Write2ResponseProto response_proto;
-  response_proto.set_posix_error_code(FileErrorToErrno(error_code));
-  std::move(callback).Run(response_proto);
-}
-
-void RunWrite2CallbackTypical(Server::Write2Callback callback, int length) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-
-  Write2ResponseProto response_proto;
-  if (length < 0) {
-    response_proto.set_posix_error_code(NetErrorToErrno(length));
-  }
-  std::move(callback).Run(response_proto);
-}
-
 void RunStat2Callback(
     Server::Stat2Callback callback,
     scoped_refptr<storage::FileSystemContext> fs_context,  // See § above.
@@ -459,146 +417,6 @@
 
 }  // namespace
 
-Server::ReadWriter::ReadWriter(const storage::FileSystemURL& fs_url)
-    : fs_url_(fs_url) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-}
-
-Server::ReadWriter::~ReadWriter() {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-}
-
-void Server::ReadWriter::Read(
-    scoped_refptr<storage::FileSystemContext> fs_context,
-    int64_t offset,
-    int64_t length,
-    Server::Read2Callback callback) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-
-  // See if we can re-use the previous storage::FileStreamReader.
-  std::unique_ptr<storage::FileStreamReader> fs_reader;
-  if (fs_reader_ && (read_offset_ == offset)) {
-    fs_reader = std::move(fs_reader_);
-    read_offset_ = -1;
-  } else {
-    fs_reader = fs_context->CreateFileStreamReader(fs_url_, offset, INT64_MAX,
-                                                   base::Time());
-    if (!fs_reader) {
-      content::GetUIThreadTaskRunner({})->PostTask(
-          FROM_HERE,
-          base::BindOnce(&RunRead2CallbackFailure, std::move(callback),
-                         base::File::Error::FILE_ERROR_INVALID_URL));
-      return;
-    }
-  }
-
-  constexpr int64_t min_length = 256;
-  constexpr int64_t max_length = 262144;  // 256 KiB.
-  scoped_refptr<net::IOBuffer> buffer = base::MakeRefCounted<net::IOBuffer>(
-      std::max(min_length, std::min(max_length, length)));
-
-  // Save the pointer before we std::move fs_reader into a base::OnceCallback.
-  // The std::move keeps the underlying storage::FileStreamReader alive while
-  // any network I/O is pending. Without the std::move, the underlying
-  // storage::FileStreamReader would get destroyed at the end of this function.
-  auto* saved_fs_reader = fs_reader.get();
-
-  auto pair = base::SplitOnceCallback(base::BindOnce(
-      &Server::ReadWriter::OnRead, weak_ptr_factory_.GetWeakPtr(),
-      std::move(callback), fs_context, std::move(fs_reader), buffer, offset));
-
-  int result =
-      saved_fs_reader->Read(buffer.get(), length, std::move(pair.first));
-  if (result != net::ERR_IO_PENDING) {  // The read was synchronous.
-    std::move(pair.second).Run(result);
-  }
-}
-
-void Server::ReadWriter::OnRead(
-    Server::Read2Callback callback,
-    scoped_refptr<storage::FileSystemContext> fs_context,  // See § above.
-    std::unique_ptr<storage::FileStreamReader> fs_reader,
-    scoped_refptr<net::IOBuffer> buffer,
-    int64_t offset,
-    int length) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-
-  if (length >= 0) {
-    fs_reader_ = std::move(fs_reader);
-    read_offset_ = offset + length;
-  } else {
-    fs_reader_.reset();
-    read_offset_ = -1;
-  }
-
-  content::GetUIThreadTaskRunner({})->PostTask(
-      FROM_HERE, base::BindOnce(&RunRead2CallbackTypical, std::move(callback),
-                                std::move(buffer), length));
-}
-
-void Server::ReadWriter::Write(
-    scoped_refptr<storage::FileSystemContext> fs_context,
-    scoped_refptr<net::StringIOBuffer> buffer,
-    int64_t offset,
-    int length,
-    Server::Write2Callback callback) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-
-  // See if we can re-use the previous storage::FileStreamWriter.
-  std::unique_ptr<storage::FileStreamWriter> fs_writer;
-  if (fs_writer_ && (write_offset_ == offset)) {
-    fs_writer = std::move(fs_writer_);
-    write_offset_ = -1;
-  } else {
-    fs_writer = fs_context->CreateFileStreamWriter(fs_url_, offset);
-    if (!fs_writer) {
-      content::GetUIThreadTaskRunner({})->PostTask(
-          FROM_HERE,
-          base::BindOnce(&RunWrite2CallbackFailure, std::move(callback),
-                         base::File::Error::FILE_ERROR_INVALID_URL));
-      return;
-    }
-  }
-
-  // Save the pointer before we std::move fs_writer into a base::OnceCallback.
-  // The std::move keeps the underlying storage::FileStreamWriter alive while
-  // any network I/O is pending. Without the std::move, the underlying
-  // storage::FileStreamWriter would get destroyed at the end of this function.
-  auto* saved_fs_writer = fs_writer.get();
-
-  auto pair = base::SplitOnceCallback(base::BindOnce(
-      &Server::ReadWriter::OnWrite, weak_ptr_factory_.GetWeakPtr(),
-      std::move(callback), fs_context, std::move(fs_writer), buffer, offset));
-
-  int result =
-      saved_fs_writer->Write(buffer.get(), length, std::move(pair.first));
-  if (result != net::ERR_IO_PENDING) {  // The write was synchronous.
-    std::move(pair.second).Run(result);
-  }
-}
-
-void Server::ReadWriter::OnWrite(
-    Server::Write2Callback callback,
-    scoped_refptr<storage::FileSystemContext> fs_context,
-    std::unique_ptr<storage::FileStreamWriter> fs_writer,
-    scoped_refptr<net::IOBuffer> buffer,
-    int64_t offset,
-    int length) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-
-  if (length >= 0) {
-    fs_writer_ = std::move(fs_writer);
-    write_offset_ = offset + length;
-  } else {
-    fs_writer_.reset();
-    write_offset_ = -1;
-  }
-
-  content::GetUIThreadTaskRunner({})->PostTask(
-      FROM_HERE,
-      base::BindOnce(&RunWrite2CallbackTypical, std::move(callback), length));
-}
-
 Server::FuseFileMapEntry::FuseFileMapEntry(
     scoped_refptr<storage::FileSystemContext> fs_context_arg,
     storage::FileSystemURL fs_url_arg,
@@ -617,7 +435,7 @@
                                        Server::Read2Callback callback) {
   int64_t offset = request.has_offset() ? request.offset() : 0;
   int64_t length = request.has_length() ? request.length() : 0;
-  seqbnd_read_writer_.AsyncCall(&Server::ReadWriter::Read)
+  seqbnd_read_writer_.AsyncCall(&ReadWriter::Read)
       .WithArgs(fs_context_, offset, length, std::move(callback));
 }
 
@@ -631,11 +449,29 @@
   scoped_refptr<net::StringIOBuffer> buffer =
       base::MakeRefCounted<net::StringIOBuffer>(request.data());
   int64_t offset = request.has_offset() ? request.offset() : 0;
-  seqbnd_read_writer_.AsyncCall(&Server::ReadWriter::Write)
+  seqbnd_read_writer_.AsyncCall(&ReadWriter::Write)
       .WithArgs(fs_context_, std::move(buffer), offset,
                 static_cast<int>(request.data().size()), std::move(callback));
 }
 
+void Server::FuseFileMapEntry::Do(PendingOp& op,
+                                  base::WeakPtr<Server> weak_ptr_server,
+                                  uint64_t fuse_handle) {
+  if (absl::holds_alternative<PendingRead2>(op)) {
+    PendingRead2& pending = absl::get<PendingRead2>(op);
+    DoRead2(pending.first,
+            base::BindOnce(&Server::OnRead2, weak_ptr_server, fuse_handle,
+                           std::move(pending.second)));
+  } else if (absl::holds_alternative<PendingWrite2>(op)) {
+    PendingWrite2& pending = absl::get<PendingWrite2>(op);
+    DoWrite2(pending.first,
+             base::BindOnce(&Server::OnWrite2, weak_ptr_server, fuse_handle,
+                            std::move(pending.second)));
+  } else {
+    NOTREACHED();
+  }
+}
+
 Server::PrefixMapEntry::PrefixMapEntry(std::string fs_url_prefix_arg,
                                        bool read_only_arg)
     : fs_url_prefix(fs_url_prefix_arg), read_only(read_only_arg) {}
@@ -787,28 +623,26 @@
     return;
   }
   FuseFileMapEntry& entry = iter->second;
-  base::circular_deque<PendingRead2> pending_reads =
-      std::move(entry.pending_reads_);
-  base::circular_deque<PendingWrite2> pending_writes =
-      std::move(entry.pending_writes_);
+  base::circular_deque<PendingOp> pending_ops = std::move(entry.pending_ops_);
 
   fuse_file_map_.erase(iter);
 
   Close2ResponseProto response_proto;
   std::move(callback).Run(response_proto);
 
-  if (!pending_reads.empty()) {
-    Read2ResponseProto read2_response_proto;
-    read2_response_proto.set_posix_error_code(EBUSY);
-    for (auto& pending_read : pending_reads) {
-      std::move(pending_read.second).Run(read2_response_proto);
-    }
-  }
-  if (!pending_writes.empty()) {
-    Write2ResponseProto write2_esponse_proto;
-    write2_esponse_proto.set_posix_error_code(EBUSY);
-    for (auto& pending_read : pending_writes) {
-      std::move(pending_read.second).Run(write2_esponse_proto);
+  for (auto& pending_op : pending_ops) {
+    if (absl::holds_alternative<PendingRead2>(pending_op)) {
+      Read2ResponseProto read2_response_proto;
+      read2_response_proto.set_posix_error_code(EBUSY);
+      std::move(absl::get<PendingRead2>(pending_op).second)
+          .Run(read2_response_proto);
+    } else if (absl::holds_alternative<PendingWrite2>(pending_op)) {
+      Write2ResponseProto write2_response_proto;
+      write2_response_proto.set_posix_error_code(EBUSY);
+      std::move(absl::get<PendingWrite2>(pending_op).second)
+          .Run(write2_response_proto);
+    } else {
+      NOTREACHED();
     }
   }
 }
@@ -948,12 +782,12 @@
     response_proto.set_posix_error_code(EACCES);
     std::move(callback).Run(response_proto);
     return;
-  } else if (iter->second.has_in_flight_read_) {
-    iter->second.pending_reads_.emplace_back(request_proto,
-                                             std::move(callback));
+  } else if (iter->second.has_in_flight_op_) {
+    iter->second.pending_ops_.emplace_back(
+        PendingRead2(request_proto, std::move(callback)));
     return;
   }
-  iter->second.has_in_flight_read_ = true;
+  iter->second.has_in_flight_op_ = true;
   iter->second.DoRead2(
       request_proto,
       base::BindOnce(&Server::OnRead2, weak_ptr_factory_.GetWeakPtr(),
@@ -1195,12 +1029,12 @@
     response_proto.set_posix_error_code(EMSGSIZE);
     std::move(callback).Run(response_proto);
     return;
-  } else if (iter->second.has_in_flight_write_) {
-    iter->second.pending_writes_.emplace_back(request_proto,
-                                              std::move(callback));
+  } else if (iter->second.has_in_flight_op_) {
+    iter->second.pending_ops_.emplace_back(
+        PendingWrite2(request_proto, std::move(callback)));
     return;
   }
-  iter->second.has_in_flight_write_ = true;
+  iter->second.has_in_flight_op_ = true;
   iter->second.DoWrite2(
       request_proto,
       base::BindOnce(&Server::OnWrite2, weak_ptr_factory_.GetWeakPtr(),
@@ -1322,19 +1156,17 @@
     return;
   }
   FuseFileMapEntry& entry = iter->second;
-  entry.has_in_flight_read_ = false;
+  entry.has_in_flight_op_ = false;
 
   std::move(callback).Run(std::move(response_proto));
 
-  if (entry.pending_reads_.empty()) {
+  if (entry.pending_ops_.empty()) {
     return;
   }
-  PendingRead2 pending = std::move(entry.pending_reads_.front());
-  entry.pending_reads_.pop_front();
-  entry.has_in_flight_read_ = true;
-  entry.DoRead2(pending.first,
-                base::BindOnce(&Server::OnRead2, weak_ptr_factory_.GetWeakPtr(),
-                               fuse_handle, std::move(pending.second)));
+  PendingOp pending_op = std::move(entry.pending_ops_.front());
+  entry.pending_ops_.pop_front();
+  entry.has_in_flight_op_ = true;
+  entry.Do(pending_op, weak_ptr_factory_.GetWeakPtr(), fuse_handle);
 }
 
 void Server::OnReadDirectory(
@@ -1382,20 +1214,17 @@
     return;
   }
   FuseFileMapEntry& entry = iter->second;
-  entry.has_in_flight_write_ = false;
+  entry.has_in_flight_op_ = false;
 
   std::move(callback).Run(std::move(response_proto));
 
-  if (entry.pending_writes_.empty()) {
+  if (entry.pending_ops_.empty()) {
     return;
   }
-  PendingWrite2 pending = std::move(entry.pending_writes_.front());
-  entry.pending_writes_.pop_front();
-  entry.has_in_flight_write_ = true;
-  entry.DoWrite2(
-      pending.first,
-      base::BindOnce(&Server::OnWrite2, weak_ptr_factory_.GetWeakPtr(),
-                     fuse_handle, std::move(pending.second)));
+  PendingOp pending_op = std::move(entry.pending_ops_.front());
+  entry.pending_ops_.pop_front();
+  entry.has_in_flight_op_ = true;
+  entry.Do(pending_op, weak_ptr_factory_.GetWeakPtr(), fuse_handle);
 }
 
 void Server::EraseFuseFileMapEntry(uint64_t fuse_handle) {
diff --git a/chrome/browser/ash/fusebox/fusebox_server.h b/chrome/browser/ash/fusebox/fusebox_server.h
index 3561260bd..d082e09 100644
--- a/chrome/browser/ash/fusebox/fusebox_server.h
+++ b/chrome/browser/ash/fusebox/fusebox_server.h
@@ -17,16 +17,16 @@
 #include "chrome/browser/ash/fusebox/fusebox.pb.h"
 #include "chrome/browser/ash/fusebox/fusebox_moniker.h"
 #include "chrome/browser/ash/fusebox/fusebox_staging.pb.h"
-#include "net/base/io_buffer.h"
 #include "storage/browser/file_system/async_file_util.h"
-#include "storage/browser/file_system/file_stream_reader.h"
-#include "storage/browser/file_system/file_stream_writer.h"
 #include "storage/browser/file_system/file_system_context.h"
+#include "third_party/abseil-cpp/absl/types/variant.h"
 
 class Profile;
 
 namespace fusebox {
 
+class ReadWriter;
+
 class Server {
  public:
   struct Delegate {
@@ -198,49 +198,7 @@
 
   using PendingRead2 = std::pair<Read2RequestProto, Read2Callback>;
   using PendingWrite2 = std::pair<Write2RequestProto, Write2Callback>;
-
-  // Lives entirely on the I/O thread, as enforced by base::SequenceBound.
-  struct ReadWriter {
-    explicit ReadWriter(const storage::FileSystemURL& fs_url);
-    ~ReadWriter();
-
-    void Read(scoped_refptr<storage::FileSystemContext> fs_context,
-              int64_t offset,
-              int64_t length,
-              Server::Read2Callback callback);
-    void OnRead(Server::Read2Callback callback,
-                scoped_refptr<storage::FileSystemContext> fs_context,
-                std::unique_ptr<storage::FileStreamReader> fs_reader,
-                scoped_refptr<net::IOBuffer> buffer,
-                int64_t offset,
-                int length);
-
-    void Write(scoped_refptr<storage::FileSystemContext> fs_context,
-               scoped_refptr<net::StringIOBuffer> buffer,
-               int64_t offset,
-               int length,
-               Server::Write2Callback callback);
-    void OnWrite(Server::Write2Callback callback,
-                 scoped_refptr<storage::FileSystemContext> fs_context,
-                 std::unique_ptr<storage::FileStreamWriter> fs_writer,
-                 scoped_refptr<net::IOBuffer> buffer,
-                 int64_t offset,
-                 int length);
-
-    const storage::FileSystemURL fs_url_;
-
-    std::unique_ptr<storage::FileStreamReader> fs_reader_;
-    // Unused whenever fs_reader_ is nullptr.
-    int64_t read_offset_ = -1;
-
-    std::unique_ptr<storage::FileStreamWriter> fs_writer_;
-    // Unused whenever fs_writer_ is nullptr.
-    int64_t write_offset_ = -1;
-
-    // TODO(b/255703917): snapshot management.
-
-    base::WeakPtrFactory<ReadWriter> weak_ptr_factory_{this};
-  };
+  using PendingOp = absl::variant<PendingRead2, PendingWrite2>;
 
   struct FuseFileMapEntry {
     FuseFileMapEntry(scoped_refptr<storage::FileSystemContext> fs_context_arg,
@@ -252,15 +210,16 @@
 
     void DoRead2(const Read2RequestProto& request, Read2Callback callback);
     void DoWrite2(const Write2RequestProto& request, Write2Callback callback);
+    void Do(PendingOp& op,
+            base::WeakPtr<Server> weak_ptr_server,
+            uint64_t fuse_handle);
 
     const scoped_refptr<storage::FileSystemContext> fs_context_;
     const bool readable_;
     const bool writable_;
 
-    bool has_in_flight_read_ = false;
-    bool has_in_flight_write_ = false;
-    base::circular_deque<PendingRead2> pending_reads_;
-    base::circular_deque<PendingWrite2> pending_writes_;
+    bool has_in_flight_op_ = false;
+    base::circular_deque<PendingOp> pending_ops_;
 
     base::SequenceBound<ReadWriter> seqbnd_read_writer_;
   };
diff --git a/chrome/browser/ash/input_method/candidate_window_controller_impl.cc b/chrome/browser/ash/input_method/candidate_window_controller_impl.cc
index 0bced9b..5f157c1 100644
--- a/chrome/browser/ash/input_method/candidate_window_controller_impl.cc
+++ b/chrome/browser/ash/input_method/candidate_window_controller_impl.cc
@@ -45,7 +45,8 @@
       ash::kShellWindowId_MenuContainer);
   candidate_window_view_ = new ui::ime::CandidateWindowView(parent);
   candidate_window_view_->AddObserver(this);
-  candidate_window_view_->SetCursorBounds(cursor_bounds_, composition_head_);
+  candidate_window_view_->SetCursorAndCompositionBounds(cursor_bounds_,
+                                                        composition_bounds_);
   views::Widget* widget = candidate_window_view_->InitWidget();
   widget->AddObserver(this);
   widget->Show();
@@ -60,9 +61,9 @@
     infolist_window_->HideImmediately();
 }
 
-void CandidateWindowControllerImpl::SetCursorBounds(
+void CandidateWindowControllerImpl::SetCursorAndCompositionBounds(
     const gfx::Rect& cursor_bounds,
-    const gfx::Rect& composition_head) {
+    const gfx::Rect& composition_bounds) {
   // A workaround for http://crosbug.com/6460. We should ignore very short Y
   // move to prevent the window from shaking up and down.
   const int kKeepPositionThreshold = 2;  // px
@@ -78,11 +79,12 @@
   }
 
   cursor_bounds_ = cursor_bounds;
-  composition_head_ = composition_head;
+  composition_bounds_ = composition_bounds;
 
   // Remember the cursor bounds.
   if (candidate_window_view_)
-    candidate_window_view_->SetCursorBounds(cursor_bounds, composition_head);
+    candidate_window_view_->SetCursorAndCompositionBounds(cursor_bounds,
+                                                          composition_bounds);
 }
 
 gfx::Rect CandidateWindowControllerImpl::GetCursorBounds() const {
diff --git a/chrome/browser/ash/input_method/candidate_window_controller_impl.h b/chrome/browser/ash/input_method/candidate_window_controller_impl.h
index 1f60839..30beec0 100644
--- a/chrome/browser/ash/input_method/candidate_window_controller_impl.h
+++ b/chrome/browser/ash/input_method/candidate_window_controller_impl.h
@@ -64,8 +64,9 @@
   void OnWidgetClosing(views::Widget* widget) override;
 
   // IMECandidateWindowHandlerInterface implementation.
-  void SetCursorBounds(const gfx::Rect& cursor_bounds,
-                       const gfx::Rect& composition_head) override;
+  void SetCursorAndCompositionBounds(
+      const gfx::Rect& cursor_bounds,
+      const gfx::Rect& composition_bounds) override;
   gfx::Rect GetCursorBounds() const override;
   void HideLookupTable() override;
   void UpdateLookupTable(const ui::CandidateWindow& candidate_window) override;
@@ -85,7 +86,7 @@
   bool is_focused_ = false;
 
   gfx::Rect cursor_bounds_;
-  gfx::Rect composition_head_;
+  gfx::Rect composition_bounds_;
 
   // The infolist entries and its focused index which currently shown in
   // Infolist window.
diff --git a/chrome/browser/ash/input_method/ui/candidate_window_view.cc b/chrome/browser/ash/input_method/ui/candidate_window_view.cc
index eb36a8e..a013ade 100644
--- a/chrome/browser/ash/input_method/ui/candidate_window_view.cc
+++ b/chrome/browser/ash/input_method/ui/candidate_window_view.cc
@@ -373,10 +373,11 @@
       base::UTF8ToUTF16(candidate_window_.auxiliary_text()));
 }
 
-void CandidateWindowView::SetCursorBounds(const gfx::Rect& cursor_bounds,
-                                          const gfx::Rect& composition_head) {
+void CandidateWindowView::SetCursorAndCompositionBounds(
+    const gfx::Rect& cursor_bounds,
+    const gfx::Rect& composition_bounds) {
   if (candidate_window_.show_window_at_composition())
-    SetAnchorRect(composition_head);
+    SetAnchorRect(composition_bounds);
   else
     SetAnchorRect(cursor_bounds);
 }
diff --git a/chrome/browser/ash/input_method/ui/candidate_window_view.h b/chrome/browser/ash/input_method/ui/candidate_window_view.h
index f6bc632d..df2e12f 100644
--- a/chrome/browser/ash/input_method/ui/candidate_window_view.h
+++ b/chrome/browser/ash/input_method/ui/candidate_window_view.h
@@ -74,8 +74,8 @@
   // Candidates are arranged per |orientation|.
   void UpdateCandidates(const ui::CandidateWindow& candidate_window);
 
-  void SetCursorBounds(const gfx::Rect& cursor_bounds,
-                       const gfx::Rect& composition_head);
+  void SetCursorAndCompositionBounds(const gfx::Rect& cursor_bounds,
+                                     const gfx::Rect& composition_bounds);
 
  private:
   friend class CandidateWindowViewTest;
diff --git a/chrome/browser/ash/power/ml/adaptive_screen_brightness_manager.cc b/chrome/browser/ash/power/ml/adaptive_screen_brightness_manager.cc
index afaafca..cd8ffab9 100644
--- a/chrome/browser/ash/power/ml/adaptive_screen_brightness_manager.cc
+++ b/chrome/browser/ash/power/ml/adaptive_screen_brightness_manager.cc
@@ -51,15 +51,8 @@
 // Returns nullopt if no suitable browsers are found.
 Browser* GetFocusedOrTopmostVisibleBrowser() {
   Browser* topmost_browser = nullptr;
-  Browser* browser = nullptr;
-  BrowserList* browser_list = BrowserList::GetInstance();
-  DCHECK(browser_list);
 
-  for (auto browser_iterator =
-           browser_list->begin_browsers_ordered_by_activation();
-       browser_iterator != browser_list->end_browsers_ordered_by_activation();
-       ++browser_iterator) {
-    browser = *browser_iterator;
+  for (Browser* browser : BrowserList::GetInstance()->OrderedByActivation()) {
     if (browser->profile()->IsOffTheRecord() || !browser->window()->IsVisible())
       continue;
 
@@ -67,7 +60,7 @@
       return browser;
 
     if (!topmost_browser)
-      topmost_browser = *browser_iterator;
+      topmost_browser = browser;
   }
   if (topmost_browser)
     return topmost_browser;
diff --git a/chrome/browser/ash/power/ml/user_activity_manager.cc b/chrome/browser/ash/power/ml/user_activity_manager.cc
index 9c285df..c4d7e83 100644
--- a/chrome/browser/ash/power/ml/user_activity_manager.cc
+++ b/chrome/browser/ash/power/ml/user_activity_manager.cc
@@ -568,18 +568,10 @@
 }
 
 TabProperty UserActivityManager::UpdateOpenTabURL() {
-  BrowserList* browser_list = BrowserList::GetInstance();
-  DCHECK(browser_list);
-
   TabProperty property;
 
   // Find the active tab in the visible focused or topmost browser.
-  for (auto browser_iterator =
-           browser_list->begin_browsers_ordered_by_activation();
-       browser_iterator != browser_list->end_browsers_ordered_by_activation();
-       ++browser_iterator) {
-    Browser* browser = *browser_iterator;
-
+  for (Browser* browser : BrowserList::GetInstance()->OrderedByActivation()) {
     if (!browser->window()->GetNativeWindow()->IsVisible())
       continue;
 
diff --git a/chrome/browser/ash/video_conference/video_conference_manager_ash.cc b/chrome/browser/ash/video_conference/video_conference_manager_ash.cc
index 9f8ef73..8e28f3b 100644
--- a/chrome/browser/ash/video_conference/video_conference_manager_ash.cc
+++ b/chrome/browser/ash/video_conference/video_conference_manager_ash.cc
@@ -16,6 +16,7 @@
 #include "base/check.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
+#include "base/functional/callback_helpers.h"
 #include "base/logging.h"
 #include "base/unguessable_token.h"
 #include "chrome/browser/ash/video_conference/video_conference_client_wrapper.h"
@@ -75,13 +76,7 @@
 
 void VideoConferenceManagerAsh::ReturnToApp(const base::UnguessableToken& id) {
   for (auto& [_, client_wrapper] : client_id_to_wrapper_) {
-    client_wrapper.ReturnToApp(
-        id, base::BindOnce([](bool success) {
-          if (!success) {
-            LOG(ERROR)
-                << "VideoConferenceClient::ReturnToApp was unsuccessful.";
-          }
-        }));
+    client_wrapper.ReturnToApp(id, base::DoNothing());
   }
 }
 
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
index 929394d..3164636 100644
--- a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
+++ b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
@@ -470,8 +470,7 @@
 
 bool ChromeAutocompleteProviderClient::OpenJourneys(const std::string& query) {
 #if !BUILDFLAG(IS_ANDROID)
-  if (!base::FeatureList::IsEnabled(features::kUnifiedSidePanel) ||
-      !base::FeatureList::IsEnabled(history_clusters::kSidePanelJourneys) ||
+  if (!base::FeatureList::IsEnabled(history_clusters::kSidePanelJourneys) ||
       !history_clusters::kSidePanelJourneysOpensFromOmnibox.Get()) {
     return false;
   }
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc
index 38230a9..acc525f 100644
--- a/chrome/browser/chrome_browser_interface_binders.cc
+++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -932,8 +932,7 @@
           render_frame_host->GetProcess()->GetBrowserContext());
   if (history_clusters_service &&
       history_clusters_service->IsJourneysEnabled()) {
-    if (base::FeatureList::IsEnabled(history_clusters::kSidePanelJourneys) &&
-        base::FeatureList::IsEnabled(features::kUnifiedSidePanel)) {
+    if (base::FeatureList::IsEnabled(history_clusters::kSidePanelJourneys)) {
       RegisterWebUIControllerInterfaceBinder<
           history_clusters::mojom::PageHandler, HistoryUI,
           HistoryClustersSidePanelUI>(map);
@@ -998,20 +997,12 @@
 
   RegisterWebUIControllerInterfaceBinder<
       reading_list::mojom::PageHandlerFactory, ReadingListUI>(map);
-
-  if (base::FeatureList::IsEnabled(features::kUnifiedSidePanel)) {
-    RegisterWebUIControllerInterfaceBinder<
-        side_panel::mojom::BookmarksPageHandlerFactory, BookmarksSidePanelUI>(
-        map);
-    RegisterWebUIControllerInterfaceBinder<
-        shopping_list::mojom::ShoppingListHandlerFactory, BookmarksSidePanelUI>(
-        map);
-  } else {
-    RegisterWebUIControllerInterfaceBinder<
-        side_panel::mojom::BookmarksPageHandlerFactory, ReadingListUI>(map);
-    RegisterWebUIControllerInterfaceBinder<
-        shopping_list::mojom::ShoppingListHandlerFactory, ReadingListUI>(map);
-  }
+  RegisterWebUIControllerInterfaceBinder<
+      side_panel::mojom::BookmarksPageHandlerFactory, BookmarksSidePanelUI>(
+      map);
+  RegisterWebUIControllerInterfaceBinder<
+      shopping_list::mojom::ShoppingListHandlerFactory, BookmarksSidePanelUI>(
+      map);
 
   if (customize_chrome::IsSidePanelEnabled()) {
     RegisterWebUIControllerInterfaceBinder<
@@ -1026,13 +1017,8 @@
   }
 
   if (features::IsReadAnythingEnabled()) {
-    if (base::FeatureList::IsEnabled(features::kUnifiedSidePanel)) {
-      RegisterWebUIControllerInterfaceBinder<
-          read_anything::mojom::PageHandlerFactory, ReadAnythingUI>(map);
-    } else {
-      RegisterWebUIControllerInterfaceBinder<
-          read_anything::mojom::PageHandlerFactory, ReadingListUI>(map);
-    }
+    RegisterWebUIControllerInterfaceBinder<
+        read_anything::mojom::PageHandlerFactory, ReadAnythingUI>(map);
   }
 
   RegisterWebUIControllerInterfaceBinder<tab_search::mojom::PageHandlerFactory,
diff --git a/chrome/browser/chrome_service_worker_browsertest.cc b/chrome/browser/chrome_service_worker_browsertest.cc
index b4f67f44..9ce95c6d 100644
--- a/chrome/browser/chrome_service_worker_browsertest.cc
+++ b/chrome/browser/chrome_service_worker_browsertest.cc
@@ -318,7 +318,7 @@
 }
 
 // TODO(crbug.com/1395715): The test is flaky. Re-enable it.
-#if BUILDFLAG(IS_MAC)
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
 #define MAYBE_SubresourceCountUKM DISABLED_SubresourceCountUKM
 #else
 #define MAYBE_SubresourceCountUKM SubresourceCountUKM
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index f56a1e9b..52cc135 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -77,6 +77,8 @@
     "extensions/login_screen/login_state/login_state_api.h",
     "extensions/login_screen/login_state/session_state_changed_event_dispatcher.cc",
     "extensions/login_screen/login_state/session_state_changed_event_dispatcher.h",
+    "extensions/system_log/system_log_api.cc",
+    "extensions/system_log/system_log_api.h",
     "policy/dlp/clipboard_bubble.cc",
     "policy/dlp/clipboard_bubble.h",
     "policy/dlp/data_transfer_dlp_controller.cc",
@@ -217,6 +219,7 @@
     "//chromeos/ui/base",
     "//components/app_constants",
     "//components/arc/common:arc_intent_helper_constants",
+    "//components/device_event_log",
     "//components/policy/core/common:common_constants",
     "//components/pref_registry",
     "//components/reporting/client:report_queue_factory",
@@ -351,16 +354,35 @@
 static_library("test_support") {
   testonly = true
   sources = [
+    "extensions/login_screen/login/cleanup/mock_cleanup_handler.cc",
+    "extensions/login_screen/login/cleanup/mock_cleanup_handler.h",
     "policy/dlp/dlp_content_manager_test_helper.cc",
     "policy/dlp/dlp_content_manager_test_helper.h",
+    "policy/dlp/dlp_reporting_manager_test_helper.cc",
+    "policy/dlp/dlp_reporting_manager_test_helper.h",
+    "policy/dlp/dlp_rules_manager_test_utils.cc",
+    "policy/dlp/dlp_rules_manager_test_utils.h",
     "policy/dlp/mock_dlp_content_manager.cc",
     "policy/dlp/mock_dlp_content_manager.h",
+    "policy/dlp/mock_dlp_content_observer.cc",
+    "policy/dlp/mock_dlp_content_observer.h",
+    "policy/dlp/mock_dlp_rules_manager.cc",
+    "policy/dlp/mock_dlp_rules_manager.h",
+    "policy/dlp/mock_dlp_warn_notifier.cc",
+    "policy/dlp/mock_dlp_warn_notifier.h",
   ]
   public_deps = [
     ":chromeos",
     "//base",
     "//build:chromeos_buildflags",
     "//testing/gmock",
+    "//testing/gtest",
+    "//ui/views",
+    "//url",
+  ]
+  deps = [
+    ":dlp_policy_event_proto",
+    "//components/reporting/client:test_support",
   ]
 
   if (is_chromeos_ash) {
@@ -374,11 +396,14 @@
 
   sources = [
     "app_mode/app_session_policies_unittest.cc",
+    "arc/arc_external_protocol_dialog_unittest.cc",
+    "arc/open_with_menu_unittest.cc",
+    "extensions/contact_center_insights/contact_center_insights_extension_manager_unittest.cc",
     "extensions/desk_api/desk_api_extension_manager_unittest.cc",
     "extensions/file_system_provider/service_worker_lifetime_manager_unittest.cc",
     "extensions/login_screen/login/cleanup/cleanup_manager_unittest.cc",
-    "extensions/login_screen/login/cleanup/mock_cleanup_handler.cc",
-    "extensions/login_screen/login/cleanup/mock_cleanup_handler.h",
+    "extensions/login_screen/login/external_logout_request/external_logout_request_event_handler_unittest.cc",
+    "extensions/login_screen/login_state/login_state_api_unittest.cc",
     "policy/dlp/data_transfer_dlp_controller_unittest.cc",
     "policy/dlp/dlp_clipboard_notifier_unittest.cc",
     "policy/dlp/dlp_confidential_contents_unittest.cc",
@@ -387,19 +412,10 @@
     "policy/dlp/dlp_copy_or_move_hook_delegate_unittest.cc",
     "policy/dlp/dlp_drag_drop_notifier_unittest.cc",
     "policy/dlp/dlp_file_access_copy_or_move_delegate_factory_unittest.cc",
-    "policy/dlp/dlp_reporting_manager_test_helper.cc",
-    "policy/dlp/dlp_reporting_manager_test_helper.h",
     "policy/dlp/dlp_reporting_manager_unittest.cc",
     "policy/dlp/dlp_rules_manager_impl_unittest.cc",
-    "policy/dlp/dlp_rules_manager_test_utils.cc",
-    "policy/dlp/dlp_rules_manager_test_utils.h",
     "policy/dlp/dlp_scoped_file_access_delegate_unittest.cc",
-    "policy/dlp/mock_dlp_content_observer.cc",
-    "policy/dlp/mock_dlp_content_observer.h",
-    "policy/dlp/mock_dlp_rules_manager.cc",
-    "policy/dlp/mock_dlp_rules_manager.h",
-    "policy/dlp/mock_dlp_warn_notifier.cc",
-    "policy/dlp/mock_dlp_warn_notifier.h",
+    "reporting/network/network_bandwidth_sampler_unittest.cc",
 
     # TODO(zturner): Enable this on Windows. See
     # BrowserWithTestWindowTest::SetUp() for a comment explaining why this is
@@ -410,32 +426,45 @@
   deps = [
     ":chromeos",
     ":dlp_policy_event_proto",
+    ":test_support",
     "//base",
     "//base/test:test_support",
     "//build:chromeos_buildflags",
+    "//chrome/app:command_ids",
     "//chrome/app:generated_resources",
+    "//chrome/browser",
+    "//chrome/browser:browser_process",
     "//chrome/browser/extensions",
     "//chrome/browser/profiles:profile",
+    "//chrome/browser/sharing/proto",
     "//chrome/browser/ui",
     "//chrome/common",
     "//chrome/common:chrome_features",
     "//chrome/common:constants",
     "//chrome/common:non_code_constants",
+    "//chrome/common/extensions/api",
     "//chrome/test:test_support",
     "//chromeos/crosapi/mojom",
     "//chromeos/dbus/dlp",
     "//components/account_id",
+    "//components/arc/common",
+    "//components/arc/common:arc_intent_helper_constants",
+    "//components/arc/common:arc_test_support",
     "//components/file_access",
     "//components/keyed_service/core",
     "//components/policy/core/common:common_constants",
     "//components/prefs",
+    "//components/renderer_context_menu",
     "//components/reporting/client:test_support",
+    "//components/reporting/proto:metric_data_proto",
     "//components/reporting/util:status",
+    "//components/reporting/util:test_callbacks_support",
     "//components/strings:components_strings",
     "//content/public/browser",
     "//content/test:test_support",
     "//extensions:test_support",
     "//extensions/browser",
+    "//extensions/browser:test_support",
     "//extensions/common",
     "//extensions/common:common_constants",
     "//storage/browser",
@@ -444,8 +473,13 @@
     "//third_party/abseil-cpp:absl",
     "//ui/base",
     "//ui/base/data_transfer_policy",
+    "//ui/gfx",
     "//ui/views",
     "//url",
+
+    # Unit tests from subdirectories.
+    "//chrome/browser/chromeos/extensions/telemetry:unit_tests",
+    "//chrome/browser/chromeos/launcher_search:unit_tests",
   ]
 
   if (enable_plugins) {
@@ -460,25 +494,31 @@
       "extensions/login_screen/login/cleanup/extension_cleanup_handler_unittest.cc",
       "extensions/login_screen/login/cleanup/lacros_cleanup_handler_unittest.cc",
       "extensions/login_screen/login/cleanup/print_jobs_cleanup_handler_unittest.cc",
+      "extensions/login_screen/login/external_logout_done/external_logout_done_event_handler_unittest.cc",
       "extensions/login_screen/login/login_api_ash_unittest.cc",
+      "extensions/login_screen/login_screen_storage/login_screen_storage_api_ash_unittest.cc",
+      "extensions/login_screen/login_state/session_state_changed_event_dispatcher_ash_unittest.cc",
       "tablet_mode/chrome_content_browser_client_tablet_mode_part_unittest.cc",
     ]
     deps += [
       "//ash:test_support",
       "//ash/constants",
-      "//chrome/browser",
-      "//chrome/browser:browser_process",
       "//chrome/browser/apps/app_service:test_support",
       "//chrome/browser/ash",
       "//chrome/browser/ash:test_support",
+      "//chrome/browser/ash/crosapi",
+      "//chrome/browser/ash/crosapi:test_support",
       "//chrome/browser/extensions:test_support",
+      "//chromeos/ash/components/dbus/session_manager",
       "//chromeos/ash/components/login/auth/public:authpublic",
+      "//chromeos/ash/components/login/login_state",
       "//chromeos/ash/components/settings",
       "//chromeos/dbus/power",
       "//components/history/core/test",
       "//components/prefs:test_support",
       "//components/services/app_service/public/cpp:app_types",
       "//components/session_manager:base",
+      "//components/session_manager/core",
       "//components/sync_preferences:test_support",
       "//components/user_manager",
       "//content/public/common",
@@ -499,9 +539,15 @@
   }
 
   if (is_chromeos_lacros) {
+    sources += [
+      "reporting/device_reporting_settings_lacros_unittest.cc",
+      "reporting/metric_reporting_manager_lacros_unittest.cc",
+    ]
     deps += [
       "//chromeos/lacros",
       "//chromeos/startup",
+      "//components/reporting/metrics:metrics_data_collection",
+      "//components/reporting/metrics/fakes:test_support",
     ]
   }
 }
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/cleanup/mock_cleanup_handler.h b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/mock_cleanup_handler.h
index 693fe9c..770cdf2 100644
--- a/chrome/browser/chromeos/extensions/login_screen/login/cleanup/mock_cleanup_handler.h
+++ b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/mock_cleanup_handler.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_CHROMEOS_EXTENSIONS_LOGIN_SCREEN_LOGIN_CLEANUP_MOCK_CLEANUP_HANDLER_H_
 
 #include "chrome/browser/chromeos/extensions/login_screen/login/cleanup/cleanup_handler.h"
+
 #include "testing/gmock/include/gmock/gmock.h"
 
 namespace chromeos {
diff --git a/chrome/browser/chromeos/extensions/system_log/OWNERS b/chrome/browser/chromeos/extensions/system_log/OWNERS
new file mode 100644
index 0000000..ef7ed2c
--- /dev/null
+++ b/chrome/browser/chromeos/extensions/system_log/OWNERS
@@ -0,0 +1,3 @@
+emaxx@chromium.org
+mpetrisor@chromium.org
+maleksandrov@chromium.org
diff --git a/chrome/browser/chromeos/extensions/system_log/system_log_api.cc b/chrome/browser/chromeos/extensions/system_log/system_log_api.cc
new file mode 100644
index 0000000..33fdd5d8
--- /dev/null
+++ b/chrome/browser/chromeos/extensions/system_log/system_log_api.cc
@@ -0,0 +1,54 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/extensions/system_log/system_log_api.h"
+
+#include "base/strings/stringprintf.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/extensions/api/system_log.h"
+#include "components/device_event_log/device_event_log.h"
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/profiles/profile_types_ash.h"
+#endif
+
+namespace extensions {
+
+namespace {
+
+bool IsSigninProfileCheck(const Profile* profile) {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  return IsSigninProfile(profile);
+#else
+  return false;
+#endif
+}
+
+std::string FormatLogMessage(const std::string& extension_id,
+                             const Profile* profile,
+                             const std::string& message) {
+  return base::StringPrintf("[%s]%s: %s", extension_id.c_str(),
+                            IsSigninProfileCheck(profile) ? "[signin]" : "",
+                            message.c_str());
+}
+
+}  // namespace
+
+SystemLogAddFunction::SystemLogAddFunction() = default;
+SystemLogAddFunction::~SystemLogAddFunction() = default;
+
+ExtensionFunction::ResponseAction SystemLogAddFunction::Run() {
+  auto parameters = api::system_log::Add::Params::Create(args());
+  EXTENSION_FUNCTION_VALIDATE(parameters);
+  const api::system_log::MessageOptions& options = parameters->options;
+
+  const Profile* profile = Profile::FromBrowserContext(browser_context());
+
+  EXTENSIONS_LOG(DEBUG) << FormatLogMessage(extension_id(), profile,
+                                            options.message);
+
+  return RespondNow(NoArguments());
+}
+
+}  // namespace extensions
diff --git a/chrome/browser/chromeos/extensions/system_log/system_log_api.h b/chrome/browser/chromeos/extensions/system_log/system_log_api.h
new file mode 100644
index 0000000..e86cc20
--- /dev/null
+++ b/chrome/browser/chromeos/extensions/system_log/system_log_api.h
@@ -0,0 +1,32 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_EXTENSIONS_SYSTEM_LOG_SYSTEM_LOG_API_H_
+#define CHROME_BROWSER_CHROMEOS_EXTENSIONS_SYSTEM_LOG_SYSTEM_LOG_API_H_
+
+#include "extensions/browser/extension_function.h"
+#include "extensions/browser/extension_function_histogram_value.h"
+
+namespace extensions {
+
+class SystemLogAddFunction : public ExtensionFunction {
+ public:
+  SystemLogAddFunction();
+
+  SystemLogAddFunction(const SystemLogAddFunction&) = delete;
+
+  SystemLogAddFunction& operator=(const SystemLogAddFunction&) = delete;
+
+  DECLARE_EXTENSION_FUNCTION("systemLog.add", SYSTEMLOG_ADD)
+
+ protected:
+  ~SystemLogAddFunction() override;
+
+  // ExtensionFunction:
+  ResponseAction Run() override;
+};
+
+}  // namespace extensions
+
+#endif  // CHROME_BROWSER_CHROMEOS_EXTENSIONS_SYSTEM_LOG_SYSTEM_LOG_API_H_
diff --git a/chrome/browser/chromeos/extensions/system_log/system_log_apitest.cc b/chrome/browser/chromeos/extensions/system_log/system_log_apitest.cc
new file mode 100644
index 0000000..bc6257e
--- /dev/null
+++ b/chrome/browser/chromeos/extensions/system_log/system_log_apitest.cc
@@ -0,0 +1,99 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "base/files/file_path.h"
+#include "base/path_service.h"
+#include "chrome/browser/extensions/mixin_based_extension_apitest.h"
+#include "chrome/browser/policy/extension_force_install_mixin.h"
+#include "chrome/common/chrome_paths.h"
+#include "components/device_event_log/device_event_log.h"
+#include "components/policy/core/browser/browser_policy_connector.h"
+#include "components/policy/core/common/mock_configuration_policy_provider.h"
+#include "content/public/test/browser_test.h"
+#include "extensions/common/switches.h"
+#include "extensions/test/result_catcher.h"
+
+namespace extensions {
+
+namespace {
+
+constexpr char kApiExtensionRelativePath[] = "extensions/api_test/system_log";
+constexpr char kExtensionPemRelativePath[] =
+    "extensions/api_test/system_log.pem";
+// ID associated with the .pem.
+constexpr char kExtensionId[] = "ghbglelacokpaehlgjbgdfmmggnihdcf";
+
+}  // namespace
+
+class SystemLogApitest : public MixinBasedExtensionApiTest,
+                         public ::testing::WithParamInterface<std::string> {
+ public:
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    MixinBasedExtensionApiTest::SetUpCommandLine(command_line);
+
+    command_line->AppendSwitchASCII(switches::kAllowlistedExtensionID,
+                                    kExtensionId);
+  }
+
+  void SetUpInProcessBrowserTestFixture() override {
+    MixinBasedExtensionApiTest::SetUpInProcessBrowserTestFixture();
+
+    mock_policy_provider_.SetDefaultReturns(
+        /*is_initialization_complete_return=*/true,
+        /*is_first_policy_load_complete_return=*/true);
+    mock_policy_provider_.SetAutoRefresh();
+    policy::BrowserPolicyConnector::SetPolicyProviderForTesting(
+        &mock_policy_provider_);
+  }
+
+  void SetUpOnMainThread() override {
+    extension_force_install_mixin_.InitWithMockPolicyProvider(
+        profile(), &mock_policy_provider_);
+
+    MixinBasedExtensionApiTest::SetUpOnMainThread();
+  }
+
+  void ForceInstallExtension() {
+    base::FilePath test_dir_path =
+        base::PathService::CheckedGet(chrome::DIR_TEST_DATA);
+
+    EXPECT_TRUE(extension_force_install_mixin_.ForceInstallFromSourceDir(
+        test_dir_path.AppendASCII(kApiExtensionRelativePath),
+        test_dir_path.AppendASCII(kExtensionPemRelativePath),
+        ExtensionForceInstallMixin::WaitMode::kLoad));
+  }
+
+ private:
+  ExtensionForceInstallMixin extension_force_install_mixin_{&mixin_host_};
+  testing::NiceMock<policy::MockConfigurationPolicyProvider>
+      mock_policy_provider_;
+};
+
+IN_PROC_BROWSER_TEST_P(SystemLogApitest, AddLog) {
+  const std::string test_name = GetParam();
+  SetCustomArg(test_name);
+
+  ResultCatcher catcher;
+  ForceInstallExtension();
+  ASSERT_TRUE(catcher.GetNextResult()) << catcher.message();
+
+  std::string produced_logs = device_event_log::GetAsString(
+      device_event_log::NEWEST_FIRST, /*format=*/"level",
+      /*types=*/"extensions",
+      /*max_level=*/device_event_log::LOG_LEVEL_DEBUG, /*max_events=*/1);
+
+  std::string expected_logs =
+      "DEBUG: [" + std::string(kExtensionId) + "]: Test log message\n";
+
+  ASSERT_EQ(expected_logs, produced_logs);
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    SystemLogApitest,
+    /*test_name=*/testing::Values("AddLogWithCallback", "AddLogWithPromise"));
+
+}  // namespace extensions
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 10392d9..a487e5c 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
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_CHROMEOS_POLICY_DLP_DLP_CONTENT_MANAGER_TEST_HELPER_H_
 
 #include <memory>
+
 #include "base/memory/raw_ptr.h"
 #include "base/time/time.h"
 #include "build/chromeos_buildflags.h"
diff --git a/chrome/browser/chromeos/video_conference/video_conference_manager_client.cc b/chrome/browser/chromeos/video_conference/video_conference_manager_client.cc
index 9b3a159..e1dfee8 100644
--- a/chrome/browser/chromeos/video_conference/video_conference_manager_client.cc
+++ b/chrome/browser/chromeos/video_conference/video_conference_manager_client.cc
@@ -8,6 +8,7 @@
 #include <vector>
 
 #include "base/check.h"
+#include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/logging.h"
 #include "base/unguessable_token.h"
@@ -86,9 +87,22 @@
 
 void VideoConferenceManagerClientImpl::RemoveMediaApp(
     const base::UnguessableToken& id) {
-  if (id_to_webcontents_.erase(id)) {
-    HandleMediaUsageUpdate();
+  DCHECK(base::Contains(id_to_webcontents_, id));
+  auto it = id_to_webcontents_.find(id);
+  raw_ptr<content::WebContents> web_contents = it->second;
+
+  // If an associated `WebContentsUserData` exists for this `web_contents`,
+  // remove it. This is the case on a primary page change. We don't want to
+  // persist the old `WebContentsUserData` but rather create a new one if/when
+  // the new page begins capturing camera/mic/screen.
+  if (content::WebContentsUserData<VideoConferenceWebApp>::FromWebContents(
+          web_contents)) {
+    web_contents->RemoveUserData(
+        content::WebContentsUserData<VideoConferenceWebApp>::UserDataKey());
   }
+
+  id_to_webcontents_.erase(it);
+  HandleMediaUsageUpdate();
 }
 
 VideoConferenceWebApp*
@@ -105,7 +119,7 @@
   content::WebContentsUserData<VideoConferenceWebApp>::CreateForWebContents(
       web_contents, id, std::move(remove_media_app_callback));
 
-  id_to_webcontents_.try_emplace(id, web_contents);
+  id_to_webcontents_.insert({id, web_contents});
 
   return content::WebContentsUserData<VideoConferenceWebApp>::FromWebContents(
       web_contents);
diff --git a/chrome/browser/chromeos/video_conference/video_conference_manager_client_browsertest.cc b/chrome/browser/chromeos/video_conference/video_conference_manager_client_browsertest.cc
index d8a19895..17d5c19 100644
--- a/chrome/browser/chromeos/video_conference/video_conference_manager_client_browsertest.cc
+++ b/chrome/browser/chromeos/video_conference/video_conference_manager_client_browsertest.cc
@@ -18,6 +18,7 @@
 #include "chromeos/crosapi/mojom/video_conference.mojom.h"
 #include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_contents_user_data.h"
 #include "content/public/test/browser_test.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -143,6 +144,11 @@
   vc_app->ActivateApp();
   // Navigate to a different URL and trigger a primary page change event.
   EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL(kTestURL2)));
+  // There should no longer be a WebContentsUserData associated with this
+  // `web_contents`.
+  EXPECT_FALSE(
+      content::WebContentsUserData<VideoConferenceWebApp>::FromWebContents(
+          web_contents));
 
   EXPECT_EQ(client->id_to_webcontents().size(), 0u);
 }
diff --git a/chrome/browser/dev_ui_browser_resources.grd b/chrome/browser/dev_ui_browser_resources.grd
index 5de2764..f174ae0 100644
--- a/chrome/browser/dev_ui_browser_resources.grd
+++ b/chrome/browser/dev_ui_browser_resources.grd
@@ -60,7 +60,6 @@
       <include name="IDR_TRANSLATE_INTERNALS_CSS" file="../../components/translate/translate_internals/translate_internals.css" type="BINDATA" />
       <include name="IDR_TRANSLATE_INTERNALS_HTML" file="../../components/translate/translate_internals/translate_internals.html" type="BINDATA" />
       <include name="IDR_TRANSLATE_INTERNALS_JS" file="../../components/translate/translate_internals/translate_internals.js" preprocess="true" type="BINDATA" />
-      <include name="IDR_WEB_APP_INTERNALS_HTML" file="resources/web_app_internals/index.html" type="BINDATA" />
     </includes>
   </release>
 </grit>
diff --git a/chrome/browser/extensions/api/tab_capture/tab_capture_api.cc b/chrome/browser/extensions/api/tab_capture/tab_capture_api.cc
index 12119a8..1eb80d4 100644
--- a/chrome/browser/extensions/api/tab_capture/tab_capture_api.cc
+++ b/chrome/browser/extensions/api/tab_capture/tab_capture_api.cc
@@ -118,15 +118,13 @@
 // include incognito profile browsers.
 Browser* GetLastActiveBrowser(const Profile* profile,
                               const bool match_incognito_profile) {
-  BrowserList* browser_list = BrowserList::GetInstance();
   Browser* target_browser = nullptr;
-  for (auto iter = browser_list->begin_browsers_ordered_by_activation();
-       iter != browser_list->end_browsers_ordered_by_activation(); ++iter) {
-    Profile* browser_profile = (*iter)->profile();
+  for (Browser* browser : BrowserList::GetInstance()->OrderedByActivation()) {
+    Profile* browser_profile = browser->profile();
     if (browser_profile == profile ||
         (match_incognito_profile &&
          browser_profile->GetOriginalProfile() == profile)) {
-      target_browser = *iter;
+      target_browser = browser;
       break;
     }
   }
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index e03958a8..6016fe5 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -2644,7 +2644,7 @@
   {
     "name": "enable-media-foundation-video-capture",
     "owners": [ "agpalak", "herre" ],
-    "expiry_milestone": 110
+    "expiry_milestone": 120
   },
   {
     "name": "enable-merchant-wide-promotions",
@@ -4468,6 +4468,11 @@
     "expiry_milestone": 115
   },
   {
+    "name": "launcher-system-info-answer-cards",
+    "owners": ["laurencom", "wrong", "amandadeacon"],
+    "expiry_milestone": 120
+  },
+  {
     "name": "layout-extraction",
     "owners": [ "rhalavati", "//ui/accessibility/OWNERS" ],
     "expiry_milestone": 120
@@ -5944,7 +5949,7 @@
   {
     "name": "run-video-capture-service-in-browser",
     "owners": [ "agpalak", "herre" ],
-    "expiry_milestone": 110
+    "expiry_milestone": 120
   },
   {
     "name": "safe-mode-for-cached-flags",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index fa5ea32..8358709 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2995,10 +2995,6 @@
     "Reduces disk activity during media playback, which can result in "
     "power savings.";
 
-const char kUnifiedSidePanelFlagId[] = "unified-side-panel";
-const char kUnifiedSidePanelName[] = "Unified side panel";
-const char kUnifiedSidePanelDescription[] = "Revamp the side panel experience.";
-
 const char kUnifiedPasswordManagerAndroidName[] =
     "Google Mobile Services for passwords";
 const char kUnifiedPasswordManagerAndroidDescription[] =
@@ -5983,6 +5979,12 @@
     "To evaluate the viability of a Fuzzy match on Omnibox results to "
     "downweight search sugestions";
 
+const char kLauncherSystemInfoAnswerCardsName[] =
+    "System Info Answer Cards in launcher";
+const char kLauncherSystemInfoAnswerCardsDescription[] =
+    "Enables System info answer cards in the launcher to provide system "
+    "performance metrics";
+
 const char kMacAddressRandomizationName[] = "MAC address randomization";
 const char kMacAddressRandomizationDescription[] =
     "Feature to allow MAC address randomization to be enabled for WiFi "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 906d23c9..6eaaf36 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1707,10 +1707,6 @@
 extern const char kTurnOffStreamingMediaCachingAlwaysName[];
 extern const char kTurnOffStreamingMediaCachingAlwaysDescription[];
 
-extern const char kUnifiedSidePanelFlagId[];
-extern const char kUnifiedSidePanelName[];
-extern const char kUnifiedSidePanelDescription[];
-
 extern const char kUnifiedPasswordManagerAndroidName[];
 extern const char kUnifiedPasswordManagerAndroidDescription[];
 
@@ -3453,6 +3449,9 @@
 extern const char kLauncherFuzzyMatchForOmniboxName[];
 extern const char kLauncherFuzzyMatchForOmniboxDescription[];
 
+extern const char kLauncherSystemInfoAnswerCardsName[];
+extern const char kLauncherSystemInfoAnswerCardsDescription[];
+
 extern const char kMacAddressRandomizationName[];
 extern const char kMacAddressRandomizationDescription[];
 
diff --git a/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc b/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc
index b4983c57..e91af68 100644
--- a/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc
+++ b/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc
@@ -320,8 +320,8 @@
 }
 
 // TODO(crbug.com/1402697): Flaky on linux-chromeos-chrome bot.
-// TODO(crbug.com/1402228): Also flaky on Win-ASAN bot.
-#if (BUILDFLAG(IS_CHROMEOS) && !defined(NDEBUG)) || (BUILDFLAG(IS_WIN) && defined(ADDRESS_SANITIZER))
+// TODO(crbug.com/1402228): Also flaky on ASAN bots.
+#if (BUILDFLAG(IS_CHROMEOS) && !defined(NDEBUG)) || defined(ADDRESS_SANITIZER)
 #define MAYBE_PredictionModelFetchFailed DISABLED_PredictionModelFetchFailed
 #else
 #define MAYBE_PredictionModelFetchFailed PredictionModelFetchFailed
diff --git a/chrome/browser/page_info/page_info_features.cc b/chrome/browser/page_info/page_info_features.cc
index 04335095..499c1c9e 100644
--- a/chrome/browser/page_info/page_info_features.cc
+++ b/chrome/browser/page_info/page_info_features.cc
@@ -12,12 +12,6 @@
 namespace page_info {
 
 bool IsMoreAboutThisSiteFeatureEnabled() {
-#if !BUILDFLAG(IS_ANDROID)
-  // MoreAbout may only be enabled when the side panel is on.
-  if (!base::FeatureList::IsEnabled(features::kUnifiedSidePanel))
-    return false;
-#endif
-
   if (!page_info::IsAboutThisSiteFeatureEnabled(
           g_browser_process->GetApplicationLocale())) {
     return false;
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index 25c709c..d162fd1 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -1023,8 +1023,7 @@
     AppendLinkToTextItems();
   }
 
-  if (user_notes::IsUserNotesEnabled() &&
-      base::FeatureList::IsEnabled(features::kUnifiedSidePanel)) {
+  if (user_notes::IsUserNotesEnabled()) {
     AppendUserNotesItems();
   }
 
@@ -3310,7 +3309,6 @@
 
 bool RenderViewContextMenu::IsAddANoteEnabled() const {
   DCHECK(user_notes::IsUserNotesEnabled());
-  DCHECK(base::FeatureList::IsEnabled(features::kUnifiedSidePanel));
 
   RenderFrameHost* render_frame_host = GetRenderFrameHost();
   if (!render_frame_host)
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_group.ts b/chrome/browser/resources/chromeos/emoji_picker/emoji_group.ts
index 714bf38..38178516 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/emoji_group.ts
+++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_group.ts
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js';
+import 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.js';
 import './emoji_variants.js';
 
 import {assertInstanceof} from 'chrome://resources/js/assert_ts.js';
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.ts b/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.ts
index 7fe198b..1258006 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.ts
+++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.ts
@@ -239,18 +239,6 @@
       '--emoji-spacing': constants.EMOJI_SPACING_PX,
     });
 
-    if (this.gifSupport) {
-      const dataUrl = EmojiPicker.configs().dataUrls.gif[0];
-      const categories: GifSubcategoryData[] = dataUrl ?
-          (await this.fetchOrderingData<GifSubcategoryData[]>(dataUrl)) :
-          (await this.apiProxy.getCategories()).categories;
-      const categoryTabs = {
-        ...CATEGORY_TABS,
-        gif: categories,
-      };
-      this.allCategoryTabs = gifCategoryTabs(categoryTabs);
-    }
-
     // Update UI and relevant features based on the initial data.
     this.updateCategoryData(
         // If we don't have 1 data URL, a crash probably isn't a bad idea
@@ -883,7 +871,27 @@
     });
   }
 
-  onCategoryButtonClick(newCategory: CategoryEnum) {
+  async onCategoryButtonClick(newCategory: CategoryEnum) {
+    // Only run this once when the user first clicks the GIF section in the
+    // emoji picker, to do this check whether the gif categories have been
+    // inserted into allCategoryTabs
+    if (newCategory === CategoryEnum.GIF &&
+        this.allCategoryTabs.every(
+            (subCategoryData) =>
+                subCategoryData.category !== CategoryEnum.GIF)) {
+      const dataUrl = EmojiPicker.configs().dataUrls.gif[0];
+      // Fetch the mock json data for categories in tests instead of the
+      // real tenor API
+      const categories: GifSubcategoryData[] = dataUrl ?
+          (await this.fetchOrderingData<GifSubcategoryData[]>(dataUrl)) :
+          (await this.apiProxy.getCategories()).categories;
+      const categoryTabs = {
+        ...CATEGORY_TABS,
+        gif: categories,
+      };
+      this.allCategoryTabs = gifCategoryTabs(categoryTabs);
+    }
+
     this.set('category', newCategory);
     this.set('pagination', 1);
     if (this.getSearchContainer()?.searchNotEmpty()) {
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_picker_api_proxy.ts b/chrome/browser/resources/chromeos/emoji_picker/emoji_picker_api_proxy.ts
index 56b5110..20b4864 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/emoji_picker_api_proxy.ts
+++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_picker_api_proxy.ts
@@ -15,6 +15,25 @@
   getFeatureList(): Promise<{featureList: number[]}>;
 
   getCategories(): Promise<{categories: GifSubcategoryData[]}>;
+
+  getFeaturedGifs(pos?: string): Promise<{featured: Results}>;
+
+  searchGifs(query: string, pos?: string): Promise<{gifs: Results}>;
+}
+
+interface Gif {
+  url: {gif: string, gifpreview: string};
+  previewDims: {
+    // dimensions of the gif preview for the height balancing algorithm
+    width: number,
+    height: number,
+  };
+  contentDescription: string;  // for user accessibility features
+}
+
+export interface Results {
+  next: string;
+  results: Gif[];
 }
 
 // https://developers.google.com/tenor/guides/response-objects-and-errors#category-object
@@ -25,6 +44,25 @@
   name: string;        // category name
 }
 
+// https://developers.google.com/tenor/guides/response-objects-and-errors#media-object
+declare interface MediaObject {
+  url: string;       // a url to the media source
+  dims: number[];    // width and height of the media in pixels
+  duration: number;  // the time in seconds for one loop of the content
+  size: number;      // size of the file in bytes
+}
+
+// https://developers.google.com/tenor/guides/response-objects-and-errors#response-object
+declare interface ResponseObject {
+  id: string;  // tenor result identifier
+  media_formats: {
+    gif: MediaObject,
+    mediumgif: MediaObject,
+  };
+  content_description: string;  // a textual description of the content for user
+                                // accessibility features
+}
+
 export class EmojiPickerApiProxyImpl implements EmojiPickerApiProxy {
   handler = new PageHandlerRemote();
   static instance: EmojiPickerApiProxy|null = null;
@@ -61,6 +99,38 @@
     };
   }
 
+  private formatGifResults = (res: string): Results => {
+    const gifs = JSON.parse(res);
+    return {
+      next: gifs.next,
+      results: gifs.results.map((response: ResponseObject) => {
+        const {gif, mediumgif} = response.media_formats;
+        const [width, height] = mediumgif.dims;
+        return {
+          url: {gif: gif.url, gifpreview: mediumgif.url},
+          preview_dims: {width, height},
+          content_description: response.content_description,
+        };
+      }),
+    };
+  };
+
+  /** @override */
+  async getFeaturedGifs(pos?: string): Promise<{featured: Results}> {
+    const {featured} = await this.handler.getFeaturedGifs(pos || null);
+    return {
+      featured: this.formatGifResults(featured),
+    };
+  }
+
+  /** @override */
+  async searchGifs(query: string, pos?: string): Promise<{gifs: Results}> {
+    const {gifs} = await this.handler.searchGifs(query, pos || null);
+    return {
+      gifs: this.formatGifResults(gifs),
+    };
+  }
+
   static getInstance(): EmojiPickerApiProxy {
     if (EmojiPickerApiProxyImpl.instance === null) {
       EmojiPickerApiProxyImpl.instance = new EmojiPickerApiProxyImpl();
diff --git a/chrome/browser/resources/device_log_ui/device_log_ui.html b/chrome/browser/resources/device_log_ui/device_log_ui.html
index 3f37e39..c9abd700 100644
--- a/chrome/browser/resources/device_log_ui/device_log_ui.html
+++ b/chrome/browser/resources/device_log_ui/device_log_ui.html
@@ -77,6 +77,10 @@
       <input id="log-type-geolocation" type="checkbox">
       <span>$i18n{logTypeGeolocationText}</span>
     </label>
+    <label>
+      <input id="log-type-extensions" type="checkbox">
+      <span>$i18n{logTypeExtensionsText}</span>
+    </label>
   </div>
   <div id="log-container"></div>
 </body>
diff --git a/chrome/browser/resources/intro/sign_in_promo.html b/chrome/browser/resources/intro/sign_in_promo.html
index 4ede09b..6cf759b 100644
--- a/chrome/browser/resources/intro/sign_in_promo.html
+++ b/chrome/browser/resources/intro/sign_in_promo.html
@@ -167,6 +167,7 @@
 
   .benefit-card-description {
     color: var(--card-description-color);
+    font-family: Roboto, arial, sans-serif;
     font-size: var(--card-description-font-size);
     font-weight: 400;
     line-height: 20px;
@@ -195,6 +196,7 @@
 
   #subtitle {
     color: var(--cr-secondary-text-color);
+    font-family: Roboto, arial, sans-serif;
     font-size: var(--subtitle-font-size);
     font-weight: 400;
     line-height: 24px;
diff --git a/chrome/browser/resources/settings/autofill_page/password_view.ts b/chrome/browser/resources/settings/autofill_page/password_view.ts
index 0aa644c..863cf6a 100644
--- a/chrome/browser/resources/settings/autofill_page/password_view.ts
+++ b/chrome/browser/resources/settings/autofill_page/password_view.ts
@@ -20,21 +20,21 @@
 import './passwords_shared.css.js';
 
 import {CrToastElement} from 'chrome://resources/cr_elements/cr_toast/cr_toast.js';
-import {I18nMixin, I18nMixinInterface} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {FocusOutlineManager} from 'chrome://resources/js/focus_outline_manager.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {loadTimeData} from '../i18n_setup.js';
 import {routes} from '../route.js';
-import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
+import {Route, RouteObserverMixin, Router} from '../router.js';
 
 import {SavedPasswordEditedEvent} from './password_edit_dialog.js';
 import {PasswordListItemElement} from './password_list_item.js';
 import {PasswordManagerImpl} from './password_manager_proxy.js';
-import {PasswordRemovalMixin, PasswordRemovalMixinInterface} from './password_removal_mixin.js';
+import {PasswordRemovalMixin} from './password_removal_mixin.js';
 import {PasswordRemoveDialogPasswordsRemovedEvent} from './password_remove_dialog.js';
-import {PasswordRequestorMixin, PasswordRequestorMixinInterface} from './password_requestor_mixin.js';
+import {PasswordRequestorMixin} from './password_requestor_mixin.js';
 import {getTemplate} from './password_view.html.js';
 
 declare global {
@@ -55,13 +55,8 @@
   };
 }
 
-const PasswordViewElementBase =
-    PasswordRemovalMixin(PasswordRequestorMixin(
-        RouteObserverMixin(I18nMixin(PolymerElement)))) as {
-      new (): PolymerElement & I18nMixinInterface &
-          RouteObserverMixinInterface & PasswordRequestorMixinInterface &
-          PasswordRemovalMixinInterface,
-    };
+const PasswordViewElementBase = PasswordRemovalMixin(
+    PasswordRequestorMixin(RouteObserverMixin(I18nMixin(PolymerElement))));
 
 export enum PasswordRemovalUrlParams {
   REMOVED_FROM_STORES = 'removedFromStores',
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_device_section.ts b/chrome/browser/resources/settings/autofill_page/passwords_device_section.ts
index e68fec8..8fd8f56 100644
--- a/chrome/browser/resources/settings/autofill_page/passwords_device_section.ts
+++ b/chrome/browser/resources/settings/autofill_page/passwords_device_section.ts
@@ -23,9 +23,9 @@
 import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
 
 import {CrToastElement} from 'chrome://resources/cr_elements/cr_toast/cr_toast.js';
+import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {PluralStringProxyImpl} from 'chrome://resources/js/plural_string_proxy.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util_ts.js';
-import {WebUiListenerMixin, WebUiListenerMixinInterface} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
@@ -34,9 +34,9 @@
 import {OpenWindowProxyImpl} from '../open_window_proxy.js';
 import {StoredAccount, SyncBrowserProxyImpl, SyncStatus} from '../people_page/sync_browser_proxy.js';
 import {routes} from '../route.js';
-import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
+import {Route, RouteObserverMixin, Router} from '../router.js';
 
-import {MergePasswordsStoreCopiesMixin, MergePasswordsStoreCopiesMixinInterface} from './merge_passwords_store_copies_mixin.js';
+import {MergePasswordsStoreCopiesMixin} from './merge_passwords_store_copies_mixin.js';
 import {AccountStorageOptInStateChangedListener, PasswordManagerImpl} from './password_manager_proxy.js';
 import {getTemplate} from './passwords_device_section.html.js';
 import {PasswordsListHandlerElement} from './passwords_list_handler.js';
@@ -64,17 +64,9 @@
   };
 }
 
-// TODO(crbug.com/1234307): Remove when RouteObserverMixin is converted to
-// TypeScript.
-type Constructor<T> = new (...args: any[]) => T;
-
 const PasswordsDeviceSectionElementBase =
-    MergePasswordsStoreCopiesMixin(GlobalScrollTargetMixin(WebUiListenerMixin(
-        RouteObserverMixin(PolymerElement) as unknown as
-        Constructor<PolymerElement>))) as {
-      new (): PolymerElement & WebUiListenerMixinInterface &
-          MergePasswordsStoreCopiesMixinInterface & RouteObserverMixinInterface,
-    };
+    MergePasswordsStoreCopiesMixin(GlobalScrollTargetMixin(
+        WebUiListenerMixin(RouteObserverMixin(PolymerElement))));
 
 export class PasswordsDeviceSectionElement extends
     PasswordsDeviceSectionElementBase {
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_list_handler.ts b/chrome/browser/resources/settings/autofill_page/passwords_list_handler.ts
index 89da5eb..7dfeb0f 100644
--- a/chrome/browser/resources/settings/autofill_page/passwords_list_handler.ts
+++ b/chrome/browser/resources/settings/autofill_page/passwords_list_handler.ts
@@ -25,22 +25,22 @@
 import {getInstance as getAnnouncerInstance} from 'chrome://resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer.js';
 import {CrActionMenuElement} from 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js';
 import {CrToastElement} from 'chrome://resources/cr_elements/cr_toast/cr_toast.js';
+import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {focusWithoutInk} from 'chrome://resources/js/focus_without_ink.js';
-import {I18nMixin, I18nMixinInterface} from 'chrome://resources/cr_elements/i18n_mixin.js';
-import {WebUiListenerMixin, WebUiListenerMixinInterface} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {loadTimeData} from '../i18n_setup.js';
 import {StoredAccount, SyncBrowserProxyImpl} from '../people_page/sync_browser_proxy.js';
 import {routes} from '../route.js';
-import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
+import {Route, RouteObserverMixin, Router} from '../router.js';
 
 import {PASSWORD_MORE_ACTIONS_CLICKED_EVENT_NAME, PasswordListItemElement, PasswordMoreActionsClickedEvent} from './password_list_item.js';
 import {PasswordManagerImpl, PasswordManagerProxy} from './password_manager_proxy.js';
-import {PasswordRemovalMixin, PasswordRemovalMixinInterface} from './password_removal_mixin.js';
+import {PasswordRemovalMixin} from './password_removal_mixin.js';
 import {PasswordRemoveDialogPasswordsRemovedEvent} from './password_remove_dialog.js';
-import {PasswordRequestorMixin, PasswordRequestorMixinInterface} from './password_requestor_mixin.js';
+import {PasswordRequestorMixin} from './password_requestor_mixin.js';
 import {PASSWORD_VIEW_PAGE_REQUESTED_EVENT_NAME, PasswordRemovalUrlParams, PasswordViewPageRequestedEvent} from './password_view.js';
 import {getTemplate} from './passwords_list_handler.html.js';
 
@@ -59,13 +59,8 @@
 
 type FocusConfig = Map<string, string|(() => void)>;
 
-const PasswordsListHandlerElementBase =
-    RouteObserverMixin(PasswordRemovalMixin(PasswordRequestorMixin(
-        WebUiListenerMixin(I18nMixin(PolymerElement))))) as {
-      new (): PolymerElement & I18nMixinInterface &
-          WebUiListenerMixinInterface & PasswordRequestorMixinInterface &
-          PasswordRemovalMixinInterface & RouteObserverMixinInterface,
-    };
+const PasswordsListHandlerElementBase = RouteObserverMixin(PasswordRemovalMixin(
+    PasswordRequestorMixin(WebUiListenerMixin(I18nMixin(PolymerElement)))));
 
 export class PasswordsListHandlerElement extends
     PasswordsListHandlerElementBase {
diff --git a/chrome/browser/resources/settings/basic_page/basic_page.ts b/chrome/browser/resources/settings/basic_page/basic_page.ts
index fa50165..efb83e4 100644
--- a/chrome/browser/resources/settings/basic_page/basic_page.ts
+++ b/chrome/browser/resources/settings/basic_page/basic_page.ts
@@ -27,46 +27,34 @@
 // <if expr="not is_chromeos">
 import '../default_browser_page/default_browser_page.js';
 // </if>
-
 // <if expr="not chromeos_ash">
 import '../languages_page/languages.js';
 
 // </if>
 
+import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
-import {WebUiListenerMixin, WebUiListenerMixinInterface} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {beforeNextRender, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {SettingsIdleLoadElement} from '../controls/settings_idle_load.js';
 import {loadTimeData} from '../i18n_setup.js';
-import {PageVisibility} from '../page_visibility.js';
-import {SyncStatus} from '../people_page/sync_browser_proxy.js';
-import {PerformanceBrowserProxy, PerformanceBrowserProxyImpl} from '../performance_page/performance_browser_proxy.js';
-import {PrefsMixin, PrefsMixinInterface} from '../prefs/prefs_mixin.js';
-import {MAX_PRIVACY_GUIDE_PROMO_IMPRESSION, PrivacyGuideBrowserProxy, PrivacyGuideBrowserProxyImpl} from '../privacy_page/privacy_guide/privacy_guide_browser_proxy.js';
-import {routes} from '../route.js';
-import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
-import {getSearchManager, SearchResult} from '../search_settings.js';
-import {MainPageMixin, MainPageMixinInterface} from '../settings_page/main_page_mixin.js';
-
 // <if expr="not chromeos_ash">
 import {LanguageHelper, LanguagesModel} from '../languages_page/languages_types.js';
 // </if>
+import {PageVisibility} from '../page_visibility.js';
+import {SyncStatus} from '../people_page/sync_browser_proxy.js';
+import {PerformanceBrowserProxy, PerformanceBrowserProxyImpl} from '../performance_page/performance_browser_proxy.js';
+import {PrefsMixin} from '../prefs/prefs_mixin.js';
+import {MAX_PRIVACY_GUIDE_PROMO_IMPRESSION, PrivacyGuideBrowserProxy, PrivacyGuideBrowserProxyImpl} from '../privacy_page/privacy_guide/privacy_guide_browser_proxy.js';
+import {routes} from '../route.js';
+import {Route, RouteObserverMixin, Router} from '../router.js';
+import {getSearchManager, SearchResult} from '../search_settings.js';
+import {MainPageMixin} from '../settings_page/main_page_mixin.js';
 
 import {getTemplate} from './basic_page.html.js';
 
-// TODO(crbug.com/1234307): Remove when RouteObserverMixin is converted to
-// TypeScript.
-type Constructor<T> = new (...args: any[]) => T;
-
-const SettingsBasicPageElementBase =
-    PrefsMixin(MainPageMixin(
-        RouteObserverMixin(WebUiListenerMixin(PolymerElement)) as unknown as
-        Constructor<PolymerElement>)) as unknown as {
-      new (): PolymerElement & WebUiListenerMixinInterface &
-          PrefsMixinInterface & RouteObserverMixinInterface &
-          MainPageMixinInterface,
-    };
+const SettingsBasicPageElementBase = PrefsMixin(
+    MainPageMixin(RouteObserverMixin(WebUiListenerMixin(PolymerElement))));
 
 export class SettingsBasicPageElement extends SettingsBasicPageElementBase {
   static get is() {
diff --git a/chrome/browser/resources/settings/chromeos/device_page/per_device_mouse.ts b/chrome/browser/resources/settings/chromeos/device_page/per_device_mouse.ts
index 09054bbb..20dec27 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/per_device_mouse.ts
+++ b/chrome/browser/resources/settings/chromeos/device_page/per_device_mouse.ts
@@ -11,19 +11,17 @@
 import '../../icons.html.js';
 import '../../settings_shared.css.js';
 
-import {I18nMixin, I18nMixinInterface} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {routes} from '../os_route.js';
-import {RouteObserverMixin, RouteObserverMixinInterface} from '../route_observer_mixin.js';
+import {RouteObserverMixin} from '../route_observer_mixin.js';
 import {Route} from '../router.js';
 
 import {getTemplate} from './per_device_mouse.html.js';
 
 const SettingsPerDeviceMouseElementBase =
-    RouteObserverMixin(I18nMixin(PolymerElement)) as {
-      new (): PolymerElement & I18nMixinInterface & RouteObserverMixinInterface,
-    };
+    RouteObserverMixin(I18nMixin(PolymerElement));
 
 class SettingsPerDeviceMouseElement extends SettingsPerDeviceMouseElementBase {
   static get is() {
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts
index 97e0c56c..a79dc202 100644
--- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts
+++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts
@@ -22,8 +22,8 @@
 
 import {getInstance as getAnnouncerInstance} from 'chrome://resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer.js';
 import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
-import {I18nMixin, I18nMixinInterface} from 'chrome://resources/cr_elements/i18n_mixin.js';
-import {WebUiListenerMixin, WebUiListenerMixinInterface} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
+import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {sanitizeInnerHtml} from 'chrome://resources/js/parse_html_subset.js';
 import {IronPagesElement} from 'chrome://resources/polymer/v3_0/iron-pages/iron-pages.js';
@@ -35,7 +35,7 @@
 import {loadTimeData} from '../i18n_setup.js';
 import {StatusAction, SyncBrowserProxy, SyncBrowserProxyImpl, SyncStatus} from '../people_page/sync_browser_proxy.js';
 import {routes} from '../route.js';
-import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
+import {Route, RouteObserverMixin, Router} from '../router.js';
 
 import {ClearBrowsingDataBrowserProxy, ClearBrowsingDataBrowserProxyImpl, InstalledApp, UpdateSyncStateEvent} from './clear_browsing_data_browser_proxy.js';
 import {getTemplate} from './clear_browsing_data_dialog.html.js';
@@ -90,10 +90,7 @@
 }
 
 const SettingsClearBrowsingDataDialogElementBase =
-    RouteObserverMixin(WebUiListenerMixin(I18nMixin(PolymerElement))) as {
-      new (): PolymerElement & WebUiListenerMixinInterface &
-          I18nMixinInterface & RouteObserverMixinInterface,
-    };
+    RouteObserverMixin(WebUiListenerMixin(I18nMixin(PolymerElement)));
 
 export class SettingsClearBrowsingDataDialogElement extends
     SettingsClearBrowsingDataDialogElementBase {
diff --git a/chrome/browser/resources/settings/images/privacy_guide/OWNERS b/chrome/browser/resources/settings/images/privacy_guide/OWNERS
new file mode 100644
index 0000000..33f71b6c
--- /dev/null
+++ b/chrome/browser/resources/settings/images/privacy_guide/OWNERS
@@ -0,0 +1 @@
+rainhard@chromium.org
diff --git a/chrome/browser/resources/settings/languages_page/languages_page.ts b/chrome/browser/resources/settings/languages_page/languages_page.ts
index b2a5eb3c..fc947fe1 100644
--- a/chrome/browser/resources/settings/languages_page/languages_page.ts
+++ b/chrome/browser/resources/settings/languages_page/languages_page.ts
@@ -34,7 +34,7 @@
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {isWindows} from 'chrome://resources/js/platform.js';
 import {focusWithoutInk} from 'chrome://resources/js/focus_without_ink.js';
-import {I18nMixin, I18nMixinInterface} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
 import {DomRepeatEvent, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 // <if expr="is_win">
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -43,10 +43,10 @@
 
 import {SettingsToggleButtonElement} from '../controls/settings_toggle_button.js';
 import {loadTimeData} from '../i18n_setup.js';
-import {PrefsMixin, PrefsMixinInterface} from '../prefs/prefs_mixin.js';
-import {RelaunchMixin, RelaunchMixinInterface, RestartType} from '../relaunch_mixin.js';
+import {PrefsMixin} from '../prefs/prefs_mixin.js';
+import {RelaunchMixin, RestartType} from '../relaunch_mixin.js';
 import {routes} from '../route.js';
-import {Route, RouteObserverMixin, RouteObserverMixinInterface} from '../router.js';
+import {Route, RouteObserverMixin} from '../router.js';
 
 import {getTemplate} from './languages_page.html.js';
 import {LanguageSettingsActionType, LanguageSettingsMetricsProxy, LanguageSettingsMetricsProxyImpl, LanguageSettingsPageImpressionType} from './languages_settings_metrics_proxy.js';
@@ -58,18 +58,16 @@
  * Millisecond delay that can be used when closing an action menu to keep it
  * briefly on-screen.
  */
- export const kMenuCloseDelay: number = 100;
+export const kMenuCloseDelay: number = 100;
 
- export interface SettingsLanguagesPageElement {
-   $: {
-     menu: CrLazyRenderElement<CrActionMenuElement>,
-   };
- }
+export interface SettingsLanguagesPageElement {
+  $: {
+    menu: CrLazyRenderElement<CrActionMenuElement>,
+  };
+}
 
 const SettingsLanguagesPageElementBase =
-    RouteObserverMixin(RelaunchMixin(I18nMixin(PrefsMixin(PolymerElement)))) as {
-      new (): PolymerElement & RelaunchMixinInterface & I18nMixinInterface & PrefsMixinInterface & RouteObserverMixinInterface,
-    };
+    RouteObserverMixin(RelaunchMixin(I18nMixin(PrefsMixin(PolymerElement))));
 
 export class SettingsLanguagesPageElement extends
     SettingsLanguagesPageElementBase {
@@ -176,7 +174,7 @@
    * Formats language index (zero-indexed)
    */
   private formatIndex_(index: number): string {
-    return (index+1).toLocaleString();
+    return (index + 1).toLocaleString();
   }
 
   /**
diff --git a/chrome/browser/resources/settings/people_page/manage_profile.ts b/chrome/browser/resources/settings/people_page/manage_profile.ts
index 0b70b11..e0d3946 100644
--- a/chrome/browser/resources/settings/people_page/manage_profile.ts
+++ b/chrome/browser/resources/settings/people_page/manage_profile.ts
@@ -18,22 +18,19 @@
 
 import {CrInputElement} from 'chrome://resources/cr_elements/cr_input/cr_input.js';
 import {AvatarIcon} from 'chrome://resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.js';
-import {WebUiListenerMixin, WebUiListenerMixinInterface} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
+import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {loadTimeData} from '../i18n_setup.js';
 import {routes} from '../route.js';
-import {RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
+import {RouteObserverMixin, Router} from '../router.js';
 
 import {getTemplate} from './manage_profile.html.js';
 import {ManageProfileBrowserProxy, ManageProfileBrowserProxyImpl, ProfileShortcutStatus} from './manage_profile_browser_proxy.js';
 import {SyncStatus} from './sync_browser_proxy.js';
 
 const SettingsManageProfileElementBase =
-    RouteObserverMixin(WebUiListenerMixin(PolymerElement)) as {
-      new (): PolymerElement & WebUiListenerMixinInterface &
-          RouteObserverMixinInterface,
-    };
+    RouteObserverMixin(WebUiListenerMixin(PolymerElement));
 
 export interface SettingsManageProfileElement {
   $: {
diff --git a/chrome/browser/resources/settings/people_page/people_page.ts b/chrome/browser/resources/settings/people_page/people_page.ts
index 689be3da..6c52e8a 100644
--- a/chrome/browser/resources/settings/people_page/people_page.ts
+++ b/chrome/browser/resources/settings/people_page/people_page.ts
@@ -26,10 +26,10 @@
 import {convertImageSequenceToPng} from 'chrome://resources/ash/common/cr_picture/png.js';
 // </if>
 import {CrToastElement} from 'chrome://resources/cr_elements/cr_toast/cr_toast.js';
-import {isChromeOS} from 'chrome://resources/js/platform.js';
+import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {focusWithoutInk} from 'chrome://resources/js/focus_without_ink.js';
 import {getImage} from 'chrome://resources/js/icon.js';
-import {WebUiListenerMixin, WebUiListenerMixinInterface} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
+import {isChromeOS} from 'chrome://resources/js/platform.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {BaseMixin} from '../base_mixin.js';
@@ -38,7 +38,7 @@
 import {OpenWindowProxyImpl} from '../open_window_proxy.js';
 import {PageVisibility} from '../page_visibility.js';
 import {routes} from '../route.js';
-import {RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
+import {RouteObserverMixin, Router} from '../router.js';
 
 // <if expr="chromeos_ash">
 import {AccountManagerBrowserProxyImpl} from './account_manager_browser_proxy.js';
@@ -56,10 +56,7 @@
 }
 
 const SettingsPeoplePageElementBase =
-    RouteObserverMixin(WebUiListenerMixin(BaseMixin(PolymerElement))) as {
-      new (): PolymerElement & WebUiListenerMixinInterface &
-          RouteObserverMixinInterface,
-    };
+    RouteObserverMixin(WebUiListenerMixin(BaseMixin(PolymerElement)));
 
 export class SettingsPeoplePageElement extends SettingsPeoplePageElementBase {
   static get is() {
diff --git a/chrome/browser/resources/settings/people_page/sync_page.ts b/chrome/browser/resources/settings/people_page/sync_page.ts
index 39f0c4c..6d2993e2 100644
--- a/chrome/browser/resources/settings/people_page/sync_page.ts
+++ b/chrome/browser/resources/settings/people_page/sync_page.ts
@@ -26,12 +26,12 @@
 
 import {CrDialogElement} from '//resources/cr_elements/cr_dialog/cr_dialog.js';
 import {CrInputElement} from '//resources/cr_elements/cr_input/cr_input.js';
+import {WebUiListenerMixin} from '//resources/cr_elements/web_ui_listener_mixin.js';
 import {assert, assertNotReached} from '//resources/js/assert_ts.js';
 import {focusWithoutInk} from '//resources/js/focus_without_ink.js';
-import {WebUiListenerMixin, WebUiListenerMixinInterface} from '//resources/cr_elements/web_ui_listener_mixin.js';
 import {IronCollapseElement} from '//resources/polymer/v3_0/iron-collapse/iron-collapse.js';
 import {flush, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {I18nMixin, I18nMixinInterface} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
 
 import {FocusConfig} from '../focus_config.js';
 import {loadTimeData} from '../i18n_setup.js';
@@ -39,7 +39,7 @@
 import {SettingsPersonalizationOptionsElement} from '../privacy_page/personalization_options.js';
 // </if>
 
-import {RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
+import {RouteObserverMixin, Router} from '../router.js';
 
 import {PageStatus, StatusAction, SyncBrowserProxy, SyncBrowserProxyImpl, SyncPrefs, SyncStatus} from './sync_browser_proxy.js';
 // <if expr="chromeos_ash">
@@ -60,10 +60,7 @@
  */
 
 const SettingsSyncPageElementBase =
-    RouteObserverMixin(WebUiListenerMixin(I18nMixin(PolymerElement))) as {
-      new (): PolymerElement & WebUiListenerMixinInterface &
-          I18nMixinInterface & RouteObserverMixinInterface,
-    };
+    RouteObserverMixin(WebUiListenerMixin(I18nMixin(PolymerElement)));
 
 export class SettingsSyncPageElement extends SettingsSyncPageElementBase {
   static get is() {
@@ -336,11 +333,11 @@
   private onFocusConfigChange_() {
     this.focusConfig.set(
         Router.getInstance().getRoutes().SYNC_ADVANCED.path, () => {
-      const toFocus =
-          this.shadowRoot!.querySelector<HTMLElement>('#sync-advanced-row');
-      assert(toFocus);
-      focusWithoutInk(toFocus);
-    });
+          const toFocus =
+              this.shadowRoot!.querySelector<HTMLElement>('#sync-advanced-row');
+          assert(toFocus);
+          focusWithoutInk(toFocus);
+        });
   }
 
   // <if expr="not chromeos_ash">
@@ -666,7 +663,8 @@
     const passphraseInput = this.shadowRoot!.querySelector<CrInputElement>(
         '#existingPassphraseInput');
     const router = Router.getInstance();
-    if (passphraseInput && router.getCurrentRoute() === router.getRoutes().SYNC) {
+    if (passphraseInput &&
+        router.getCurrentRoute() === router.getRoutes().SYNC) {
       passphraseInput.focus();
     }
   }
diff --git a/chrome/browser/resources/settings/privacy_page/cookies_page.ts b/chrome/browser/resources/settings/privacy_page/cookies_page.ts
index 2f3f84f1..88ba5b4 100644
--- a/chrome/browser/resources/settings/privacy_page/cookies_page.ts
+++ b/chrome/browser/resources/settings/privacy_page/cookies_page.ts
@@ -21,8 +21,8 @@
 import '../controls/settings_radio_group.js';
 
 import {CrToastElement} from 'chrome://resources/cr_elements/cr_toast/cr_toast.js';
-import {I18nMixin, I18nMixinInterface} from 'chrome://resources/cr_elements/i18n_mixin.js';
-import {WebUiListenerMixin, WebUiListenerMixinInterface} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
+import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {focusWithoutInk} from 'chrome://resources/js/focus_without_ink.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -31,9 +31,9 @@
 import {FocusConfig} from '../focus_config.js';
 import {loadTimeData} from '../i18n_setup.js';
 import {MetricsBrowserProxy, MetricsBrowserProxyImpl, PrivacyElementInteractions} from '../metrics_browser_proxy.js';
-import {PrefsMixin, PrefsMixinInterface} from '../prefs/prefs_mixin.js';
+import {PrefsMixin} from '../prefs/prefs_mixin.js';
 import {routes} from '../route.js';
-import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
+import {Route, RouteObserverMixin, Router} from '../router.js';
 import {ContentSetting, ContentSettingsTypes, CookieControlsMode} from '../site_settings/constants.js';
 import {CookiePrimarySetting} from '../site_settings/site_settings_prefs_browser_proxy.js';
 
@@ -57,13 +57,8 @@
   };
 }
 
-const SettingsCookiesPageElementBase =
-    RouteObserverMixin(
-        WebUiListenerMixin(I18nMixin(PrefsMixin(PolymerElement)))) as {
-      new (): PolymerElement & I18nMixinInterface &
-          WebUiListenerMixinInterface & PrefsMixinInterface &
-          RouteObserverMixinInterface,
-    };
+const SettingsCookiesPageElementBase = RouteObserverMixin(
+    WebUiListenerMixin(I18nMixin(PrefsMixin(PolymerElement))));
 
 export class SettingsCookiesPageElement extends SettingsCookiesPageElementBase {
   static get is() {
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_history_sync_fragment.ts b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_history_sync_fragment.ts
index 8865af8..bfc7bc3 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_history_sync_fragment.ts
+++ b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_history_sync_fragment.ts
@@ -13,7 +13,7 @@
 import './privacy_guide_fragment_shared.css.js';
 import '../../controls/settings_toggle_button.js';
 
-import {WebUiListenerMixin, WebUiListenerMixinInterface} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
+import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {BaseMixin} from '../../base_mixin.js';
@@ -21,7 +21,7 @@
 import {MetricsBrowserProxy, MetricsBrowserProxyImpl, PrivacyGuideSettingsStates} from '../../metrics_browser_proxy.js';
 import {SyncBrowserProxy, SyncBrowserProxyImpl, SyncPrefs, syncPrefsIndividualDataTypes} from '../../people_page/sync_browser_proxy.js';
 import {routes} from '../../route.js';
-import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../../router.js';
+import {Route, RouteObserverMixin, Router} from '../../router.js';
 
 import {PrivacyGuideStep} from './constants.js';
 import {getTemplate} from './privacy_guide_history_sync_fragment.html.js';
@@ -33,10 +33,7 @@
 }
 
 const PrivacyGuideHistorySyncFragmentElementBase =
-    RouteObserverMixin(WebUiListenerMixin(BaseMixin(PolymerElement))) as {
-      new (): PolymerElement & RouteObserverMixinInterface &
-          WebUiListenerMixinInterface,
-    };
+    RouteObserverMixin(WebUiListenerMixin(BaseMixin(PolymerElement)));
 
 export class PrivacyGuideHistorySyncFragmentElement extends
     PrivacyGuideHistorySyncFragmentElementBase {
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_page.ts b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_page.ts
index 527a674..06d2a75 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_page.ts
+++ b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_page.ts
@@ -21,8 +21,8 @@
 import './step_indicator.js';
 
 import {CrViewManagerElement} from 'chrome://resources/cr_elements/cr_view_manager/cr_view_manager.js';
-import {I18nMixin, I18nMixinInterface} from 'chrome://resources/cr_elements/i18n_mixin.js';
-import {WebUiListenerMixin, WebUiListenerMixinInterface} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
+import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {afterNextRender, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
@@ -30,11 +30,11 @@
 import {loadTimeData} from '../../i18n_setup.js';
 import {MetricsBrowserProxy, MetricsBrowserProxyImpl, PrivacyGuideInteractions} from '../../metrics_browser_proxy.js';
 import {SyncBrowserProxy, SyncBrowserProxyImpl, SyncStatus} from '../../people_page/sync_browser_proxy.js';
-import {PrefsMixin, PrefsMixinInterface} from '../../prefs/prefs_mixin.js';
+import {PrefsMixin} from '../../prefs/prefs_mixin.js';
 import {CrSettingsPrefs} from '../../prefs/prefs_types.js';
 import {SafeBrowsingSetting} from '../../privacy_page/security_page.js';
 import {routes} from '../../route.js';
-import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../../router.js';
+import {Route, RouteObserverMixin, Router} from '../../router.js';
 import {CookiePrimarySetting} from '../../site_settings/site_settings_prefs_browser_proxy.js';
 
 import {PrivacyGuideStep} from './constants.js';
@@ -55,11 +55,8 @@
   };
 }
 
-const PrivacyGuideBase = RouteObserverMixin(WebUiListenerMixin(
-                             I18nMixin(PrefsMixin(PolymerElement)))) as {
-  new (): PolymerElement & I18nMixinInterface & WebUiListenerMixinInterface &
-      RouteObserverMixinInterface & PrefsMixinInterface,
-};
+const PrivacyGuideBase = RouteObserverMixin(
+    WebUiListenerMixin(I18nMixin(PrefsMixin(PolymerElement))));
 
 export class SettingsPrivacyGuidePageElement extends PrivacyGuideBase {
   static get is() {
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.ts b/chrome/browser/resources/settings/privacy_page/privacy_page.ts
index 6a7ec934..bbdfc362 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_page.ts
+++ b/chrome/browser/resources/settings/privacy_page/privacy_page.ts
@@ -21,8 +21,8 @@
 import './privacy_guide/privacy_guide_dialog.js';
 
 import {CrLinkRowElement} from 'chrome://resources/cr_elements/cr_link_row/cr_link_row.js';
-import {I18nMixin, I18nMixinInterface} from 'chrome://resources/cr_elements/i18n_mixin.js';
-import {WebUiListenerMixin, WebUiListenerMixinInterface} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
+import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {focusWithoutInk} from 'chrome://resources/js/focus_without_ink.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -34,9 +34,9 @@
 import {loadTimeData} from '../i18n_setup.js';
 import {MetricsBrowserProxy, MetricsBrowserProxyImpl, PrivacyGuideInteractions} from '../metrics_browser_proxy.js';
 import {SyncStatus} from '../people_page/sync_browser_proxy.js';
-import {PrefsMixin, PrefsMixinInterface} from '../prefs/prefs_mixin.js';
+import {PrefsMixin} from '../prefs/prefs_mixin.js';
 import {routes} from '../route.js';
-import {RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
+import {RouteObserverMixin, Router} from '../router.js';
 import {ChooserType, ContentSettingsTypes, NotificationSetting} from '../site_settings/constants.js';
 import {NotificationPermission, SiteSettingsPrefsBrowserProxy, SiteSettingsPrefsBrowserProxyImpl} from '../site_settings/site_settings_prefs_browser_proxy.js';
 
@@ -57,13 +57,8 @@
   };
 }
 
-const SettingsPrivacyPageElementBase =
-    RouteObserverMixin(WebUiListenerMixin(
-        I18nMixin(PrefsMixin(BaseMixin(PolymerElement))))) as {
-      new (): PolymerElement & I18nMixinInterface &
-          WebUiListenerMixinInterface & PrefsMixinInterface &
-          RouteObserverMixinInterface,
-    };
+const SettingsPrivacyPageElementBase = RouteObserverMixin(
+    WebUiListenerMixin(I18nMixin(PrefsMixin(BaseMixin(PolymerElement)))));
 
 export class SettingsPrivacyPageElement extends SettingsPrivacyPageElementBase {
   static get is() {
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_fledge_subpage.html b/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_fledge_subpage.html
index 9b5c326c1..e4e1786 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_fledge_subpage.html
+++ b/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_fledge_subpage.html
@@ -53,6 +53,14 @@
     padding-block-end: 16px;
     padding-block-start: 4px;
   }
+
+  #footer {
+    padding: 16px var(--cr-section-padding);
+  }
+
+  #footer a {
+    color: var(--cr-link-color);
+  }
 </style>
 
 <settings-toggle-button
@@ -104,9 +112,8 @@
   </div>
   <!-- TODO(b/254411463): Add blocked sites list. -->
 </iron-collapse>
-<!-- TODO(b/254412043): Add links to footer. -->
-<div id="footer" class="cr-row cr-secondary-text">
-  $i18n{fledgePageFooter}
+<div id="footer" class="cr-secondary-text">
+  $i18nRaw{fledgePageFooter}
 </div>
 
 <template is="dom-if" if="[[isLearnMoreDialogOpen_]]" restamp>
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_topics_subpage.html b/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_topics_subpage.html
index b2c9a48..c61fb1d 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_topics_subpage.html
+++ b/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_topics_subpage.html
@@ -48,8 +48,11 @@
   }
 
   #footer {
-    padding-block-end: 16px;
-    padding-block-start: 16px;
+    padding: 16px var(--cr-section-padding);
+  }
+
+  #footer a {
+    color: var(--cr-link-color);
   }
 
   #dialog p {
@@ -121,9 +124,8 @@
     </template>
   </div>
 </iron-collapse>
-<!-- TODO(b/254412650): Add links to footer. -->
-<div id="footer" class="cr-row cr-secondary-text">
-  $i18n{topicsPageFooter}
+<div id="footer" class="cr-secondary-text">
+  $i18nRaw{topicsPageFooter}
 </div>
 
 <template is="dom-if" if="[[isLearnMoreDialogOpen_]]" restamp>
diff --git a/chrome/browser/resources/settings/privacy_page/security_page.ts b/chrome/browser/resources/settings/privacy_page/security_page.ts
index e580001..b2ea21f4c 100644
--- a/chrome/browser/resources/settings/privacy_page/security_page.ts
+++ b/chrome/browser/resources/settings/privacy_page/security_page.ts
@@ -14,8 +14,8 @@
 import '../settings_shared.css.js';
 import './disable_safebrowsing_dialog.js';
 
-import {HelpBubbleMixin, HelpBubbleMixinInterface} from 'chrome://resources/cr_components/help_bubble/help_bubble_mixin.js';
-import {I18nMixin, I18nMixinInterface} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {HelpBubbleMixin} from 'chrome://resources/cr_components/help_bubble/help_bubble_mixin.js';
+import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {focusWithoutInk} from 'chrome://resources/js/focus_without_ink.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -29,10 +29,10 @@
 import {OpenWindowProxyImpl} from '../open_window_proxy.js';
 // </if>
 
-import {PrefsMixin, PrefsMixinInterface} from '../prefs/prefs_mixin.js';
+import {PrefsMixin} from '../prefs/prefs_mixin.js';
 import {CrSettingsPrefs} from '../prefs/prefs_types.js';
 import {routes} from '../route.js';
-import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
+import {Route, RouteObserverMixin, Router} from '../router.js';
 
 import {SettingsCollapseRadioButtonElement} from './collapse_radio_button.js';
 import {PrivacyPageBrowserProxy, PrivacyPageBrowserProxyImpl} from './privacy_page_browser_proxy.js';
@@ -61,12 +61,7 @@
 }
 
 const SettingsSecurityPageElementBase =
-    HelpBubbleMixin(
-        RouteObserverMixin(I18nMixin(PrefsMixin(PolymerElement)))) as {
-      new (): PolymerElement & I18nMixinInterface &
-          RouteObserverMixinInterface & PrefsMixinInterface &
-          HelpBubbleMixinInterface,
-    };
+    HelpBubbleMixin(RouteObserverMixin(I18nMixin(PrefsMixin(PolymerElement))));
 
 export class SettingsSecurityPageElement extends
     SettingsSecurityPageElementBase {
@@ -208,9 +203,8 @@
 
     if (routes.SECURITY_KEYS) {
       this.focusConfig.set(routes.SECURITY_KEYS.path, () => {
-        const toFocus =
-            this.shadowRoot!.querySelector<HTMLElement>(
-                '#security-keys-subpage-trigger');
+        const toFocus = this.shadowRoot!.querySelector<HTMLElement>(
+            '#security-keys-subpage-trigger');
         assert(toFocus);
         focusWithoutInk(toFocus);
       });
diff --git a/chrome/browser/resources/settings/reset_page/reset_page.ts b/chrome/browser/resources/settings/reset_page/reset_page.ts
index b73be133..d1a9064 100644
--- a/chrome/browser/resources/settings/reset_page/reset_page.ts
+++ b/chrome/browser/resources/settings/reset_page/reset_page.ts
@@ -27,7 +27,7 @@
 // </if>
 
 import {routes} from '../route.js';
-import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
+import {Route, RouteObserverMixin, Router} from '../router.js';
 
 import {getTemplate} from './reset_page.html.js';
 import {SettingsResetProfileDialogElement} from './reset_profile_dialog.js';
@@ -40,8 +40,7 @@
 }
 
 const SettingsResetPageElementBase =
-    RouteObserverMixin(BaseMixin(PolymerElement)) as
-    {new (): PolymerElement & RouteObserverMixinInterface};
+    RouteObserverMixin(BaseMixin(PolymerElement));
 
 export class SettingsResetPageElement extends SettingsResetPageElementBase {
   static get is() {
diff --git a/chrome/browser/resources/settings/settings_main/settings_main.ts b/chrome/browser/resources/settings/settings_main/settings_main.ts
index fc6b267..1b45973 100644
--- a/chrome/browser/resources/settings/settings_main/settings_main.ts
+++ b/chrome/browser/resources/settings/settings_main/settings_main.ts
@@ -25,7 +25,7 @@
 import {loadTimeData} from '../i18n_setup.js';
 import {PageVisibility} from '../page_visibility.js';
 import {routes} from '../route.js';
-import {RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
+import {RouteObserverMixin, Router} from '../router.js';
 
 import {getTemplate} from './settings_main.html.js';
 
@@ -40,8 +40,7 @@
   };
 }
 
-const SettingsMainElementBase = RouteObserverMixin(PolymerElement) as
-    {new (): PolymerElement & RouteObserverMixinInterface};
+const SettingsMainElementBase = RouteObserverMixin(PolymerElement);
 
 export class SettingsMainElement extends SettingsMainElementBase {
   static get is() {
diff --git a/chrome/browser/resources/settings/settings_menu/settings_menu.ts b/chrome/browser/resources/settings/settings_menu/settings_menu.ts
index f4d6a8e..73d14937 100644
--- a/chrome/browser/resources/settings/settings_menu/settings_menu.ts
+++ b/chrome/browser/resources/settings/settings_menu/settings_menu.ts
@@ -22,7 +22,7 @@
 
 import {PageVisibility} from '../page_visibility.js';
 import {routes} from '../route.js';
-import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
+import {Route, RouteObserverMixin, Router} from '../router.js';
 
 import {getTemplate} from './settings_menu.html.js';
 
@@ -34,8 +34,7 @@
   };
 }
 
-const SettingsMenuElementBase = RouteObserverMixin(PolymerElement) as
-    {new (): PolymerElement & RouteObserverMixinInterface};
+const SettingsMenuElementBase = RouteObserverMixin(PolymerElement);
 
 export class SettingsMenuElement extends SettingsMenuElementBase {
   static get is() {
diff --git a/chrome/browser/resources/settings/settings_page/settings_animated_pages.ts b/chrome/browser/resources/settings/settings_page/settings_animated_pages.ts
index 71ed9c3..6601dde 100644
--- a/chrome/browser/resources/settings/settings_page/settings_animated_pages.ts
+++ b/chrome/browser/resources/settings/settings_page/settings_animated_pages.ts
@@ -18,12 +18,11 @@
 
 import {assert} from '//resources/js/assert_ts.js';
 import {focusWithoutInk} from '//resources/js/focus_without_ink.js';
-
 import {IronPagesElement} from '//resources/polymer/v3_0/iron-pages/iron-pages.js';
 import {DomIf, FlattenedNodesObserver, microTask, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {FocusConfig} from '../focus_config.js';
-import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
+import {Route, RouteObserverMixin, Router} from '../router.js';
 
 import {getTemplate} from './settings_animated_pages.html.js';
 import {SettingsSubpageElement} from './settings_subpage.js';
@@ -34,8 +33,7 @@
   };
 }
 
-const SettingsAnimatedPagesElementBase = RouteObserverMixin(PolymerElement) as
-    {new (): PolymerElement & RouteObserverMixinInterface};
+const SettingsAnimatedPagesElementBase = RouteObserverMixin(PolymerElement);
 
 class SettingsAnimatedPagesElement extends SettingsAnimatedPagesElementBase {
   static get is() {
diff --git a/chrome/browser/resources/settings/settings_ui/settings_ui.ts b/chrome/browser/resources/settings/settings_ui/settings_ui.ts
index 142149a..0974373 100644
--- a/chrome/browser/resources/settings/settings_ui/settings_ui.ts
+++ b/chrome/browser/resources/settings/settings_ui/settings_ui.ts
@@ -23,10 +23,10 @@
 import '../settings_shared.css.js';
 import '../settings_vars.css.js';
 
-import {CrContainerShadowMixin, CrContainerShadowMixinInterface} from 'chrome://resources/cr_elements/cr_container_shadow_mixin.js';
+import {CrContainerShadowMixin} from 'chrome://resources/cr_elements/cr_container_shadow_mixin.js';
 import {CrDrawerElement} from 'chrome://resources/cr_elements/cr_drawer/cr_drawer.js';
 import {CrToolbarElement} from 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar.js';
-import {FindShortcutMixin, FindShortcutMixinInterface} from 'chrome://resources/cr_elements/find_shortcut_mixin.js';
+import {FindShortcutMixin} from 'chrome://resources/cr_elements/find_shortcut_mixin.js';
 import {listenOnce} from 'chrome://resources/js/util_ts.js';
 import {DomIf, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
@@ -35,7 +35,7 @@
 import {PageVisibility, pageVisibility} from '../page_visibility.js';
 import {SettingsPrefsElement} from '../prefs/prefs.js';
 import {routes} from '../route.js';
-import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
+import {Route, RouteObserverMixin, Router} from '../router.js';
 import {SettingsMainElement} from '../settings_main/settings_main.js';
 import {SettingsMenuElement} from '../settings_menu/settings_menu.js';
 
@@ -59,11 +59,8 @@
   };
 }
 
-const SettingsUiElementBase = RouteObserverMixin(CrContainerShadowMixin(
-                                  FindShortcutMixin(PolymerElement))) as {
-  new (): PolymerElement & RouteObserverMixinInterface &
-      FindShortcutMixinInterface & CrContainerShadowMixinInterface,
-};
+const SettingsUiElementBase = RouteObserverMixin(
+    CrContainerShadowMixin(FindShortcutMixin(PolymerElement)));
 
 export class SettingsUiElement extends SettingsUiElementBase {
   static get is() {
diff --git a/chrome/browser/resources/settings/site_settings/all_sites.ts b/chrome/browser/resources/settings/site_settings/all_sites.ts
index 0becb4dc..01b187c8 100644
--- a/chrome/browser/resources/settings/site_settings/all_sites.ts
+++ b/chrome/browser/resources/settings/site_settings/all_sites.ts
@@ -23,8 +23,8 @@
 import {CrActionMenuElement} from 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js';
 import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
 import {CrLazyRenderElement} from 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.js';
-import {I18nMixin, I18nMixinInterface} from 'chrome://resources/cr_elements/i18n_mixin.js';
-import {WebUiListenerMixin, WebUiListenerMixinInterface} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
+import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
 import {afterNextRender, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -32,11 +32,11 @@
 import {GlobalScrollTargetMixin} from '../global_scroll_target_mixin.js';
 import {loadTimeData} from '../i18n_setup.js';
 import {routes} from '../route.js';
-import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
+import {Route, RouteObserverMixin, Router} from '../router.js';
 
 import {getTemplate} from './all_sites.html.js';
 import {AllSitesAction2, AllSitesDialog, ContentSetting, SortMethod} from './constants.js';
-import {SiteSettingsMixin, SiteSettingsMixinInterface} from './site_settings_mixin.js';
+import {SiteSettingsMixin} from './site_settings_mixin.js';
 import {OriginInfo, SiteGroup} from './site_settings_prefs_browser_proxy.js';
 
 interface ActionMenuModel {
@@ -78,19 +78,8 @@
   };
 }
 
-// TODO(crbug.com/1234307): Remove when RouteObserverMixin is converted to
-// TypeScript.
-type Constructor<T> = new (...args: any[]) => T;
-
-const AllSitesElementBaseTemp = GlobalScrollTargetMixin(
-    RouteObserverMixin(
-        WebUiListenerMixin(I18nMixin(SiteSettingsMixin(PolymerElement)))) as
-    unknown as Constructor<PolymerElement>);
-
-const AllSitesElementBase = AllSitesElementBaseTemp as unknown as {
-  new (): PolymerElement & I18nMixinInterface & WebUiListenerMixinInterface &
-      SiteSettingsMixinInterface & RouteObserverMixinInterface,
-};
+const AllSitesElementBase = GlobalScrollTargetMixin(RouteObserverMixin(
+    WebUiListenerMixin(I18nMixin(SiteSettingsMixin(PolymerElement)))));
 
 const FPS_RELATED_SEARCH_PREFIX: string = 'related:';
 
diff --git a/chrome/browser/resources/settings/site_settings/site_details.ts b/chrome/browser/resources/settings/site_settings/site_details.ts
index 28be77e..ea1c9f7 100644
--- a/chrome/browser/resources/settings/site_settings/site_details.ts
+++ b/chrome/browser/resources/settings/site_settings/site_details.ts
@@ -24,21 +24,21 @@
 import './site_details_permission.js';
 
 import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
+import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {focusWithoutInk} from 'chrome://resources/js/focus_without_ink.js';
-import {I18nMixin, I18nMixinInterface} from 'chrome://resources/cr_elements/i18n_mixin.js';
-import {WebUiListenerMixin, WebUiListenerMixinInterface} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {loadTimeData} from '../i18n_setup.js';
 import {MetricsBrowserProxyImpl, PrivacyElementInteractions} from '../metrics_browser_proxy.js';
 import {routes} from '../route.js';
-import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
+import {Route, RouteObserverMixin, Router} from '../router.js';
 
 import {ContentSetting, ContentSettingsTypes} from './constants.js';
 import {getTemplate} from './site_details.html.js';
 import {SiteDetailsPermissionElement} from './site_details_permission.js';
-import {SiteSettingsMixin, SiteSettingsMixinInterface} from './site_settings_mixin.js';
+import {SiteSettingsMixin} from './site_settings_mixin.js';
 import {WebsiteUsageBrowserProxy, WebsiteUsageBrowserProxyImpl} from './website_usage_browser_proxy.js';
 
 export interface SiteDetailsElement {
@@ -52,13 +52,8 @@
   };
 }
 
-const SiteDetailsElementBase =
-    RouteObserverMixin(
-        SiteSettingsMixin(WebUiListenerMixin(I18nMixin(PolymerElement)))) as {
-      new (): PolymerElement & I18nMixinInterface &
-          WebUiListenerMixinInterface & SiteSettingsMixinInterface &
-          RouteObserverMixinInterface,
-    };
+const SiteDetailsElementBase = RouteObserverMixin(
+    SiteSettingsMixin(WebUiListenerMixin(I18nMixin(PolymerElement))));
 
 export class SiteDetailsElement extends SiteDetailsElementBase {
   static get is() {
diff --git a/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.ts b/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.ts
index bf53c7cc..04efc61 100644
--- a/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.ts
+++ b/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.ts
@@ -8,9 +8,9 @@
 import '../settings_shared.css.js';
 import '../i18n_setup.js';
 
-import {I18nMixin, I18nMixinInterface} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
 import {CrTooltipIconElement} from 'chrome://resources/cr_elements/policy/cr_tooltip_icon.js';
-import {WebUiListenerMixin, WebUiListenerMixinInterface} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
+import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {focusWithoutInk} from 'chrome://resources/js/focus_without_ink.js';
 import {PaperTooltipElement} from 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.js';
@@ -18,11 +18,11 @@
 
 import {FocusConfig} from '../focus_config.js';
 import {routes} from '../route.js';
-import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
+import {Route, RouteObserverMixin, Router} from '../router.js';
 import {AllSitesAction2, ContentSetting, ContentSettingsTypes, SiteSettingSource} from '../site_settings/constants.js';
-import {SiteSettingsMixin, SiteSettingsMixinInterface} from '../site_settings/site_settings_mixin.js';
+import {SiteSettingsMixin} from '../site_settings/site_settings_mixin.js';
 import {RawSiteException, RecentSitePermissions} from '../site_settings/site_settings_prefs_browser_proxy.js';
-import {TooltipMixin, TooltipMixinInterface} from '../tooltip_mixin.js';
+import {TooltipMixin} from '../tooltip_mixin.js';
 
 import {getTemplate} from './recent_site_permissions.html.js';
 import {getLocalizationStringForContentType} from './site_settings_page_util.js';
@@ -35,11 +35,7 @@
 
 const SettingsRecentSitePermissionsElementBase =
     TooltipMixin(RouteObserverMixin(
-        SiteSettingsMixin(WebUiListenerMixin(I18nMixin(PolymerElement))))) as {
-      new (): PolymerElement & I18nMixinInterface &
-          WebUiListenerMixinInterface & SiteSettingsMixinInterface &
-          RouteObserverMixinInterface & TooltipMixinInterface,
-    };
+        SiteSettingsMixin(WebUiListenerMixin(I18nMixin(PolymerElement)))));
 
 export class SettingsRecentSitePermissionsElement extends
     SettingsRecentSitePermissionsElementBase {
@@ -295,9 +291,8 @@
       assert(!!toFocus);
       focusWithoutInk(toFocus);
     } else {
-      const toFocus =
-          this.shadowRoot!.querySelector<HTMLElement>(
-              `#siteEntryButton_${index}`);
+      const toFocus = this.shadowRoot!.querySelector<HTMLElement>(
+          `#siteEntryButton_${index}`);
       assert(!!toFocus);
       focusWithoutInk(toFocus);
     }
diff --git a/chrome/browser/resources/side_panel/bookmarks/bookmarks_api_proxy.ts b/chrome/browser/resources/side_panel/bookmarks/bookmarks_api_proxy.ts
index c4a9c61..c50b2f9 100644
--- a/chrome/browser/resources/side_panel/bookmarks/bookmarks_api_proxy.ts
+++ b/chrome/browser/resources/side_panel/bookmarks/bookmarks_api_proxy.ts
@@ -13,9 +13,9 @@
   callbackRouter: {[key: string]: ChromeEvent<Function>};
   bookmarkCurrentTabInFolder(folderId: string): void;
   cutBookmark(id: string): void;
-  contextMenuOpenBookmarkInNewTab(id: string, source: ActionSource): void;
-  contextMenuOpenBookmarkInNewWindow(id: string, source: ActionSource): void;
-  contextMenuOpenBookmarkInIncognitoWindow(id: string, source: ActionSource):
+  contextMenuOpenBookmarkInNewTab(ids: string[], source: ActionSource): void;
+  contextMenuOpenBookmarkInNewWindow(ids: string[], source: ActionSource): void;
+  contextMenuOpenBookmarkInIncognitoWindow(ids: string[], source: ActionSource):
       void;
   contextMenuDelete(id: string, source: ActionSource): void;
   copyBookmark(id: string): Promise<void>;
@@ -62,16 +62,19 @@
     chrome.bookmarkManagerPrivate.cut([id]);
   }
 
-  contextMenuOpenBookmarkInNewTab(id: string, source: ActionSource) {
-    this.handler.executeOpenInNewTabCommand(BigInt(id), source);
+  contextMenuOpenBookmarkInNewTab(ids: string[], source: ActionSource) {
+    this.handler.executeOpenInNewTabCommand(ids.map(id => BigInt(id)), source);
   }
 
-  contextMenuOpenBookmarkInNewWindow(id: string, source: ActionSource) {
-    this.handler.executeOpenInNewWindowCommand(BigInt(id), source);
+  contextMenuOpenBookmarkInNewWindow(ids: string[], source: ActionSource) {
+    this.handler.executeOpenInNewWindowCommand(
+        ids.map(id => BigInt(id)), source);
   }
 
-  contextMenuOpenBookmarkInIncognitoWindow(id: string, source: ActionSource) {
-    this.handler.executeOpenInIncognitoWindowCommand(BigInt(id), source);
+  contextMenuOpenBookmarkInIncognitoWindow(
+      ids: string[], source: ActionSource) {
+    this.handler.executeOpenInIncognitoWindowCommand(
+        ids.map(id => BigInt(id)), source);
   }
 
   contextMenuDelete(id: string, source: ActionSource) {
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.html b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.html
index 0ca96fc3..54d57607 100644
--- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.html
+++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.html
@@ -11,7 +11,7 @@
 </style>
 
 <cr-action-menu id="menu">
-  <template is="dom-repeat" items="[[getMenuItemsForBookmark_(bookmark_)]]">
+  <template is="dom-repeat" items="[[getMenuItemsForBookmarks_(bookmarks_)]]">
     <template is="dom-if" if="[[!showDivider_(item)]]" restamp>
       <button class="dropdown-item" on-click="onMenuItemClicked_">
         [[item.label]]
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.ts
index 391579b3..05e83c21 100644
--- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.ts
+++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.ts
@@ -46,57 +46,62 @@
 
   static get properties() {
     return {
-      bookmark_: Object,
-
-      depth_: Number,
+      bookmarks_: Array,
     };
   }
 
   private bookmarksApi_: BookmarksApiProxy =
       BookmarksApiProxyImpl.getInstance();
-  private bookmark_: chrome.bookmarks.BookmarkTreeNode;
-  private depth_: number;
+  private bookmarks_: chrome.bookmarks.BookmarkTreeNode[];
 
-  showAt(
-      event: MouseEvent, bookmark: chrome.bookmarks.BookmarkTreeNode,
-      depth: number) {
-    this.bookmark_ = bookmark;
-    this.depth_ = depth;
+  showAt(event: MouseEvent, bookmarks: chrome.bookmarks.BookmarkTreeNode[]) {
+    this.bookmarks_ = bookmarks;
     this.$.menu.showAt(event.target as HTMLElement);
   }
 
   showAtPosition(
-      event: MouseEvent, bookmark: chrome.bookmarks.BookmarkTreeNode,
-      depth: number) {
-    this.bookmark_ = bookmark;
-    this.depth_ = depth;
+      event: MouseEvent, bookmarks: chrome.bookmarks.BookmarkTreeNode[]) {
+    this.bookmarks_ = bookmarks;
     this.$.menu.showAtPosition({top: event.clientY, left: event.clientX});
   }
 
-  private getMenuItemsForBookmark_(): MenuItem[] {
-    let menuItems: MenuItem[] = [
+  private getMenuItemsForBookmarks_(): MenuItem[] {
+    const menuItems: MenuItem[] = [
       {
         id: MenuItemId.OPEN_NEW_TAB,
-        label: loadTimeData.getString('menuOpenNewTab'),
+        label: this.bookmarks_.length === 1 ?
+            loadTimeData.getString('menuOpenNewTab') :
+            loadTimeData.getStringF(
+                'menuOpenNewTabWithCount', this.bookmarks_.length),
       },
       {
         id: MenuItemId.OPEN_NEW_WINDOW,
-        label: loadTimeData.getString('menuOpenNewWindow'),
+        label: this.bookmarks_.length === 1 ?
+            loadTimeData.getString('menuOpenNewWindow') :
+            loadTimeData.getStringF(
+                'menuOpenNewWindowWithCount', this.bookmarks_.length),
       },
     ];
 
     if (!loadTimeData.getBoolean('incognitoMode')) {
       menuItems.push({
         id: MenuItemId.OPEN_INCOGNITO,
-        label: loadTimeData.getString('menuOpenIncognito'),
+        label: this.bookmarks_.length === 1 ?
+            loadTimeData.getString('menuOpenIncognito') :
+            loadTimeData.getStringF(
+                'menuOpenIncognitoWithCount', this.bookmarks_.length),
       });
     }
 
-    if (this.bookmark_.id !== loadTimeData.getString('bookmarksBarId')) {
-      menuItems = menuItems.concat([
-        {id: MenuItemId.DIVIDER},
-        {id: MenuItemId.DELETE, label: loadTimeData.getString('tooltipDelete')},
-      ]);
+    if (this.bookmarks_.length === 1 &&
+        this.bookmarks_[0]!.id !== loadTimeData.getString('bookmarksBarId')) {
+      menuItems.push(
+          {id: MenuItemId.DIVIDER},
+          {
+            id: MenuItemId.DELETE,
+            label: loadTimeData.getString('tooltipDelete'),
+          },
+      );
     }
 
     return menuItems;
@@ -112,19 +117,24 @@
     switch (event.model.item.id) {
       case MenuItemId.OPEN_NEW_TAB:
         this.bookmarksApi_.contextMenuOpenBookmarkInNewTab(
-            this.bookmark_!.id, ActionSource.kBookmark);
+            this.bookmarks_.map(bookmark => bookmark.id),
+            ActionSource.kBookmark);
         break;
       case MenuItemId.OPEN_NEW_WINDOW:
         this.bookmarksApi_.contextMenuOpenBookmarkInNewWindow(
-            this.bookmark_!.id, ActionSource.kBookmark);
+            this.bookmarks_.map(bookmark => bookmark.id),
+            ActionSource.kBookmark);
         break;
       case MenuItemId.OPEN_INCOGNITO:
         this.bookmarksApi_.contextMenuOpenBookmarkInIncognitoWindow(
-            this.bookmark_!.id, ActionSource.kBookmark);
+            this.bookmarks_.map(bookmark => bookmark.id),
+            ActionSource.kBookmark);
         break;
       case MenuItemId.DELETE:
+        // Not expected to ever be called when this.bookmarks_ has more than
+        // one entry.
         this.bookmarksApi_.contextMenuDelete(
-            this.bookmark_!.id, ActionSource.kBookmark);
+            this.bookmarks_[0]!.id, ActionSource.kBookmark);
         break;
     }
     this.$.menu.close();
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html
index fb971a5..7b37a1af 100644
--- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html
+++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html
@@ -92,6 +92,11 @@
     padding: 14px;
   }
 
+  .edit-icons {
+    display: flex;
+    gap: 16px;
+  }
+
   .empty {
     align-items: center;
     display: flex;
@@ -263,6 +268,7 @@
         <iron-icon icon="bookmarks:filter-list"></iron-icon>
       </cr-button>
       <cr-icon-button iron-icon="bookmarks:create-new-folder"
+          disabled="[[editing_]]"
           aria-label="$i18n{createNewFolderA11yLabel}"
           on-click="onAddNewFolderClicked_"></cr-icon-button>
       <cr-icon-button class="icon-edit" disabled="[[!shownBookmarks_.length]]"
@@ -335,7 +341,13 @@
       <div class="edit-icons">
         <cr-icon-button iron-icon="bookmarks:delete"
             disabled="[[!selectedBookmarks_.length]]"
-            aria-label="$i18n{tooltipDelete}" on-click="onDeleteClicked_">
+            title="$i18n{tooltipDelete}" aria-label="$i18n{tooltipDelete}"
+            on-click="onDeleteClicked_">
+        </cr-icon-button>
+        <cr-icon-button iron-icon="cr:more-vert"
+            disabled="[[!selectedBookmarks_.length]]"
+            title="$i18n{tooltipMore}" aria-label="$i18n{tooltipMore}"
+            on-click="onEditMenuClicked_">
         </cr-icon-button>
       </div>
     </div>
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
index 1111862..3d872d9 100644
--- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
+++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
@@ -684,12 +684,10 @@
     event.stopPropagation();
     if (event.detail.event.button === 0) {
       this.$.contextMenu.get().showAt(
-          event.detail.event, event.detail.bookmark,
-          this.activeFolderPath_.length);
+          event.detail.event, [event.detail.bookmark]);
     } else {
       this.$.contextMenu.get().showAtPosition(
-          event.detail.event, event.detail.bookmark,
-          this.activeFolderPath_.length);
+          event.detail.event, [event.detail.bookmark]);
     }
   }
 
@@ -735,6 +733,12 @@
         });
   }
 
+  private onEditMenuClicked_(event: MouseEvent) {
+    event.preventDefault();
+    event.stopPropagation();
+    this.$.contextMenu.get().showAt(event, this.selectedBookmarks_.slice());
+  }
+
   private onSortTypeClicked_(event: DomRepeatEvent<string>) {
     event.preventDefault();
     event.stopPropagation();
diff --git a/chrome/browser/resources/web_app_internals/index.html b/chrome/browser/resources/web_app_internals/index.html
deleted file mode 100644
index 00ad4de..0000000
--- a/chrome/browser/resources/web_app_internals/index.html
+++ /dev/null
@@ -1,2 +0,0 @@
-This page has moved to:
-<a href="chrome://web-app-internals">chrome://web-app-internals</a>
diff --git a/chrome/browser/subresource_filter/subresource_filter_browsertest.cc b/chrome/browser/subresource_filter/subresource_filter_browsertest.cc
index d21ba5b..85a9dda8 100644
--- a/chrome/browser/subresource_filter/subresource_filter_browsertest.cc
+++ b/chrome/browser/subresource_filter/subresource_filter_browsertest.cc
@@ -518,7 +518,7 @@
 
   // Will return false if the navigation was successfully aborted.
   ASSERT_FALSE(manager.WaitForResponse());
-  manager.WaitForNavigationFinished();
+  ASSERT_TRUE(manager.WaitForNavigationFinished());
 
   // Now, dynamically insert a frame and expect that it is still activated.
   ASSERT_NO_FATAL_FAILURE(InsertDynamicFrameWithScript());
@@ -1194,7 +1194,7 @@
   auto* child_rfh =
       navigation_manager.GetNavigationHandle()->GetRenderFrameHost();
   ASSERT_TRUE(child_rfh);
-  navigation_manager.WaitForNavigationFinished();
+  ASSERT_TRUE(navigation_manager.WaitForNavigationFinished());
   ASSERT_EQ(child_rfh->GetLastCommittedURL(), kFrameUrl);
 
   // Wait until the iframe is loaded.
diff --git a/chrome/browser/sync/sync_service_factory.cc b/chrome/browser/sync/sync_service_factory.cc
index 6aedbbd..023b57d 100644
--- a/chrome/browser/sync/sync_service_factory.cc
+++ b/chrome/browser/sync/sync_service_factory.cc
@@ -119,7 +119,6 @@
     (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
   syncer::SyncPrefs prefs(profile->GetPrefs());
   local_sync_backend_enabled = prefs.IsLocalSyncEnabled();
-  base::UmaHistogramBoolean("Sync.Local.Enabled", local_sync_backend_enabled);
   if (init_params.is_regular_profile_for_uma) {
     base::UmaHistogramBoolean("Sync.Local.Enabled2",
                               local_sync_backend_enabled);
@@ -131,8 +130,6 @@
 
     // If the user has not specified a folder and we can't get the default
     // roaming profile location the sync service will not be created.
-    base::UmaHistogramBoolean("Sync.Local.RoamingProfileUnavailable",
-                              local_sync_backend_folder.empty());
     if (init_params.is_regular_profile_for_uma) {
       base::UmaHistogramBoolean("Sync.Local.RoamingProfileUnavailable2",
                                 local_sync_backend_folder.empty());
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_controller.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_controller.cc
index f80ad5e..b8ac98e 100644
--- a/chrome/browser/ui/ash/shelf/chrome_shelf_controller.cc
+++ b/chrome/browser/ui/ash/shelf/chrome_shelf_controller.cc
@@ -1458,12 +1458,8 @@
     const Profile* profile) {
   // This function cannot rely on the controller's enumeration functionality
   // since the extension has already been unloaded.
-  const BrowserList* browser_list = BrowserList::GetInstance();
   std::vector<Browser*> browser_to_close;
-  for (BrowserList::const_reverse_iterator it =
-           browser_list->begin_browsers_ordered_by_activation();
-       it != browser_list->end_browsers_ordered_by_activation(); ++it) {
-    Browser* browser = *it;
+  for (Browser* browser : BrowserList::GetInstance()->OrderedByActivation()) {
     if ((browser->is_type_app() || browser->is_type_app_popup()) &&
         app_id == web_app::GetAppIdFromApplicationName(browser->app_name()) &&
         profile == browser->profile()) {
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_browsertest.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_browsertest.cc
index ceafb3c..cda764f 100644
--- a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_browsertest.cc
+++ b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_browsertest.cc
@@ -2298,13 +2298,9 @@
 
   // Find the browser which holds our app.
   Browser* app_browser = nullptr;
-  const BrowserList* browser_list = BrowserList::GetInstance();
-  for (BrowserList::const_reverse_iterator it =
-           browser_list->begin_browsers_ordered_by_activation();
-       it != browser_list->end_browsers_ordered_by_activation() && !app_browser;
-       ++it) {
-    if ((*it)->is_type_app()) {
-      app_browser = *it;
+  for (Browser* browser : BrowserList::GetInstance()->OrderedByActivation()) {
+    if (browser->is_type_app()) {
+      app_browser = browser;
       break;
     }
   }
diff --git a/chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.cc b/chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.cc
index 45171e9..16a76bcf 100644
--- a/chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.cc
+++ b/chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.cc
@@ -264,11 +264,7 @@
 
   // Look through all the windows, find a browser for this app. Prefer the most
   // recently active app window.
-  BrowserList* const browser_list = BrowserList::GetInstance();
-  const auto end = browser_list->end_browsers_ordered_by_activation();
-  for (auto iter = browser_list->begin_browsers_ordered_by_activation();
-       iter != end; ++iter) {
-    Browser* const browser = *iter;
+  for (Browser* browser : BrowserList::GetInstance()->OrderedByActivation()) {
     if (browser->profile() != profile || browser->type() != browser_type)
       continue;
 
diff --git a/chrome/browser/ui/browser_list.h b/chrome/browser/ui/browser_list.h
index c2b051fd..2d302f9 100644
--- a/chrome/browser/ui/browser_list.h
+++ b/chrome/browser/ui/browser_list.h
@@ -37,6 +37,21 @@
   using const_iterator = BrowserVector::const_iterator;
   using const_reverse_iterator = BrowserVector::const_reverse_iterator;
 
+  struct BrowsersOrderedByActivationRange {
+    // Stack allocated only to reduce risk of out of bounds lifetime with
+    // |browser_list|.
+    void* operator new(size_t) = delete;
+    void* operator new(size_t, void*) = delete;
+
+    const BrowserList& browser_list;
+    const_reverse_iterator begin() const {
+      return browser_list.begin_browsers_ordered_by_activation();
+    }
+    const_reverse_iterator end() const {
+      return browser_list.end_browsers_ordered_by_activation();
+    }
+  };
+
   BrowserList(const BrowserList&) = delete;
   BrowserList& operator=(const BrowserList&) = delete;
 
@@ -61,6 +76,13 @@
     return browsers_ordered_by_activation_.rend();
   }
 
+  // Convenience method for iterating over browsers in activation order.
+  // Example:
+  // for (Browser* browser : BrowserList::GetInstance()->OrderedByActivation())
+  BrowsersOrderedByActivationRange OrderedByActivation() const {
+    return {*this};
+  }
+
   // Returns the set of browsers that are currently in the closing state.
   const BrowserSet& currently_closing_browsers() const {
     return currently_closing_browsers_;
diff --git a/chrome/browser/ui/browser_tab_menu_model_delegate.cc b/chrome/browser/ui/browser_tab_menu_model_delegate.cc
index 2362d275..b847785 100644
--- a/chrome/browser/ui/browser_tab_menu_model_delegate.cc
+++ b/chrome/browser/ui/browser_tab_menu_model_delegate.cc
@@ -19,12 +19,7 @@
 BrowserTabMenuModelDelegate::GetExistingWindowsForMoveMenu() {
   std::vector<Browser*> browsers;
 
-  const BrowserList* browser_list = BrowserList::GetInstance();
-  for (BrowserList::const_reverse_iterator it =
-           browser_list->begin_browsers_ordered_by_activation();
-       it != browser_list->end_browsers_ordered_by_activation(); ++it) {
-    Browser* browser = *it;
-
+  for (Browser* browser : BrowserList::GetInstance()->OrderedByActivation()) {
     // We can only move into a tabbed view of the same profile, and not the same
     // window we're currently in.
     if (browser != browser_ && browser->is_type_normal() &&
diff --git a/chrome/browser/ui/commander/entity_match.cc b/chrome/browser/ui/commander/entity_match.cc
index e926e993..439ed0c7 100644
--- a/chrome/browser/ui/commander/entity_match.cc
+++ b/chrome/browser/ui/commander/entity_match.cc
@@ -120,14 +120,10 @@
                                               const std::u16string& input,
                                               bool match_profile) {
   std::vector<WindowMatch> results;
-  const BrowserList* browser_list = BrowserList::GetInstance();
   double mru_score = .95;
   FuzzyFinder finder(input);
   std::vector<gfx::Range> ranges;
-  for (BrowserList::const_reverse_iterator it =
-           browser_list->begin_browsers_ordered_by_activation();
-       it != browser_list->end_browsers_ordered_by_activation(); ++it) {
-    Browser* browser = *it;
+  for (Browser* browser : BrowserList::GetInstance()->OrderedByActivation()) {
     if (browser == browser_to_exclude || !browser->is_type_normal())
       continue;
     if (match_profile && browser->profile() != browser_to_exclude->profile())
diff --git a/chrome/browser/ui/side_panel/customize_chrome/customize_chrome_utils.cc b/chrome/browser/ui/side_panel/customize_chrome/customize_chrome_utils.cc
index fdad37f..144fe4dd 100644
--- a/chrome/browser/ui/side_panel/customize_chrome/customize_chrome_utils.cc
+++ b/chrome/browser/ui/side_panel/customize_chrome/customize_chrome_utils.cc
@@ -5,15 +5,12 @@
 #include "chrome/browser/ui/side_panel/customize_chrome/customize_chrome_utils.h"
 
 #include "base/feature_list.h"
-#include "chrome/browser/ui/ui_features.h"
 #include "components/search/ntp_features.h"
 
 namespace customize_chrome {
 
 bool IsSidePanelEnabled() {
-  return base::FeatureList::IsEnabled(
-             ntp_features::kCustomizeChromeSidePanel) &&
-         base::FeatureList::IsEnabled(features::kUnifiedSidePanel);
+  return base::FeatureList::IsEnabled(ntp_features::kCustomizeChromeSidePanel);
 }
 
 }  // namespace customize_chrome
diff --git a/chrome/browser/ui/side_search/side_search_utils.cc b/chrome/browser/ui/side_search/side_search_utils.cc
index 024084be..6337134 100644
--- a/chrome/browser/ui/side_search/side_search_utils.cc
+++ b/chrome/browser/ui/side_search/side_search_utils.cc
@@ -131,13 +131,11 @@
   return IsEnabledForBrowser(browser) &&
          IsDSESupportEnabled(browser->profile()) &&
          default_provider->IsSideSearchSupported() &&
-         base::FeatureList::IsEnabled(features::kSearchWebInSidePanel) &&
-         base::FeatureList::IsEnabled(features::kUnifiedSidePanel);
+         base::FeatureList::IsEnabled(features::kSearchWebInSidePanel);
 }
 
 bool ShouldUseUnifiedSidePanel() {
-  return base::FeatureList::IsEnabled(features::kSideSearchDSESupport) &&
-         base::FeatureList::IsEnabled(features::kUnifiedSidePanel);
+  return base::FeatureList::IsEnabled(features::kSideSearchDSESupport);
 }
 
 }  // namespace side_search
diff --git a/chrome/browser/ui/singleton_tabs.cc b/chrome/browser/ui/singleton_tabs.cc
index 7e9db507..78617db 100644
--- a/chrome/browser/ui/singleton_tabs.cc
+++ b/chrome/browser/ui/singleton_tabs.cc
@@ -126,12 +126,7 @@
 std::pair<Browser*, int> GetIndexAndBrowserOfExistingTab(
     Profile* profile,
     const NavigateParams& params) {
-  for (auto browser_it =
-           BrowserList::GetInstance()->begin_browsers_ordered_by_activation();
-       browser_it !=
-       BrowserList::GetInstance()->end_browsers_ordered_by_activation();
-       ++browser_it) {
-    Browser* browser = *browser_it;
+  for (Browser* browser : BrowserList::GetInstance()->OrderedByActivation()) {
     // When tab switching, only look at same profile and anonymity level.
     if (profile == browser->profile()) {
       int index = GetIndexOfExistingTab(browser, params);
diff --git a/chrome/browser/ui/startup/default_browser_prompt.cc b/chrome/browser/ui/startup/default_browser_prompt.cc
index 14217b51..ad36c2d8 100644
--- a/chrome/browser/ui/startup/default_browser_prompt.cc
+++ b/chrome/browser/ui/startup/default_browser_prompt.cc
@@ -45,13 +45,7 @@
 void ShowPrompt() {
   // Show the default browser request prompt in the most recently active,
   // visible, tabbed browser. Do not show the prompt if no such browser exists.
-  BrowserList* browser_list = BrowserList::GetInstance();
-  for (auto browser_iterator =
-           browser_list->begin_browsers_ordered_by_activation();
-       browser_iterator != browser_list->end_browsers_ordered_by_activation();
-       ++browser_iterator) {
-    Browser* browser = *browser_iterator;
-
+  for (Browser* browser : BrowserList::GetInstance()->OrderedByActivation()) {
     // |browser| may be null in UI tests. Also, don't show the prompt in an app
     // window, which is not meant to be treated as a Chrome window. Only show in
     // a normal, tabbed browser.
diff --git a/chrome/browser/ui/tab_contents/core_tab_helper.cc b/chrome/browser/ui/tab_contents/core_tab_helper.cc
index 301bbbb3..451fcb9 100644
--- a/chrome/browser/ui/tab_contents/core_tab_helper.cc
+++ b/chrome/browser/ui/tab_contents/core_tab_helper.cc
@@ -147,7 +147,6 @@
 bool CoreTabHelper::IsSidePanelEnabledFor3PDse() {
   return IsSidePanelEnabled() &&
          !search::DefaultSearchProviderIsGoogle(GetTemplateURLService()) &&
-         base::FeatureList::IsEnabled(features::kUnifiedSidePanel) &&
          lens::features::GetEnableImageSearchUnifiedSidePanelFor3PDse();
 }
 
diff --git a/chrome/browser/ui/ui_features.cc b/chrome/browser/ui/ui_features.cc
index c40901d6..6d9c19c 100644
--- a/chrome/browser/ui/ui_features.cc
+++ b/chrome/browser/ui/ui_features.cc
@@ -295,10 +295,6 @@
              "TopChromeWebUIUsesSpareRenderer",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
-BASE_FEATURE(kUnifiedSidePanel,
-             "UnifiedSidePanel",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 // This enables enables persistence of a WebContents in a 1-to-1 association
 // with the current Profile for WebUI bubbles. See https://crbug.com/1177048.
 BASE_FEATURE(kWebUIBubblePerProfilePersistence,
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h
index 5f0efff..ed864b6 100644
--- a/chrome/browser/ui/ui_features.h
+++ b/chrome/browser/ui/ui_features.h
@@ -190,8 +190,6 @@
 
 BASE_DECLARE_FEATURE(kTopChromeWebUIUsesSpareRenderer);
 
-BASE_DECLARE_FEATURE(kUnifiedSidePanel);
-
 BASE_DECLARE_FEATURE(kWebUIBubblePerProfilePersistence);
 
 BASE_DECLARE_FEATURE(kWebUITabStrip);
diff --git a/chrome/browser/ui/user_notes/user_notes_controller.cc b/chrome/browser/ui/user_notes/user_notes_controller.cc
index 04ac964c..a59fb31 100644
--- a/chrome/browser/ui/user_notes/user_notes_controller.cc
+++ b/chrome/browser/ui/user_notes/user_notes_controller.cc
@@ -7,16 +7,13 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/tabs/tab_strip_user_gesture_details.h"
-#include "chrome/browser/ui/ui_features.h"
 #include "components/user_notes/browser/user_note_manager.h"
 #include "components/user_notes/user_notes_features.h"
 #include "content/public/browser/web_contents.h"
 
 // static
 bool UserNotesController::IsUserNotesSupported(Profile* profile) {
-  return user_notes::IsUserNotesEnabled() &&
-         base::FeatureList::IsEnabled(features::kUnifiedSidePanel) &&
-         !profile->IsGuestSession();
+  return user_notes::IsUserNotesEnabled() && !profile->IsGuestSession();
 }
 
 // static
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 5b57754..d87f3e9 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -936,18 +936,13 @@
   right_aligned_side_panel_separator_ =
       AddChildView(std::make_unique<ContentsSeparator>());
 
-  if (base::FeatureList::IsEnabled(features::kUnifiedSidePanel)) {
-    const bool is_right_aligned = GetProfile()->GetPrefs()->GetBoolean(
-        prefs::kSidePanelHorizontalAlignment);
-    unified_side_panel_ = AddChildView(std::make_unique<SidePanel>(
-        this,
-        is_right_aligned ? SidePanel::kAlignRight : SidePanel::kAlignLeft));
-    left_aligned_side_panel_separator_ =
-        AddChildView(std::make_unique<ContentsSeparator>());
-    side_panel_coordinator_ = std::make_unique<SidePanelCoordinator>(this);
-  } else {
-    unified_side_panel_ = AddChildView(std::make_unique<SidePanel>(this));
-  }
+  const bool is_right_aligned = GetProfile()->GetPrefs()->GetBoolean(
+      prefs::kSidePanelHorizontalAlignment);
+  unified_side_panel_ = AddChildView(std::make_unique<SidePanel>(
+      this, is_right_aligned ? SidePanel::kAlignRight : SidePanel::kAlignLeft));
+  left_aligned_side_panel_separator_ =
+      AddChildView(std::make_unique<ContentsSeparator>());
+  side_panel_coordinator_ = std::make_unique<SidePanelCoordinator>(this);
 
   if (side_search::IsEnabledForBrowser(browser_.get()) &&
       !side_search::ShouldUseUnifiedSidePanel()) {
diff --git a/chrome/browser/ui/views/lens/lens_side_panel_helper.cc b/chrome/browser/ui/views/lens/lens_side_panel_helper.cc
index f0f3c1e..139f401 100644
--- a/chrome/browser/ui/views/lens/lens_side_panel_helper.cc
+++ b/chrome/browser/ui/views/lens/lens_side_panel_helper.cc
@@ -55,15 +55,8 @@
 
 void OpenLensSidePanel(Browser* browser,
                        const content::OpenURLParams& url_params) {
-  if (base::FeatureList::IsEnabled(::features::kUnifiedSidePanel)) {
-    LensSidePanelCoordinator::GetOrCreateForBrowser(browser)
-        ->RegisterEntryAndShow(url_params);
-  } else {
-    // This code path should never be reachable, since Unified Side Panel is
-    // enabled by default with no option to turn it off after M111. However,
-    // until the flag is cleaned up, keep this in for robustness.
-    browser->OpenURL(url_params);
-  }
+  LensSidePanelCoordinator::GetOrCreateForBrowser(browser)
+      ->RegisterEntryAndShow(url_params);
 }
 
 views::Widget* OpenLensRegionSearchInstructions(
diff --git a/chrome/browser/ui/views/location_bar/location_icon_view_interactive_uitest.cc b/chrome/browser/ui/views/location_bar/location_icon_view_interactive_uitest.cc
index 0289769..b1d88eb 100644
--- a/chrome/browser/ui/views/location_bar/location_icon_view_interactive_uitest.cc
+++ b/chrome/browser/ui/views/location_bar/location_icon_view_interactive_uitest.cc
@@ -28,6 +28,7 @@
 };
 
 // Verify that clicking the location icon a second time hides the bubble.
+// TODO(crbug.com/1404640) flaky on mac11-arm64-rel, disabled via filter
 IN_PROC_BROWSER_TEST_F(LocationIconViewTest, HideOnSecondClick) {
   BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser());
   views::View* location_icon_view =
diff --git a/chrome/browser/ui/views/performance_controls/battery_saver_button_unittest.cc b/chrome/browser/ui/views/performance_controls/battery_saver_button_unittest.cc
index 6d30943..268e196 100644
--- a/chrome/browser/ui/views/performance_controls/battery_saver_button_unittest.cc
+++ b/chrome/browser/ui/views/performance_controls/battery_saver_button_unittest.cc
@@ -17,6 +17,7 @@
 #include "components/performance_manager/public/features.h"
 #include "components/performance_manager/public/user_tuning/prefs.h"
 #include "components/prefs/testing_pref_service.h"
+#include "ui/accessibility/ax_node_data.h"
 #include "ui/events/event_utils.h"
 #include "ui/views/bubble/bubble_dialog_model_host.h"
 #include "ui/views/interaction/element_tracker_views.h"
diff --git a/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_platform_impl_desktop.cc b/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_platform_impl_desktop.cc
index cbf2a316..7e52ea2 100644
--- a/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_platform_impl_desktop.cc
+++ b/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_platform_impl_desktop.cc
@@ -17,12 +17,10 @@
 
 // Returns the last active tabbed browser.
 Browser* FindLastActiveTabbedBrowser() {
-  BrowserList* browser_list = BrowserList::GetInstance();
-  const auto end = browser_list->end_browsers_ordered_by_activation();
-  for (auto scan = browser_list->begin_browsers_ordered_by_activation();
-       scan != end; ++scan) {
-    if ((*scan)->is_type_normal())
-      return *scan;
+  for (Browser* browser : BrowserList::GetInstance()->OrderedByActivation()) {
+    if (browser->is_type_normal()) {
+      return browser;
+    }
   }
   return nullptr;
 }
diff --git a/chrome/browser/ui/views/side_panel/side_panel.cc b/chrome/browser/ui/views/side_panel/side_panel.cc
index 22d09142..6067e874 100644
--- a/chrome/browser/ui/views/side_panel/side_panel.cc
+++ b/chrome/browser/ui/views/side_panel/side_panel.cc
@@ -168,18 +168,14 @@
       resize_area_(
           AddChildView(std::make_unique<views::SidePanelResizeArea>(this))),
       horizontal_alignment_(horizontal_alignment) {
-  if (base::FeatureList::IsEnabled(features::kUnifiedSidePanel)) {
-    pref_change_registrar_.Init(browser_view->GetProfile()->GetPrefs());
+  pref_change_registrar_.Init(browser_view->GetProfile()->GetPrefs());
 
-    // base::Unretained is safe since the side panel must be attached to some
-    // BrowserView. Deleting BrowserView will also delete the SidePanel.
-    pref_change_registrar_.Add(
-        prefs::kSidePanelHorizontalAlignment,
-        base::BindRepeating(&BrowserView::UpdateSidePanelHorizontalAlignment,
-                            base::Unretained(browser_view)));
-  } else {
-    resize_area_->SetVisible(false);
-  }
+  // base::Unretained is safe since the side panel must be attached to some
+  // BrowserView. Deleting BrowserView will also delete the SidePanel.
+  pref_change_registrar_.Add(
+      prefs::kSidePanelHorizontalAlignment,
+      base::BindRepeating(&BrowserView::UpdateSidePanelHorizontalAlignment,
+                          base::Unretained(browser_view)));
 
   SetVisible(false);
   SetLayoutManager(std::make_unique<views::FillLayout>());
diff --git a/chrome/browser/ui/views/side_panel/side_panel_web_ui_view.cc b/chrome/browser/ui/views/side_panel/side_panel_web_ui_view.cc
index 6a2eb91..8add145d 100644
--- a/chrome/browser/ui/views/side_panel/side_panel_web_ui_view.cc
+++ b/chrome/browser/ui/views/side_panel/side_panel_web_ui_view.cc
@@ -12,7 +12,6 @@
 #include "chrome/browser/ui/bookmarks/bookmark_utils.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_window.h"
-#include "chrome/browser/ui/ui_features.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/side_panel/side_panel_content_proxy.h"
 #include "chrome/browser/ui/views/side_panel/side_panel_util.h"
@@ -37,23 +36,6 @@
 
 void SidePanelWebUIView::SetVisible(bool visible) {
   views::WebView::SetVisible(visible);
-  if (base::FeatureList::IsEnabled(features::kUnifiedSidePanel))
-    return;
-  base::RecordAction(
-      base::UserMetricsAction(visible ? "SidePanel.Show" : "SidePanel.Hide"));
-  auto* browser_window = BrowserWindow::FindBrowserWindowWithWebContents(
-      contents_wrapper_->web_contents());
-  if (!visible || !browser_window)
-    return;
-  // Record usage for side panel promo.
-  feature_engagement::TrackerFactory::GetForBrowserContext(
-      Profile::FromBrowserContext(
-          contents_wrapper_->web_contents()->GetBrowserContext()))
-      ->NotifyEvent("side_panel_shown");
-
-  // Close IPH for side panel if shown.
-  browser_window->CloseFeaturePromo(
-      feature_engagement::kIPHReadingListInSidePanelFeature);
 }
 
 SidePanelWebUIView::~SidePanelWebUIView() = default;
@@ -70,8 +52,6 @@
 void SidePanelWebUIView::ShowUI() {
   SetVisible(true);
   SidePanelUtil::GetSidePanelContentProxy(this)->SetAvailable(true);
-  if (!base::FeatureList::IsEnabled(features::kUnifiedSidePanel))
-    RequestFocus();
   if (on_show_cb_)
     on_show_cb_.Run();
 }
diff --git a/chrome/browser/ui/views/side_search/side_search_icon_view.cc b/chrome/browser/ui/views/side_search/side_search_icon_view.cc
index 63f0cd57..8e61270 100644
--- a/chrome/browser/ui/views/side_search/side_search_icon_view.cc
+++ b/chrome/browser/ui/views/side_search/side_search_icon_view.cc
@@ -134,13 +134,9 @@
   if (!browser_view)
     return;
 
-  if (base::FeatureList::IsEnabled(features::kUnifiedSidePanel)) {
-    browser_view->side_panel_coordinator()->Show(
-        SidePanelEntry::Id::kSideSearch,
-        SidePanelUtil::SidePanelOpenTrigger::kSideSearchPageAction);
-  } else {
-    browser_view->side_search_controller()->ToggleSidePanel();
-  }
+  browser_view->side_panel_coordinator()->Show(
+      SidePanelEntry::Id::kSideSearch,
+      SidePanelUtil::SidePanelOpenTrigger::kSideSearchPageAction);
   auto* tracker = feature_engagement::TrackerFactory::GetForBrowserContext(
       browser_->profile());
   if (tracker)
diff --git a/chrome/browser/ui/views/side_search/side_search_views_utils.cc b/chrome/browser/ui/views/side_search/side_search_views_utils.cc
index 1c66daef..146293e 100644
--- a/chrome/browser/ui/views/side_search/side_search_views_utils.cc
+++ b/chrome/browser/ui/views/side_search/side_search_views_utils.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/ui/views/side_search/side_search_views_utils.h"
 
-#include "chrome/browser/ui/ui_features.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/side_panel/side_panel_coordinator.h"
 #include "chrome/browser/ui/views/side_panel/side_panel_entry.h"
@@ -13,12 +12,9 @@
 namespace side_search {
 
 bool IsSideSearchToggleOpen(BrowserView* browser_view) {
-  if (base::FeatureList::IsEnabled(features::kUnifiedSidePanel)) {
-    auto* coordinator = browser_view->side_panel_coordinator();
-    return coordinator->IsSidePanelShowing() &&
-           coordinator->GetCurrentEntryId() == SidePanelEntry::Id::kSideSearch;
-  }
-  return browser_view->side_search_controller()->GetSidePanelToggledOpen();
+  auto* coordinator = browser_view->side_panel_coordinator();
+  return coordinator->IsSidePanelShowing() &&
+         coordinator->GetCurrentEntryId() == SidePanelEntry::Id::kSideSearch;
 }
 
 }  // namespace side_search
diff --git a/chrome/browser/ui/views/toolbar/side_panel_toolbar_button.cc b/chrome/browser/ui/views/toolbar/side_panel_toolbar_button.cc
index 997db920..1fb91d2 100644
--- a/chrome/browser/ui/views/toolbar/side_panel_toolbar_button.cc
+++ b/chrome/browser/ui/views/toolbar/side_panel_toolbar_button.cc
@@ -6,11 +6,9 @@
 
 #include "base/metrics/user_metrics.h"
 #include "base/metrics/user_metrics_action.h"
-#include "base/scoped_observation.h"
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
 #include "chrome/app/vector_icons/vector_icons.h"
-#include "chrome/browser/reading_list/reading_list_model_factory.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_element_identifiers.h"
 #include "chrome/browser/ui/ui_features.h"
@@ -28,82 +26,23 @@
 SidePanelToolbarButton::SidePanelToolbarButton(Browser* browser)
     : ToolbarButton(base::BindRepeating(&SidePanelToolbarButton::ButtonPressed,
                                         base::Unretained(this))),
-      browser_(browser),
-      dot_indicator_(views::DotIndicator::Install(image())),
-      dot_bounds_updater_(
-          std::make_unique<DotBoundsUpdater>(dot_indicator_, image())),
-      reading_list_model_(
-          ReadingListModelFactory::GetForBrowserContext(browser_->profile())) {
-  if (base::FeatureList::IsEnabled(features::kUnifiedSidePanel)) {
-    pref_change_registrar_.Init(browser_->profile()->GetPrefs());
+      browser_(browser) {
+  pref_change_registrar_.Init(browser_->profile()->GetPrefs());
 
-    pref_change_registrar_.Add(
-        prefs::kSidePanelHorizontalAlignment,
-        base::BindRepeating(&SidePanelToolbarButton::UpdateToolbarButtonIcon,
-                            base::Unretained(this)));
-  }
+  pref_change_registrar_.Add(
+      prefs::kSidePanelHorizontalAlignment,
+      base::BindRepeating(&SidePanelToolbarButton::UpdateToolbarButtonIcon,
+                          base::Unretained(this)));
+
   UpdateToolbarButtonIcon();
   button_controller()->set_notify_action(
       views::ButtonController::NotifyAction::kOnPress);
   GetViewAccessibility().OverrideHasPopup(ax::mojom::HasPopup::kMenu);
   SetProperty(views::kElementIdentifierKey, kSidePanelButtonElementId);
-
-  if (reading_list_model_)
-    reading_list_model_scoped_observation_.Observe(reading_list_model_.get());
 }
 
 SidePanelToolbarButton::~SidePanelToolbarButton() = default;
 
-SidePanelToolbarButton::DotBoundsUpdater::DotBoundsUpdater(
-    views::DotIndicator* dot_indicator,
-    views::ImageView* image)
-    : dot_indicator_(dot_indicator), image_(image) {
-  observation_.Observe(image);
-}
-
-SidePanelToolbarButton::DotBoundsUpdater::~DotBoundsUpdater() = default;
-
-void SidePanelToolbarButton::DotBoundsUpdater::OnViewBoundsChanged(
-    View* observed_view) {
-  gfx::Rect dot_rect(8, 8);
-  if (ui::TouchUiController::Get()->touch_ui()) {
-    dot_rect = ScaleToEnclosingRect(
-        dot_rect, float{kDefaultTouchableIconSize} / kDefaultIconSize);
-  }
-  dot_rect.set_origin(image_->GetImageBounds().bottom_right() -
-                      dot_rect.bottom_right().OffsetFromOrigin());
-  dot_indicator_->SetBoundsRect(dot_rect);
-}
-
-void SidePanelToolbarButton::ReadingListModelLoaded(
-    const ReadingListModel* model) {
-  if (model->unseen_size() &&
-      !base::FeatureList::IsEnabled(features::kUnifiedSidePanel)) {
-    dot_indicator_->Show();
-  }
-}
-
-void SidePanelToolbarButton::ReadingListModelBeingDeleted(
-    const ReadingListModel* model) {
-  DCHECK(model == reading_list_model_);
-  DCHECK(reading_list_model_scoped_observation_.IsObservingSource(
-      reading_list_model_.get()));
-  reading_list_model_scoped_observation_.Reset();
-}
-
-void SidePanelToolbarButton::ReadingListDidApplyChanges(
-    ReadingListModel* model) {
-  // Unified side panel does not use the blue dot.
-  if (base::FeatureList::IsEnabled(features::kUnifiedSidePanel))
-    return;
-
-  if (!side_panel_webview_ && reading_list_model_->unseen_size() > 0) {
-    dot_indicator_->Show();
-  } else {
-    dot_indicator_->Hide();
-  }
-}
-
 void SidePanelToolbarButton::ButtonPressed() {
   BrowserView* const browser_view =
       BrowserView::GetBrowserViewForBrowser(browser_);
@@ -129,9 +68,6 @@
                                       base::Unretained(this)));
     side_panel_webview_ =
         browser_view->unified_side_panel()->AddChildView(std::move(webview));
-    if (reading_list_model_->loaded())
-      reading_list_model_->MarkAllSeen();
-    dot_indicator_->Hide();
   }
 }
 
diff --git a/chrome/browser/ui/views/toolbar/side_panel_toolbar_button.h b/chrome/browser/ui/views/toolbar/side_panel_toolbar_button.h
index 2fc1062..a40c2404 100644
--- a/chrome/browser/ui/views/toolbar/side_panel_toolbar_button.h
+++ b/chrome/browser/ui/views/toolbar/side_panel_toolbar_button.h
@@ -6,19 +6,13 @@
 #define CHROME_BROWSER_UI_VIEWS_TOOLBAR_SIDE_PANEL_TOOLBAR_BUTTON_H_
 
 #include "base/memory/raw_ptr.h"
-#include "base/scoped_observation.h"
 #include "chrome/browser/ui/views/bubble/bubble_contents_wrapper.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_button.h"
-#include "chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.h"
 #include "components/prefs/pref_change_registrar.h"
-#include "components/reading_list/core/reading_list_model.h"
-#include "components/reading_list/core/reading_list_model_observer.h"
-#include "ui/views/controls/dot_indicator.h"
 
 class Browser;
 
-class SidePanelToolbarButton : public ToolbarButton,
-                               public ReadingListModelObserver {
+class SidePanelToolbarButton : public ToolbarButton {
  public:
   explicit SidePanelToolbarButton(Browser* browser);
   SidePanelToolbarButton(const SidePanelToolbarButton&) = delete;
@@ -35,37 +29,10 @@
   // button listen for side panel state changes.
   void HideSidePanel();
 
-  bool GetDotIndicatorVisibilityForTesting() const {
-    return dot_indicator_->GetVisible();
-  }
-
  private:
   FRIEND_TEST_ALL_PREFIXES(SidePanelToolbarButtonTest, SetCorrectIconInLTR);
   FRIEND_TEST_ALL_PREFIXES(SidePanelToolbarButtonTest, SetCorrectIconInRTL);
 
-  class DotBoundsUpdater : public views::ViewObserver {
-   public:
-    DotBoundsUpdater(views::DotIndicator* dot_indicator,
-                     views::ImageView* image);
-    DotBoundsUpdater(const DotBoundsUpdater&) = delete;
-    DotBoundsUpdater& operator=(const DotBoundsUpdater&) = delete;
-    ~DotBoundsUpdater() override;
-
-    // views::ViewObserver:
-    void OnViewBoundsChanged(views::View* observed_view) override;
-
-   private:
-    const raw_ptr<views::DotIndicator> dot_indicator_;
-    const raw_ptr<views::ImageView> image_;
-    base::ScopedObservation<views::View, views::ViewObserver> observation_{
-        this};
-  };
-
-  // ReadingListModelObserver:
-  void ReadingListModelLoaded(const ReadingListModel* model) override;
-  void ReadingListModelBeingDeleted(const ReadingListModel* model) override;
-  void ReadingListDidApplyChanges(ReadingListModel* model) override;
-
   void ButtonPressed();
 
   // Updates the vector icon used when the PrefChangeRegistrar listens to a
@@ -76,13 +43,6 @@
 
   const raw_ptr<Browser> browser_;
 
-  raw_ptr<views::DotIndicator> dot_indicator_;
-  std::unique_ptr<DotBoundsUpdater> dot_bounds_updater_;
-
-  const raw_ptr<ReadingListModel> reading_list_model_;
-  base::ScopedObservation<ReadingListModel, ReadingListModelObserver>
-      reading_list_model_scoped_observation_{this};
-
   raw_ptr<views::View, DanglingUntriaged> side_panel_webview_ = nullptr;
 
   // Observes and listens to side panel alignment changes.
diff --git a/chrome/browser/ui/views/toolbar/side_panel_toolbar_button_unittest.cc b/chrome/browser/ui/views/toolbar/side_panel_toolbar_button_unittest.cc
index fa87bf3a..aa48d22 100644
--- a/chrome/browser/ui/views/toolbar/side_panel_toolbar_button_unittest.cc
+++ b/chrome/browser/ui/views/toolbar/side_panel_toolbar_button_unittest.cc
@@ -7,7 +7,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/test/icu_test_util.h"
 #include "base/test/scoped_feature_list.h"
-#include "chrome/browser/reading_list/reading_list_model_factory.h"
 #include "chrome/browser/ui/color/chrome_color_id.h"
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
@@ -15,8 +14,6 @@
 #include "chrome/browser/ui/views/toolbar/side_panel_toolbar_button.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
 #include "chrome/common/pref_names.h"
-#include "components/reading_list/core/reading_list_model.h"
-#include "components/reading_list/core/reading_list_test_utils.h"
 #include "ui/events/event_utils.h"
 #include "ui/gfx/image/image_unittest_util.h"
 #include "ui/gfx/paint_vector_icon.h"
@@ -25,59 +22,11 @@
 
 class SidePanelToolbarButtonTest : public TestWithBrowserView {
  public:
-  void SetUp() override {
-    TestWithBrowserView::SetUp();
-
-    model_ = ReadingListModelFactory::GetForBrowserContext(profile());
-    ReadingListLoadObserver(model_).Wait();
-  }
-
-  TestingProfile::TestingFactories GetTestingFactories() override {
-    TestingProfile::TestingFactories factories =
-        TestWithBrowserView::GetTestingFactories();
-    factories.emplace_back(
-        ReadingListModelFactory::GetInstance(),
-        ReadingListModelFactory::GetDefaultFactoryForTesting());
-    return factories;
-  }
-
   SidePanelToolbarButton* GetSidePanelToolbarButton() {
     return browser_view()->toolbar()->side_panel_button();
   }
-
-  ReadingListModel* model() { return model_; }
-
- private:
-  raw_ptr<ReadingListModel> model_;
 };
 
-TEST_F(SidePanelToolbarButtonTest, DotIndicatorVisibleWithUnreadItems) {
-  if (browser_view()->side_panel_coordinator()) {
-    GTEST_SKIP() << "The unified side panel doesn't use the dot indicator so "
-                    "this test shouldn't run";
-  }
-  // Verify the dot indicator is seen when there is an unseen entry.
-  model()->AddOrReplaceEntry(GURL("http://foo/1"), "Tab 1",
-                             reading_list::EntrySource::ADDED_VIA_CURRENT_APP,
-                             /*estimated_read_time=*/base::TimeDelta());
-  SidePanelToolbarButton* const side_panel_button = GetSidePanelToolbarButton();
-  ASSERT_TRUE(side_panel_button->GetDotIndicatorVisibilityForTesting());
-
-  // Verify the dot indicator is hidden once the toolbar button is clicked.
-  ui::MouseEvent e(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
-                   ui::EventTimeForNow(), 0, 0);
-  views::test::ButtonTestApi test_api(side_panel_button);
-  test_api.NotifyClick(e);
-  ASSERT_FALSE(side_panel_button->GetDotIndicatorVisibilityForTesting());
-
-  // Verify the dot indicator is hidden when entries are added while the panel
-  // is open.
-  model()->AddOrReplaceEntry(GURL("http://foo/2"), "Tab 2",
-                             reading_list::EntrySource::ADDED_VIA_CURRENT_APP,
-                             /*estimated_read_time=*/base::TimeDelta());
-  ASSERT_FALSE(side_panel_button->GetDotIndicatorVisibilityForTesting());
-}
-
 // Verify correct buttons are shown when side panel alignment is changed.
 TEST_F(SidePanelToolbarButtonTest, SetCorrectIconInLTR) {
   SidePanelToolbarButton* const side_panel_button = GetSidePanelToolbarButton();
diff --git a/chrome/browser/ui/webui/ash/emoji/emoji_page_handler.cc b/chrome/browser/ui/webui/ash/emoji/emoji_page_handler.cc
index 6fc871b..995e2b36 100644
--- a/chrome/browser/ui/webui/ash/emoji/emoji_page_handler.cc
+++ b/chrome/browser/ui/webui/ash/emoji/emoji_page_handler.cc
@@ -12,6 +12,7 @@
 #include "base/trace_event/trace_event.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/webui/ash/emoji/emoji_ui.h"
+#include "content/public/browser/storage_partition.h"
 #include "ui/base/clipboard/scoped_clipboard_writer.h"
 #include "ui/base/ime/ash/ime_bridge.h"
 #include "ui/base/ime/input_method_observer.h"
@@ -129,7 +130,11 @@
     : receiver_(this, std::move(receiver)),
       webui_controller_(webui_controller),
       incognito_mode_(incognito_mode),
-      no_text_field_(no_text_field) {}
+      no_text_field_(no_text_field) {
+  Profile* profile = Profile::FromWebUI(web_ui);
+  url_loader_factory_ = profile->GetDefaultStoragePartition()
+                            ->GetURLLoaderFactoryForBrowserProcess();
+}
 
 EmojiPageHandler::~EmojiPageHandler() {}
 
@@ -165,9 +170,21 @@
 }
 
 void EmojiPageHandler::GetCategories(GetCategoriesCallback callback) {
-  content::WebUI* web_ui = webui_controller_->web_ui();
-  Profile* profile = Profile::FromWebUI(web_ui);
-  gif_tenor_api_fetcher_.FetchCategories(std::move(callback), profile);
+  gif_tenor_api_fetcher_.FetchCategories(std::move(callback),
+                                         url_loader_factory_);
+}
+
+void EmojiPageHandler::GetFeaturedGifs(const absl::optional<std::string>& pos,
+                                       GetFeaturedGifsCallback callback) {
+  gif_tenor_api_fetcher_.FetchFeaturedGifs(std::move(callback),
+                                           url_loader_factory_, pos);
+}
+
+void EmojiPageHandler::SearchGifs(const std::string& query,
+                                  const absl::optional<std::string>& pos,
+                                  SearchGifsCallback callback) {
+  gif_tenor_api_fetcher_.FetchGifSearch(std::move(callback),
+                                        url_loader_factory_, query, pos);
 }
 
 void EmojiPageHandler::InsertEmoji(const std::string& emoji_to_insert,
diff --git a/chrome/browser/ui/webui/ash/emoji/emoji_page_handler.h b/chrome/browser/ui/webui/ash/emoji/emoji_page_handler.h
index 864159f..8fb915d 100644
--- a/chrome/browser/ui/webui/ash/emoji/emoji_page_handler.h
+++ b/chrome/browser/ui/webui/ash/emoji/emoji_page_handler.h
@@ -11,7 +11,6 @@
 #include "content/public/browser/web_ui.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver.h"
-#include "ui/webui/mojo_bubble_web_ui_controller.h"
 
 namespace ash {
 
@@ -37,6 +36,11 @@
   void IsIncognitoTextField(IsIncognitoTextFieldCallback callback) override;
   void GetFeatureList(GetFeatureListCallback callback) override;
   void GetCategories(GetCategoriesCallback callback) override;
+  void GetFeaturedGifs(const absl::optional<std::string>& pos,
+                       GetFeaturedGifsCallback callback) override;
+  void SearchGifs(const std::string& query,
+                  const absl::optional<std::string>& pos,
+                  SearchGifsCallback callback) override;
 
  private:
   mojo::Receiver<emoji_picker::mojom::PageHandler> receiver_;
@@ -46,6 +50,7 @@
   bool incognito_mode_;
   bool no_text_field_;
   GifTenorApiFetcher gif_tenor_api_fetcher_;
+  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
 };
 
 }  // namespace ash
diff --git a/chrome/browser/ui/webui/ash/emoji/emoji_picker.mojom b/chrome/browser/ui/webui/ash/emoji/emoji_picker.mojom
index cb2cb0c..691cb1c7 100644
--- a/chrome/browser/ui/webui/ash/emoji/emoji_picker.mojom
+++ b/chrome/browser/ui/webui/ash/emoji/emoji_picker.mojom
@@ -55,4 +55,49 @@
   //   }[]
   // }
   GetCategories() => (string categories);
+
+  // Returns a string in JSON format containing a list of the current global
+  // featured GIFs fetched from the tenor API (https://tenor.googleapis.com).
+  // JSON response format is shown below.
+  // {
+  //   next: string,
+  //   results: {
+  //     id: string, // tenor result identifier
+  //     content_description: string, // a textual description of the content
+  //     media_formats: {
+  //       gif: {
+  //         url: string, // a url to the media source
+  //         dims: int[], width and height of the media in pixels
+  //       }
+  //       mediumgif: {
+  //         url: string, // a url to the media source
+  //         dims: int[], width and height of the media in pixels
+  //       }
+  //     },
+  //   }[]
+  // }
+  GetFeaturedGifs(string? pos) => (string featured);
+
+  // Returns a string in JSON format containing a list of the most relevant
+  // GIFs for a given search set of search terms or categories, fetched from
+  // the tenor API (https://tenor.googleapis.com).
+  // JSON response format is shown below.
+  // {
+  //   next: string,
+  //   results: {
+  //     id: string, // tenor result identifier
+  //     content_description: string, // a textual description of the content
+  //     media_formats: {
+  //       gif: {
+  //         url: string, // a url to the media source
+  //         dims: int[], width and height of the media in pixels
+  //       }
+  //       mediumgif: {
+  //         url: string, // a url to the media source
+  //         dims: int[], width and height of the media in pixels
+  //       }
+  //     },
+  //   }[]
+  // }
+  SearchGifs(string query, string? pos) => (string gifs);
 };
diff --git a/chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.cc b/chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.cc
index fb2202e..f6555f0 100644
--- a/chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.cc
+++ b/chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.cc
@@ -8,28 +8,59 @@
 #include <string>
 #include <utility>
 
-#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/webui/ash/emoji/emoji_picker.mojom.h"
 #include "chrome/common/channel_info.h"
 #include "components/version_info/channel.h"
-#include "content/public/browser/storage_partition.h"
+#include "net/base/url_util.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "url/gurl.h"
 
 namespace ash {
 using emoji_picker::mojom::PageHandler;
+
 constexpr char kTenorBaseUrl[] = "https://tenor.googleapis.com";
 constexpr char kHttpMethod[] = "GET";
 constexpr char kHttpContentType[] = "application/json";
-constexpr char kCategoriesApi[] = "/v2/categories";
+
+constexpr char kContentFilterName[] = "contenfilter";
+constexpr char kContentFilterValue[] = "high";
+
+constexpr char kArRangeName[] = "ar_range";
+constexpr char kArRangeValue[] = "wide";
+
+constexpr char kMediaFilterName[] = "media_filter";
+constexpr char kMediaFilterValue[] = "gif,mediumgif";
+
+constexpr char kPosName[] = "pos";
 const int64_t kTimeoutMs = 10000;
 
 GifTenorApiFetcher::GifTenorApiFetcher() = default;
 
 GifTenorApiFetcher::~GifTenorApiFetcher() = default;
 
+GURL GifTenorApiFetcher::GetURL(const char* endpoint,
+                                const absl::optional<std::string>& pos) {
+  GURL url = net::AppendQueryParameter(GURL(kTenorBaseUrl).Resolve(endpoint),
+                                       kContentFilterName, kContentFilterValue);
+  url = net::AppendQueryParameter(url, kArRangeName, kArRangeValue);
+  url = net::AppendQueryParameter(url, kMediaFilterName, kMediaFilterValue);
+  if (pos) {
+    url = net::AppendQueryParameter(url, kPosName, pos.value());
+  }
+  return url;
+}
+
+void GifTenorApiFetcher::ResponseHandler(
+    TenorApiCallback callback,
+    std::unique_ptr<EndpointResponse> response) {
+  std::move(callback).Run(response->response);
+}
+
 void GifTenorApiFetcher::FetchCategories(
-    PageHandler::GetCategoriesCallback callback,
-    Profile* profile) {
+    TenorApiCallback callback,
+    const scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) {
+  constexpr char kCategoriesApi[] = "/v2/categories";
   constexpr net::NetworkTrafficAnnotationTag kTrafficAnnotation =
       net::DefineNetworkTrafficAnnotation(
           "chromeos_emoji_picker_categories_fetcher",
@@ -57,8 +88,7 @@
   )");
 
   endpoint_fetcher_ = std::make_unique<EndpointFetcher>(
-      /*url_loader_factory=*/profile->GetDefaultStoragePartition()
-          ->GetURLLoaderFactoryForBrowserProcess(),
+      /*url_loader_factory=*/url_loader_factory,
       /*url=*/GURL(kTenorBaseUrl).Resolve(kCategoriesApi),
       /*http_method=*/kHttpMethod,
       /*content_type=*/kHttpContentType,
@@ -70,15 +100,116 @@
           version_info::Channel::STABLE);
 
   endpoint_fetcher_->PerformRequest(
-      base::BindOnce(&GifTenorApiFetcher::FetchCategoriesResponseHandler,
+      base::BindOnce(&GifTenorApiFetcher::ResponseHandler,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)),
       nullptr);
 }
 
-void GifTenorApiFetcher::FetchCategoriesResponseHandler(
-    PageHandler::GetCategoriesCallback callback,
-    std::unique_ptr<EndpointResponse> response) {
-  std::move(callback).Run(response->response);
+void GifTenorApiFetcher::FetchFeaturedGifs(
+    TenorApiCallback callback,
+    const scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
+    const absl::optional<std::string>& pos) {
+  constexpr char kFeaturedApi[] = "/v2/featured";
+  constexpr net::NetworkTrafficAnnotationTag kTrafficAnnotation =
+      net::DefineNetworkTrafficAnnotation(
+          "chromeos_emoji_picker_featured_fetcher",
+          R"(
+      semantics {
+        sender: "ChromeOS Emoji Picker"
+        description:
+          "Gets featured GIFs from the tenor API "
+          "(https://developers.google.com/tenor)."
+        trigger:
+          "When a user opens the emoji picker and selects the GIF section, "
+          "and the trending GIFs subcategory is active."
+        data:
+          "Position of the next batch of GIFs, used for infiniate scroll."
+          "Authentication to this API is done through Chrome's API key."
+        destination: GOOGLE_OWNED_SERVICE
+      }
+      policy {
+        cookies_allowed: NO
+        setting:
+          "No setting. The feature does nothing by default. Users must take"
+          "an explicit action to trigger it."
+        policy_exception_justification:
+          "Not implemented, not considered useful. This request is part of a "
+          "flow which is user-initiated, and is not a background request."
+      }
+  )");
+
+  endpoint_fetcher_ = std::make_unique<EndpointFetcher>(
+      /*url_loader_factory=*/url_loader_factory,
+      /*url=*/GetURL(kFeaturedApi, pos),
+      /*http_method=*/kHttpMethod,
+      /*content_type=*/kHttpContentType,
+      /*timeout_ms=*/kTimeoutMs,
+      /*post_data=*/"",
+      /*headers=*/std::vector<std::string>(),
+      /*annotation_tag=*/kTrafficAnnotation,
+      /*is_stable_channel=*/chrome::GetChannel() ==
+          version_info::Channel::STABLE);
+
+  endpoint_fetcher_->PerformRequest(
+      base::BindOnce(&GifTenorApiFetcher::ResponseHandler,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)),
+      nullptr);
+}
+
+void GifTenorApiFetcher::FetchGifSearch(
+    TenorApiCallback callback,
+    const scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
+    const std::string& query,
+    const absl::optional<std::string>& pos) {
+  constexpr char kSearchApi[] = "/v2/search";
+  constexpr net::NetworkTrafficAnnotationTag kTrafficAnnotation =
+      net::DefineNetworkTrafficAnnotation(
+          "chromeos_emoji_picker_search_fetcher",
+          R"(
+      semantics {
+        sender: "ChromeOS Emoji Picker"
+        description:
+          "Gets a list of the most relevant GIFs from the tenor API "
+          "(https://developers.google.com/tenor) for a given search term."
+        trigger:
+          "When a user opens the emoji picker and selects the GIF section, "
+          "then type in a search query in the search bar."
+        data:
+          "Text a user has typed into a text field."
+          "Position of the next batch of GIFs, used for infiniate scroll."
+          "Authentication to this API is done through Chrome's API key."
+        destination: GOOGLE_OWNED_SERVICE
+      }
+      policy {
+        cookies_allowed: NO
+        setting:
+          "No setting. The feature does nothing by default. Users must take"
+          "an explicit action to trigger it."
+        policy_exception_justification:
+          "Not implemented, not considered useful. This request is part of a "
+          "flow which is user-initiated, and is not a background request."
+      }
+  )");
+
+  GURL url = GetURL(kSearchApi, pos);
+  url = net::AppendQueryParameter(url, "q", query);
+
+  endpoint_fetcher_ = std::make_unique<EndpointFetcher>(
+      /*url_loader_factory=*/url_loader_factory,
+      /*url=*/url,
+      /*http_method=*/kHttpMethod,
+      /*content_type=*/kHttpContentType,
+      /*timeout_ms=*/kTimeoutMs,
+      /*post_data=*/"",
+      /*headers=*/std::vector<std::string>(),
+      /*annotation_tag=*/kTrafficAnnotation,
+      /*is_stable_channel=*/chrome::GetChannel() ==
+          version_info::Channel::STABLE);
+
+  endpoint_fetcher_->PerformRequest(
+      base::BindOnce(&GifTenorApiFetcher::ResponseHandler,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)),
+      nullptr);
 }
 
 }  // namespace ash
diff --git a/chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.h b/chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.h
index e79a4835..238a59d 100644
--- a/chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.h
+++ b/chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.h
@@ -8,8 +8,8 @@
 #include <memory>
 
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/webui/ash/emoji/emoji_picker.mojom.h"
 #include "components/endpoint_fetcher/endpoint_fetcher.h"
+#include "url/gurl.h"
 
 namespace ash {
 
@@ -19,18 +19,36 @@
 
   ~GifTenorApiFetcher();
 
-  // Fetch tenor API categories endpoint
+  using TenorApiCallback = base::OnceCallback<void(const std::string&)>;
+
+  // Fetch tenor API Categories endpoint
   void FetchCategories(
-      emoji_picker::mojom::PageHandler::GetCategoriesCallback callback,
-      Profile* profile);
+      TenorApiCallback callback,
+      const scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
 
   void FetchCategoriesResponseHandler(
-      emoji_picker::mojom::PageHandler::GetCategoriesCallback callback,
+      TenorApiCallback callback,
       std::unique_ptr<EndpointResponse> response);
 
+  // Fetch tenor API Featured endpoint
+  void FetchFeaturedGifs(
+      TenorApiCallback callback,
+      const scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
+      const absl::optional<std::string>& pos);
+
+  // Fetch tenor API Search endpoint
+  void FetchGifSearch(
+      TenorApiCallback callback,
+      const scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
+      const std::string& query,
+      const absl::optional<std::string>& pos);
+
  private:
   std::unique_ptr<EndpointFetcher> endpoint_fetcher_;
   base::WeakPtrFactory<GifTenorApiFetcher> weak_ptr_factory_{this};
+  GURL GetURL(const char* endpoint, const absl::optional<std::string>& pos);
+  void ResponseHandler(TenorApiCallback callback,
+                       std::unique_ptr<EndpointResponse> response);
 };
 }  // namespace ash
 
diff --git a/chrome/browser/ui/webui/device_log_ui.cc b/chrome/browser/ui/webui/device_log_ui.cc
index 1bca7009..5597e73d 100644
--- a/chrome/browser/ui/webui/device_log_ui.cc
+++ b/chrome/browser/ui/webui/device_log_ui.cc
@@ -94,6 +94,7 @@
       {"logTypeSerialText", IDS_DEVICE_LOG_TYPE_SERIAL},
       {"logTypeCameraText", IDS_DEVICE_LOG_TYPE_CAMERA},
       {"logTypeGeolocationText", IDS_DEVICE_LOG_TYPE_GEOLOCATION},
+      {"logTypeExtensionsText", IDS_DEVICE_LOG_TYPE_EXTENSIONS},
       {"logEntryFormat", IDS_DEVICE_LOG_ENTRY},
   };
   html->AddLocalizedStrings(kStrings);
diff --git a/chrome/browser/ui/webui/internals/internals_ui.cc b/chrome/browser/ui/webui/internals/internals_ui.cc
index 8cabba04..5920dd1 100644
--- a/chrome/browser/ui/webui/internals/internals_ui.cc
+++ b/chrome/browser/ui/webui/internals/internals_ui.cc
@@ -92,12 +92,6 @@
 #else
   source_->AddResourcePath("user-education",
                            IDR_USER_EDUCATION_INTERNALS_INDEX_HTML);
-
-  // chrome://internals/web-app
-  // This page has moved to chrome://web-app-internals, see
-  // WebAppInternalsSource.
-  // TODO(crbug.com/1226263): Clean up this redirect after M94 goes stable.
-  source_->AddResourcePath("web-app", IDR_WEB_APP_INTERNALS_HTML);
 #endif  // BUILDFLAG(IS_ANDROID)
 
   // chrome://internals/session-service
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 4a6b2a96..1ccfdda 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -405,9 +405,7 @@
                          zoom::GetPresetZoomFactorsAsJSON());
   html_source->AddBoolean("showReaderModeOption",
                           dom_distiller::OfferReaderModeInSettings());
-  html_source->AddBoolean(
-      "showSidePanelOptions",
-      base::FeatureList::IsEnabled(features::kUnifiedSidePanel));
+  html_source->AddBoolean("showSidePanelOptions", true);
 
 // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
 // of lacros-chrome is complete.
@@ -2021,7 +2019,6 @@
       {"topicsPageBlockedTopicsDescriptionEmpty",
        IDS_SETTINGS_TOPICS_PAGE_BLOCKED_TOPICS_DESCRIPTION_EMPTY},
       {"topicsPageAllowTopic", IDS_SETTINGS_TOPICS_PAGE_ALLOW_TOPIC},
-      {"topicsPageFooter", IDS_SETTINGS_TOPICS_PAGE_FOOTER},
       {"fledgePageTitle", IDS_SETTINGS_FLEDGE_PAGE_TITLE},
       {"fledgePageToggleLabel", IDS_SETTINGS_FLEDGE_PAGE_TOGGLE_LABEL},
       {"fledgePageToggleSubLabel", IDS_SETTINGS_FLEDGE_PAGE_TOGGLE_SUB_LABEL},
@@ -2049,7 +2046,6 @@
        IDS_SETTINGS_FLEDGE_PAGE_LEARN_MORE_BULLET_2},
       {"fledgePageLearnMoreBullet3",
        IDS_SETTINGS_FLEDGE_PAGE_LEARN_MORE_BULLET_3},
-      {"fledgePageFooter", IDS_SETTINGS_FLEDGE_PAGE_FOOTER},
       {"adMeasurementPageTitle", IDS_SETTINGS_AD_MEASUREMENT_PAGE_TITLE},
       {"adMeasurementPageToggleLabel",
        IDS_SETTINGS_AD_MEASUREMENT_PAGE_TOGGLE_LABEL},
@@ -2074,6 +2070,20 @@
       l10n_util::GetStringFUTF16(
           IDS_SETTINGS_PRIVACY_SANDBOX_AD_MEASUREMENT_DIALOG_CONTROL_MEASUREMENT,
           base::ASCIIToUTF16(chrome::kChromeUIHistoryURL)));
+  // Topics and fledge both link to the cookies setting page and cross-link
+  // each other in the footers.
+  html_source->AddString(
+      "topicsPageFooter",
+      l10n_util::GetStringFUTF16(
+          IDS_SETTINGS_TOPICS_PAGE_FOOTER,
+          base::ASCIIToUTF16(chrome::kChromeUIPrivacySandboxFledgeURL),
+          base::ASCIIToUTF16(chrome::kChromeUICookieSettingsURL)));
+  html_source->AddString(
+      "fledgePageFooter",
+      l10n_util::GetStringFUTF16(
+          IDS_SETTINGS_TOPICS_PAGE_FOOTER,
+          base::ASCIIToUTF16(chrome::kChromeUIPrivacySandboxTopicsURL),
+          base::ASCIIToUTF16(chrome::kChromeUICookieSettingsURL)));
   html_source->AddBoolean(
       "firstPartySetsUIEnabled",
       base::FeatureList::IsEnabled(
diff --git a/chrome/browser/ui/webui/settings/site_settings_helper.cc b/chrome/browser/ui/webui/settings/site_settings_helper.cc
index b9172f6..e143fb2 100644
--- a/chrome/browser/ui/webui/settings/site_settings_helper.cc
+++ b/chrome/browser/ui/webui/settings/site_settings_helper.cc
@@ -48,6 +48,7 @@
 #include "components/permissions/permission_util.h"
 #include "components/permissions/permissions_client.h"
 #include "components/prefs/pref_service.h"
+#include "components/privacy_sandbox/privacy_sandbox_features.h"
 #include "components/subresource_filter/content/browser/subresource_filter_content_settings_manager.h"
 #include "components/subresource_filter/content/browser/subresource_filter_profile_context.h"
 #include "components/subresource_filter/core/browser/subresource_filter_features.h"
@@ -639,9 +640,26 @@
       continue;
     }
 
+    auto content_setting = setting.GetContentSetting();
+
+    if (type == ContentSettingsType::COOKIES &&
+        base::FeatureList::IsEnabled(
+            privacy_sandbox::kPrivacySandboxSettings4)) {
+      // With the changes to settings introduced in PrivacySandboxSettings4,
+      // there is no user-facing concept of SESSION_ONLY cookie exceptions that
+      // use secondary patterns. These are instead presented as ALLOW.
+      // TODO(crbug.com/1404436): Perform a one time migration of the actual
+      // content settings when the extension API no-longer allows them to be
+      // created.
+      if (content_setting == ContentSetting::CONTENT_SETTING_SESSION_ONLY &&
+          setting.secondary_pattern != ContentSettingsPattern::Wildcard()) {
+        content_setting = ContentSetting::CONTENT_SETTING_ALLOW;
+      }
+    }
+
     all_patterns_settings[std::make_pair(
         setting.primary_pattern, setting.source)][setting.secondary_pattern] =
-        setting.GetContentSetting();
+        content_setting;
   }
 
   ContentSettingsForOneType embargo_settings;
@@ -690,32 +708,10 @@
     const std::string display_name =
         GetDisplayNameForPattern(primary_pattern, extension_registry);
 
-    // The "parent" entry either has an identical primary and secondary pattern,
-    // or has a wildcard secondary. The two cases are indistinguishable in the
-    // UI.
-    auto parent = one_settings.find(primary_pattern);
-    if (parent == one_settings.end())
-      parent = one_settings.find(ContentSettingsPattern::Wildcard());
-
     auto& this_provider_exceptions = all_provider_exceptions
         [HostContentSettingsMap::GetProviderTypeFromSource(source)];
 
-    // Add the "parent" entry for the non-embedded setting.
-    ContentSetting parent_setting =
-        parent == one_settings.end() ? CONTENT_SETTING_DEFAULT : parent->second;
-    const ContentSettingsPattern& secondary_pattern =
-        parent == one_settings.end() ? primary_pattern : parent->first;
-    this_provider_exceptions.push_back(GetExceptionForPage(
-        type, profile, primary_pattern, secondary_pattern, display_name,
-        parent_setting, source, incognito,
-        base::Contains(origins_under_embargo, primary_pattern)));
-
-    // Add the "children" for any embedded settings.
     for (auto j = one_settings.begin(); j != one_settings.end(); ++j) {
-      // Skip the non-embedded setting which we already added above.
-      if (j == parent)
-        continue;
-
       ContentSetting content_setting = j->second;
       this_provider_exceptions.push_back(GetExceptionForPage(
           type, profile, primary_pattern, j->first, display_name,
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 16376f7..8f07984b 100644
--- a/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc
+++ b/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc
@@ -31,6 +31,7 @@
 #include "components/permissions/permissions_client.h"
 #include "components/permissions/test/permission_test_util.h"
 #include "components/prefs/pref_service.h"
+#include "components/privacy_sandbox/privacy_sandbox_features.h"
 #include "content/public/test/browser_task_environment.h"
 #include "extensions/browser/extension_registry.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
@@ -514,6 +515,87 @@
   EXPECT_EQ(CONTENT_SETTING_BLOCK, content_setting);
 }
 
+TEST_F(SiteSettingsHelperTest, CookieExceptions) {
+  TestingProfile profile;
+  HostContentSettingsMap* map =
+      HostContentSettingsMapFactory::GetForProfile(&profile);
+
+  struct TestCase {
+    std::string primary_pattern;
+    std::string secondary_pattern;
+    ContentSetting initial_setting;
+    ContentSetting updated_setting;
+  };
+
+  auto test_cases = std::vector<TestCase>{
+      {"*", "[*.]allowed-top-frame.com", CONTENT_SETTING_ALLOW,
+       CONTENT_SETTING_ALLOW},
+      {"[*.]allowed.com", "*", CONTENT_SETTING_ALLOW, CONTENT_SETTING_ALLOW},
+      {"[*.]allowed.com", "[*.]allowed-top-frame.com", CONTENT_SETTING_ALLOW,
+       CONTENT_SETTING_ALLOW},
+      {"*", "[*.]session-top-frame.com", CONTENT_SETTING_SESSION_ONLY,
+       CONTENT_SETTING_ALLOW},
+      {"[*.]session.com", "*", CONTENT_SETTING_SESSION_ONLY,
+       CONTENT_SETTING_SESSION_ONLY},
+      {"[*.]session.com", "[*.]session-top-frame.com",
+       CONTENT_SETTING_SESSION_ONLY, CONTENT_SETTING_ALLOW},
+      {"[*.]blocked.com", "[*.]blocked-top-frame.com", CONTENT_SETTING_BLOCK,
+       CONTENT_SETTING_BLOCK},
+      {"*", "[*.]blocked-top-frame.com", CONTENT_SETTING_BLOCK,
+       CONTENT_SETTING_BLOCK},
+      {"[*.]blocked.com", "*", CONTENT_SETTING_BLOCK, CONTENT_SETTING_BLOCK},
+  };
+
+  for (const auto& test_case : test_cases) {
+    map->SetContentSettingCustomScope(
+        ContentSettingsPattern::FromString(test_case.primary_pattern),
+        ContentSettingsPattern::FromString(test_case.secondary_pattern),
+        kContentTypeCookies, test_case.initial_setting);
+  }
+
+  for (const auto feature_state : std::vector<bool>{true, false}) {
+    base::test::ScopedFeatureList feature_list_;
+    feature_list_.InitWithFeatureState(
+        privacy_sandbox::kPrivacySandboxSettings4, feature_state);
+
+    base::Value::List exceptions;
+    site_settings::GetExceptionsForContentType(kContentTypeCookies, &profile,
+                                               /*extension_registry=*/nullptr,
+                                               /*web_ui=*/nullptr,
+                                               /*incognito=*/false,
+                                               &exceptions);
+
+    // Convert the test cases, and the returned dictionary, into tuples for
+    // unordered comparison, as the order of exception is not relevant.
+    std::vector<std::tuple<std::string, std::string, std::string>> expected;
+    std::vector<std::tuple<std::string, std::string, std::string>> actual;
+    base::ranges::transform(
+        test_cases, std::back_inserter(expected), [&](const auto& test_case) {
+          // make_tuple as we've some temporary rvalues.
+          return std::make_tuple(
+              test_case.primary_pattern,
+              test_case.secondary_pattern ==
+                      ContentSettingsPattern::Wildcard().ToString()
+                  ? ""
+                  : test_case.secondary_pattern,
+              content_settings::ContentSettingToString(
+                  feature_state ? test_case.updated_setting
+                                : test_case.initial_setting));
+        });
+    base::ranges::transform(
+        exceptions, std::back_inserter(actual), [](const auto& exception) {
+          const base::Value::Dict& dict = exception.GetDict();
+          return std::forward_as_tuple(*dict.FindString(kOrigin),
+                                       *dict.FindString(kEmbeddingOrigin),
+                                       *dict.FindString(kSetting));
+        });
+
+    EXPECT_THAT(actual, testing::UnorderedElementsAreArray(expected))
+        << "Privacy Sandbox Settings 4 "
+        << (feature_state ? "enabled" : "disabled");
+  }
+}
+
 namespace {
 
 void ExpectValidChooserExceptionObject(
@@ -790,9 +872,9 @@
       SiteSettingSourceToString(SiteSettingSource::kPreference);
 
   // The chooser exceptions are ordered by display name. Their corresponding
-  // sites are ordered by permission source precedence, then by the origin. User
-  // granted permissions that are also granted by policy are combined with the
-  // policy so that duplicate permissions are not displayed.
+  // sites are ordered by permission source precedence, then by the origin.
+  // User granted permissions that are also granted by policy are combined with
+  // the policy so that duplicate permissions are not displayed.
   base::Value::List exceptions_list =
       GetChooserExceptionListFromProfile(profile(), *chooser_type);
   ASSERT_EQ(exceptions_list.size(), 4u);
@@ -818,8 +900,8 @@
 
   // This exception should describe the permissions for any device.
   // There are no user granted permissions that intersect with this permission,
-  // and this policy only grants one permission to the following site:
-  // "https://google.com".
+  // and this policy only grants one permission to the following
+  // site: "https://google.com".
   {
     const auto& exception = exceptions_list[1];
     ExpectDisplayNameEq(exception,
diff --git a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks.mojom b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks.mojom
index 07033e0e..2b5f69c 100644
--- a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks.mojom
+++ b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks.mojom
@@ -25,17 +25,18 @@
   // Bookmarks the current active tab in the given folder.
   BookmarkCurrentTabInFolder(int64 folder_id);
 
-  // Opens the bookmark specified by node_id in a new background tab, using the
-  // same logic as the native bookmarks context menu.
-  ExecuteOpenInNewTabCommand(int64 node_id, ActionSource source);
-
-  // Opens the bookmark specified by node_id in a new window, using the same
-  // logic as the native bookmarks context menu.
-  ExecuteOpenInNewWindowCommand(int64 node_id, ActionSource source);
-
-  // Opens the bookmark specified by node_id in a new incognito window, using
+  // Opens the bookmarks specified by node_ids in a new background tab, using
   // the same logic as the native bookmarks context menu.
-  ExecuteOpenInIncognitoWindowCommand(int64 node_id, ActionSource source);
+  ExecuteOpenInNewTabCommand(array<int64> node_ids, ActionSource source);
+
+  // Opens the bookmarks specified by node_ids in a new window, using the same
+  // logic as the native bookmarks context menu.
+  ExecuteOpenInNewWindowCommand(array<int64> node_ids, ActionSource source);
+
+  // Opens the bookmarks specified by node_ids in a new incognito window, using
+  // the same logic as the native bookmarks context menu.
+  ExecuteOpenInIncognitoWindowCommand(array<int64> node_ids,
+                                      ActionSource source);
 
   // Deletes bookmark specified by node_id, using the same logic as the native
   // bookmarks context menu.
diff --git a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.cc b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.cc
index 1a414a9..fec1010 100644
--- a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.cc
+++ b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.cc
@@ -47,7 +47,7 @@
   explicit BookmarkContextMenu(
       Browser* browser,
       base::WeakPtr<ui::MojoBubbleWebUIController::Embedder> embedder,
-      const bookmarks::BookmarkNode* bookmark,
+      std::vector<const bookmarks::BookmarkNode*> bookmarks,
       const side_panel::mojom::ActionSource& source)
       : ui::SimpleMenuModel(this),
         embedder_(embedder),
@@ -57,14 +57,14 @@
             browser,
             browser->profile(),
             BookmarkLaunchLocation::kSidePanelContextMenu,
-            bookmark->parent(),
-            {bookmark}))),
+            bookmarks.front()->parent(),
+            bookmarks))),
         shopping_list_controller_(
             base::WrapUnique(new commerce::ShoppingListContextMenuController(
                 BookmarkModelFactory::GetForBrowserContext(browser->profile()),
                 commerce::ShoppingServiceFactory::GetForBrowserContext(
                     browser->profile()),
-                bookmark,
+                bookmarks.front(),
                 this))) {
     if (source == side_panel::mojom::ActionSource::kPriceTracking) {
       AddItem(IDC_BOOKMARK_BAR_OPEN_ALL);
@@ -82,8 +82,9 @@
     AddItem(IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO);
     AddSeparator(ui::NORMAL_SEPARATOR);
 
-    AddItem(bookmark->is_folder() ? IDC_BOOKMARK_BAR_RENAME_FOLDER
-                                  : IDC_BOOKMARK_BAR_EDIT);
+    AddItem(bookmarks.size() == 1 && bookmarks.front()->is_folder()
+                ? IDC_BOOKMARK_BAR_RENAME_FOLDER
+                : IDC_BOOKMARK_BAR_EDIT);
     AddSeparator(ui::NORMAL_SEPARATOR);
 
     AddItem(IDC_CUT);
@@ -133,8 +134,8 @@
       shopping_list_controller_;
 };
 
-std::unique_ptr<BookmarkContextMenu> ContextMenuFromNode(
-    int64_t node_id,
+std::unique_ptr<BookmarkContextMenu> ContextMenuFromNodes(
+    const std::vector<int64_t> node_ids,
     base::WeakPtr<ui::MojoBubbleWebUIController::Embedder> embedder,
     side_panel::mojom::ActionSource source) {
   Browser* browser = chrome::FindLastActive();
@@ -144,13 +145,16 @@
 
   bookmarks::BookmarkModel* bookmark_model =
       BookmarkModelFactory::GetForBrowserContext(browser->profile());
-  const bookmarks::BookmarkNode* bookmark =
-      bookmarks::GetBookmarkNodeByID(bookmark_model, node_id);
-  if (!bookmark) {
-    return nullptr;
+  std::vector<const bookmarks::BookmarkNode*> bookmarks = {};
+  for (const int64_t id : node_ids) {
+    const bookmarks::BookmarkNode* bookmark =
+        bookmarks::GetBookmarkNodeByID(bookmark_model, id);
+    if (bookmark) {
+      bookmarks.push_back(bookmark);
+    }
   }
 
-  return std::make_unique<BookmarkContextMenu>(browser, embedder, bookmark,
+  return std::make_unique<BookmarkContextMenu>(browser, embedder, bookmarks,
                                                source);
 }
 
@@ -177,36 +181,36 @@
 }
 
 void BookmarksPageHandler::ExecuteOpenInNewTabCommand(
-    int64_t node_id,
+    const std::vector<int64_t>& node_ids,
     side_panel::mojom::ActionSource source) {
   auto embedder =
       bookmarks_ui_ ? bookmarks_ui_->embedder() : reading_list_ui_->embedder();
   std::unique_ptr<BookmarkContextMenu> contextMenu =
-      ContextMenuFromNode(node_id, embedder, source);
+      ContextMenuFromNodes(node_ids, embedder, source);
   if (contextMenu) {
     contextMenu->ExecuteCommand(IDC_BOOKMARK_BAR_OPEN_ALL, 0);
   }
 }
 
 void BookmarksPageHandler::ExecuteOpenInNewWindowCommand(
-    int64_t node_id,
+    const std::vector<int64_t>& node_ids,
     side_panel::mojom::ActionSource source) {
   auto embedder =
       bookmarks_ui_ ? bookmarks_ui_->embedder() : reading_list_ui_->embedder();
   std::unique_ptr<BookmarkContextMenu> contextMenu =
-      ContextMenuFromNode(node_id, embedder, source);
+      ContextMenuFromNodes(node_ids, embedder, source);
   if (contextMenu) {
     contextMenu->ExecuteCommand(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW, 0);
   }
 }
 
 void BookmarksPageHandler::ExecuteOpenInIncognitoWindowCommand(
-    int64_t node_id,
+    const std::vector<int64_t>& node_ids,
     side_panel::mojom::ActionSource source) {
   auto embedder =
       bookmarks_ui_ ? bookmarks_ui_->embedder() : reading_list_ui_->embedder();
   std::unique_ptr<BookmarkContextMenu> contextMenu =
-      ContextMenuFromNode(node_id, embedder, source);
+      ContextMenuFromNodes(node_ids, embedder, source);
   if (contextMenu) {
     contextMenu->ExecuteCommand(IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO, 0);
   }
@@ -218,7 +222,7 @@
   auto embedder =
       bookmarks_ui_ ? bookmarks_ui_->embedder() : reading_list_ui_->embedder();
   std::unique_ptr<BookmarkContextMenu> contextMenu =
-      ContextMenuFromNode(node_id, embedder, source);
+      ContextMenuFromNodes({node_id}, embedder, source);
   if (contextMenu) {
     contextMenu->ExecuteCommand(IDC_BOOKMARK_BAR_REMOVE, 0);
   }
@@ -267,10 +271,9 @@
 
   if (embedder) {
     std::unique_ptr<BookmarkContextMenu> contextMenu =
-        ContextMenuFromNode(id, embedder, source);
+        ContextMenuFromNodes({id}, embedder, source);
     if (contextMenu) {
-      embedder->ShowContextMenu(point,
-                                ContextMenuFromNode(id, embedder, source));
+      embedder->ShowContextMenu(point, std::move(contextMenu));
     }
   }
 }
diff --git a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.h b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.h
index c635740..6da3adc 100644
--- a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.h
+++ b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.h
@@ -28,13 +28,13 @@
   // side_panel::mojom::BookmarksPageHandler:
   void BookmarkCurrentTabInFolder(int64_t folder_id) override;
   void ExecuteOpenInNewTabCommand(
-      int64_t node_id,
+      const std::vector<int64_t>& node_ids,
       side_panel::mojom::ActionSource source) override;
   void ExecuteOpenInNewWindowCommand(
-      int64_t node_id,
+      const std::vector<int64_t>& node_ids,
       side_panel::mojom::ActionSource source) override;
   void ExecuteOpenInIncognitoWindowCommand(
-      int64_t node_id,
+      const std::vector<int64_t>& node_ids,
       side_panel::mojom::ActionSource source) override;
   void ExecuteDeleteCommand(int64_t node_id,
                             side_panel::mojom::ActionSource source) override;
diff --git a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_side_panel_ui.cc b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_side_panel_ui.cc
index f9bdd61..2015205 100644
--- a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_side_panel_ui.cc
+++ b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_side_panel_ui.cc
@@ -52,6 +52,7 @@
       {"sidePanelTitle", IDS_SIDE_PANEL_TITLE},
       {"tooltipClose", IDS_CLOSE},
       {"tooltipDelete", IDS_DELETE},
+      {"tooltipMore", IDS_BOOKMARKS_EDIT_MORE},
       {"shoppingListFolderTitle", IDS_SIDE_PANEL_TRACKED_PRODUCTS},
       {"shoppingListTrackPriceButtonDescription",
        IDS_PRICE_TRACKING_TRACK_PRODUCT_ACCESSIBILITY},
@@ -81,8 +82,14 @@
       {"clearSearch", IDS_BOOKMARK_MANAGER_CLEAR_SEARCH},
       {"selectedBookmarkCount", IDS_BOOKMARK_MANAGER_ITEMS_SELECTED},
       {"menuOpenNewTab", IDS_BOOKMARK_MANAGER_MENU_OPEN_IN_NEW_TAB},
+      {"menuOpenNewTabWithCount",
+       IDS_BOOKMARK_MANAGER_MENU_OPEN_ALL_WITH_COUNT},
       {"menuOpenNewWindow", IDS_BOOKMARK_MANAGER_MENU_OPEN_IN_NEW_WINDOW},
+      {"menuOpenNewWindowWithCount",
+       IDS_BOOKMARK_MANAGER_MENU_OPEN_ALL_NEW_WINDOW_WITH_COUNT},
       {"menuOpenIncognito", IDS_BOOKMARK_MANAGER_MENU_OPEN_INCOGNITO},
+      {"menuOpenIncognitoWithCount",
+       IDS_BOOKMARK_MANAGER_MENU_OPEN_ALL_INCOGNITO_WITH_COUNT},
       {"newFolderTitle", IDS_BOOKMARK_EDITOR_NEW_FOLDER_NAME},
   };
   for (const auto& str : kLocalizedStrings)
@@ -95,8 +102,7 @@
       "bookmarksDragAndDropEnabled",
       prefs->GetBoolean(bookmarks::prefs::kEditBookmarksEnabled));
 
-  source->AddBoolean("unifiedSidePanel",
-                     base::FeatureList::IsEnabled(features::kUnifiedSidePanel));
+  source->AddBoolean("unifiedSidePanel", true);
 
   source->AddBoolean("guestMode", profile->IsGuestSession());
   source->AddBoolean("incognitoMode", profile->IsIncognitoProfile());
diff --git a/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc b/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc
index c7a29a77..3e44122b 100644
--- a/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc
+++ b/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc
@@ -68,6 +68,7 @@
       {"sidePanelTitle", IDS_SIDE_PANEL_TITLE},
       {"tooltipClose", IDS_CLOSE},
       {"tooltipDelete", IDS_DELETE},
+      {"tooltipMore", IDS_BOOKMARKS_EDIT_MORE},
       {"tooltipMarkAsRead", IDS_READ_LATER_MENU_TOOLTIP_MARK_AS_READ},
       {"tooltipMarkAsUnread", IDS_READ_LATER_MENU_TOOLTIP_MARK_AS_UNREAD},
       {"unreadHeader", IDS_READ_LATER_MENU_UNREAD_HEADER},
@@ -99,8 +100,14 @@
       {"clearSearch", IDS_BOOKMARK_MANAGER_CLEAR_SEARCH},
       {"selectedBookmarkCount", IDS_BOOKMARK_MANAGER_ITEMS_SELECTED},
       {"menuOpenNewTab", IDS_BOOKMARK_MANAGER_MENU_OPEN_IN_NEW_TAB},
+      {"menuOpenNewTabWithCount",
+       IDS_BOOKMARK_MANAGER_MENU_OPEN_ALL_WITH_COUNT},
       {"menuOpenNewWindow", IDS_BOOKMARK_MANAGER_MENU_OPEN_IN_NEW_WINDOW},
+      {"menuOpenNewWindowWithCount",
+       IDS_BOOKMARK_MANAGER_MENU_OPEN_ALL_NEW_WINDOW_WITH_COUNT},
       {"menuOpenIncognito", IDS_BOOKMARK_MANAGER_MENU_OPEN_INCOGNITO},
+      {"menuOpenIncognitoWithCount",
+       IDS_BOOKMARK_MANAGER_MENU_OPEN_ALL_INCOGNITO_WITH_COUNT},
       {"newFolderTitle", IDS_BOOKMARK_EDITOR_NEW_FOLDER_NAME},
   };
   for (const auto& str : kLocalizedStrings)
@@ -131,8 +138,7 @@
       reading_list_model->loaded() ? reading_list_model->unseen_size() : false);
 
   source->AddBoolean("readAnythingEnabled", features::IsReadAnythingEnabled());
-  source->AddBoolean("unifiedSidePanel",
-                     base::FeatureList::IsEnabled(features::kUnifiedSidePanel));
+  source->AddBoolean("unifiedSidePanel", true);
 
   source->AddBoolean("guestMode", profile->IsGuestSession());
   source->AddBoolean("incognitoMode", profile->IsIncognitoProfile());
@@ -151,13 +157,9 @@
   content::URLDataSource::Add(
       profile, std::make_unique<FaviconSource>(
                    profile, chrome::FaviconUrlFormat::kFavicon2));
-  const int resource =
-      !base::FeatureList::IsEnabled(features::kUnifiedSidePanel)
-          ? IDR_SIDE_PANEL_SIDE_PANEL_HTML
-          : IDR_SIDE_PANEL_READING_LIST_READING_LIST_HTML;
   webui::SetupWebUIDataSource(
       source, base::make_span(kSidePanelResources, kSidePanelResourcesSize),
-      resource);
+      IDR_SIDE_PANEL_READING_LIST_READING_LIST_HTML);
   content::URLDataSource::Add(profile,
                               std::make_unique<SanitizedImageSource>(profile));
 }
diff --git a/chrome/browser/ui/window_sizer/window_sizer.cc b/chrome/browser/ui/window_sizer/window_sizer.cc
index 43139eb..cda988a5 100644
--- a/chrome/browser/ui/window_sizer/window_sizer.cc
+++ b/chrome/browser/ui/window_sizer/window_sizer.cc
@@ -37,10 +37,8 @@
 
 BrowserWindow* FindMostRecentBrowserWindow(
     base::FunctionRef<bool(Browser*)> matcher) {
-  const BrowserList* browser_list = BrowserList::GetInstance();
-  for (auto it = browser_list->begin_browsers_ordered_by_activation();
-       it != browser_list->end_browsers_ordered_by_activation(); ++it) {
-    Browser* last_active = *it;
+  for (Browser* last_active :
+       BrowserList::GetInstance()->OrderedByActivation()) {
     if (last_active && matcher(last_active)) {
       DCHECK(last_active->window());
       return last_active->window();
diff --git a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
index fb2956c..a0d5d379 100644
--- a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
+++ b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
@@ -1990,8 +1990,9 @@
                                       ManifestUpdateResult::kAppUpdated, 0);
 }
 
+// TODO(https://crbug.com/1401216): Flakes on multiple platforms.
 IN_PROC_BROWSER_TEST_P(ManifestUpdateManagerBrowserTest_UpdateDialog,
-                       CheckUpdateOfGeneratedIcons_SyncFailure) {
+                       DISABLED_CheckUpdateOfGeneratedIcons_SyncFailure) {
   // The first "name" character is used to generate icons. Make it like a space
   // to probe the background color at the center. Spaces are trimmed by the
   // parser.
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 5d8f81a2..c5c7345 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1672682320-b25b7bdfb39b82139c431bd552f4c37b0c9cf62e.profdata
+chrome-linux-main-1672725482-3e449bc2de271d52135c5357847d6f6b6fc80edb.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 5f96d6d8..38d917b 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1672660748-6f86c8bbf39ad5fed2b62c49effa11d3672530b7.profdata
+chrome-mac-arm-main-1672725482-5d26ff60156f301dcf5950b26a142ce2ea8ff81d.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 602553a..2c30c2e1 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1672660748-7a9371c1e6f47631520b2291d03b45c3d9a1c5f3.profdata
+chrome-mac-main-1672725482-000415f357322fcdb57f51241c8314b1db5f0625.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index c95857b..aa29d4b 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1672671362-67abd1b4add6fbd71275d267af700944fa11b781.profdata
+chrome-win32-main-1672713566-74267225bf9fc869c9090dd3aa62c1d781d154bb.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 106c845..8fe7329 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1672671362-d0d072b215ff416a52bf1599df03cb7fa15f89f7.profdata
+chrome-win64-main-1672736062-f1b94707b6764cdb5d47ee2f15d101f95b51dffc.profdata
diff --git a/chrome/common/extensions/api/_api_features.json b/chrome/common/extensions/api/_api_features.json
index 25ff99a3..777f728 100644
--- a/chrome/common/extensions/api/_api_features.json
+++ b/chrome/common/extensions/api/_api_features.json
@@ -814,6 +814,10 @@
     "dependencies": ["manifest:system_indicator"],
     "contexts": ["blessed_extension"]
   },
+  "systemLog": {
+    "dependencies": ["permission:systemLog"],
+    "contexts": ["blessed_extension"]
+  },
   "systemPrivate": {
     "dependencies": ["permission:systemPrivate"],
     "contexts": ["blessed_extension"]
diff --git a/chrome/common/extensions/api/_permission_features.json b/chrome/common/extensions/api/_permission_features.json
index 894c27e..425608c 100644
--- a/chrome/common/extensions/api/_permission_features.json
+++ b/chrome/common/extensions/api/_permission_features.json
@@ -848,6 +848,24 @@
       "371AC6869D2138CE58123741E69F67469206909F" // AccessibilityCommon extension. https://crbug.com/1220107
     ]
   },
+  // For now, systemLog API is private to avoid 3rd party logs being sent to
+  // Google in feedback reports. More info: http://crbug.com/1264234
+  "systemLog": [{
+    "channel": "stable",
+    "dependencies": ["behavior:imprivata_extension"],
+    "extension_types": ["extension", "login_screen_extension"],
+    "location": "policy",
+    "platforms": ["chromeos", "lacros"]
+  }, {
+    "channel": "stable",
+    "extension_types": ["extension", "login_screen_extension", "platform_app"],
+    "platforms": ["chromeos", "lacros"],
+    "allowlist": [
+      "EC3DE21E048B67319893889529354DFBFA96FD23", // Smart Card Connector
+      "6B748A5C005F21B7CBCF4170C2F883E435DEB511", // CSSI Smart Card Middleware
+      "075FF17D52ED6E3C2E5EC4D99F188E7A25AF47EA"  // Beta CSSI Smart Card Middleware
+    ]
+  }],
   "systemPrivate": {
     "channel": "stable",
     "extension_types": ["extension", "legacy_packaged_app", "platform_app"],
diff --git a/chrome/common/extensions/api/api_sources.gni b/chrome/common/extensions/api/api_sources.gni
index 342c535..c3b8d808 100644
--- a/chrome/common/extensions/api/api_sources.gni
+++ b/chrome/common/extensions/api/api_sources.gni
@@ -93,6 +93,7 @@
     "platform_keys.idl",
     "quick_unlock_private.idl",
     "shared_storage_private.idl",
+    "system_log.idl",
     "vpn_provider.idl",
     "wallpaper.json",
     "wm_desks_private.idl",
diff --git a/chrome/common/extensions/api/system_log.idl b/chrome/common/extensions/api/system_log.idl
new file mode 100644
index 0000000..0513845
--- /dev/null
+++ b/chrome/common/extensions/api/system_log.idl
@@ -0,0 +1,25 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Use the <code>chrome.systemLog</code> API to record Chrome system logs from
+// extensions.
+[platforms=("chromeos", "lacros"),
+ implemented_in="chrome/browser/chromeos/extensions/system_log/system_log_api.h"]
+namespace systemLog {
+  callback VoidCallback = void ();
+
+  // Options for $(ref:add).
+  // |message|: A log message to record.
+  dictionary MessageOptions {
+    DOMString message;
+  };
+
+  interface Functions {
+    // Adds a new log record.
+    // |options|: The logging options.
+    // |callback|: A callback to invoke once the log has been added.
+    [supportsPromises] static void add(MessageOptions options,
+                                       optional VoidCallback callback);
+  };
+};
diff --git a/chrome/common/extensions/permissions/permission_set_unittest.cc b/chrome/common/extensions/permissions/permission_set_unittest.cc
index ed3db0b4..0f850ef 100644
--- a/chrome/common/extensions/permissions/permission_set_unittest.cc
+++ b/chrome/common/extensions/permissions/permission_set_unittest.cc
@@ -857,6 +857,7 @@
   skip.insert(APIPermissionID::kWebstorePrivate);
   skip.insert(APIPermissionID::kWebstoreWidgetPrivate);
   skip.insert(APIPermissionID::kWmDesksPrivate);
+  skip.insert(APIPermissionID::kSystemLog);
 
   // Warned as part of host permissions.
   skip.insert(APIPermissionID::kDevtools);
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc
index ff598b2..68a0524 100644
--- a/chrome/common/webui_url_constants.cc
+++ b/chrome/common/webui_url_constants.cc
@@ -168,6 +168,10 @@
     "chrome://privacy-sandbox-dialog";
 const char kChromeUIPrivacySandboxDialogCombinedPath[] = "combined";
 const char kChromeUIPrivacySandboxDialogNoticePath[] = "notice";
+const char kChromeUIPrivacySandboxFledgeURL[] =
+    "chrome://settings/adPrivacy/sites";
+const char kChromeUIPrivacySandboxTopicsURL[] =
+    "chrome://settings/adPrivacy/interests";
 const char kChromeUIQuitHost[] = "quit";
 const char kChromeUIQuitURL[] = "chrome://quit/";
 const char kChromeUIQuotaInternalsHost[] = "quota-internals";
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h
index 735a687..b61cb818 100644
--- a/chrome/common/webui_url_constants.h
+++ b/chrome/common/webui_url_constants.h
@@ -163,6 +163,8 @@
 extern const char kChromeUIPrivacySandboxDialogURL[];
 extern const char kChromeUIPrivacySandboxDialogCombinedPath[];
 extern const char kChromeUIPrivacySandboxDialogNoticePath[];
+extern const char kChromeUIPrivacySandboxFledgeURL[];
+extern const char kChromeUIPrivacySandboxTopicsURL[];
 extern const char kChromeUIProfileInternalsHost[];
 extern const char kChromeUIQuitHost[];
 extern const char kChromeUIQuitURL[];
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 2f27b2c..4a1e6fd 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -2527,6 +2527,7 @@
     if (is_chromeos) {
       deps += [
         "//chrome/browser/chromeos",
+        "//chrome/browser/chromeos:test_support",
         "//chrome/browser/web_applications/app_service",
         "//chromeos/constants",
         "//chromeos/ui/frame",
@@ -2537,6 +2538,11 @@
         "../browser/browser_process_platform_part_chromeos_browsertest.cc",
         "../browser/certificate_provider/test_certificate_provider_extension_mixin.cc",
         "../browser/certificate_provider/test_certificate_provider_extension_mixin.h",
+        "../browser/chromeos/policy/dlp/data_transfer_dlp_controller_browsertest.cc",
+        "../browser/chromeos/policy/dlp/dlp_content_restriction_set_browsertest.cc",
+        "../browser/chromeos/policy/dlp/dlp_content_tab_helper_browsertest.cc",
+        "../browser/chromeos/policy/dlp/dlp_data_transfer_notifier_browsertest.cc",
+        "../browser/chromeos/policy/dlp/dlp_rules_manager_impl_browsertest.cc",
         "../browser/chromeos/video_conference/video_conference_media_listener_browsertest.cc",
         "../browser/download/notification/download_notification_browsertest.cc",
         "../browser/ui/views/frame/browser_non_client_frame_view_chromeos_browsertest.cc",
@@ -2727,21 +2733,6 @@
       sources += [
         "../browser/apps/app_service/metrics/website_metrics_browsertest.cc",
         "../browser/apps/app_service/webapk/webapk_utils_lacros_browsertest.cc",
-        "../browser/chromeos/policy/dlp/data_transfer_dlp_controller_browsertest.cc",
-        "../browser/chromeos/policy/dlp/dlp_content_manager_test_helper.cc",
-        "../browser/chromeos/policy/dlp/dlp_content_manager_test_helper.h",
-        "../browser/chromeos/policy/dlp/dlp_content_restriction_set_browsertest.cc",
-        "../browser/chromeos/policy/dlp/dlp_content_tab_helper_browsertest.cc",
-        "../browser/chromeos/policy/dlp/dlp_data_transfer_notifier_browsertest.cc",
-        "../browser/chromeos/policy/dlp/dlp_reporting_manager_test_helper.cc",
-        "../browser/chromeos/policy/dlp/dlp_reporting_manager_test_helper.h",
-        "../browser/chromeos/policy/dlp/dlp_rules_manager_impl_browsertest.cc",
-        "../browser/chromeos/policy/dlp/dlp_rules_manager_test_utils.cc",
-        "../browser/chromeos/policy/dlp/dlp_rules_manager_test_utils.h",
-        "../browser/chromeos/policy/dlp/mock_dlp_content_observer.cc",
-        "../browser/chromeos/policy/dlp/mock_dlp_content_observer.h",
-        "../browser/chromeos/policy/dlp/mock_dlp_rules_manager.cc",
-        "../browser/chromeos/policy/dlp/mock_dlp_rules_manager.h",
         "../browser/lacros/app_mode/kiosk_session_service_browsertest.cc",
         "../browser/lacros/lacros_extension_apps_controller_browsertest.cc",
         "../browser/lacros/lacros_extension_apps_publisher_browsertest.cc",
@@ -3273,6 +3264,7 @@
           "../browser/chromeos/extensions/login_screen/login_screen_storage/login_screen_storage_apitest.cc",
           "../browser/chromeos/extensions/login_screen/login_state/session_state_changed_event_dispatcher_ash_apitest.cc",
           "../browser/chromeos/extensions/login_screen/storage_apitest.cc",
+          "../browser/chromeos/extensions/system_log/system_log_apitest.cc",
           "../browser/chromeos/extensions/wallpaper_apitest.cc",
           "../browser/chromeos/extensions/wm/wm_desks_private_apitest.cc",
           "../browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_apitest_chromeos.cc",
@@ -4022,23 +4014,6 @@
         "../browser/ash/web_applications/shimless_rma_integration_browsertest.cc",
         "../browser/ash/web_applications/shortcut_customization_app_integration_browsertest.cc",
         "../browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service_browsertest.cc",
-        "../browser/chromeos/policy/dlp/data_transfer_dlp_controller_browsertest.cc",
-        "../browser/chromeos/policy/dlp/dlp_content_restriction_set_browsertest.cc",
-        "../browser/chromeos/policy/dlp/dlp_content_tab_helper_browsertest.cc",
-        "../browser/chromeos/policy/dlp/dlp_data_transfer_notifier_browsertest.cc",
-        "../browser/chromeos/policy/dlp/dlp_reporting_manager_test_helper.cc",
-        "../browser/chromeos/policy/dlp/dlp_reporting_manager_test_helper.h",
-        "../browser/chromeos/policy/dlp/dlp_rules_manager_impl_browsertest.cc",
-        "../browser/chromeos/policy/dlp/dlp_rules_manager_test_utils.cc",
-        "../browser/chromeos/policy/dlp/dlp_rules_manager_test_utils.h",
-        "../browser/chromeos/policy/dlp/mock_dlp_content_manager.cc",
-        "../browser/chromeos/policy/dlp/mock_dlp_content_manager.h",
-        "../browser/chromeos/policy/dlp/mock_dlp_content_observer.cc",
-        "../browser/chromeos/policy/dlp/mock_dlp_content_observer.h",
-        "../browser/chromeos/policy/dlp/mock_dlp_rules_manager.cc",
-        "../browser/chromeos/policy/dlp/mock_dlp_rules_manager.h",
-        "../browser/chromeos/policy/dlp/mock_dlp_warn_notifier.cc",
-        "../browser/chromeos/policy/dlp/mock_dlp_warn_notifier.h",
         "../browser/chromeos/tablet_mode/chrome_content_browser_client_tablet_mode_part_browsertest.cc",
         "../browser/chromeos/tablet_mode/tablet_mode_page_behavior_browsertest.cc",
         "../browser/chromeos/video_conference/video_conference_manager_client_browsertest.cc",
@@ -4813,8 +4788,6 @@
 
       # dlp_content_manager_lacros_browsertest.cc should become a unit test.
       "../browser/chromeos/policy/dlp/dlp_content_manager_lacros_browsertest.cc",
-      "../browser/chromeos/policy/dlp/dlp_content_manager_test_helper.cc",
-      "../browser/chromeos/policy/dlp/dlp_content_manager_test_helper.h",
       "../browser/extensions/api/shared_storage/shared_storage_private_apitest.cc",
       "../browser/lacros/device_attributes_lacros_browsertest.cc",
 
@@ -4836,6 +4809,7 @@
       ":test_support",
       "//chrome/app:command_ids",
       "//chrome/browser/chromeos",
+      "//chrome/browser/chromeos:test_support",
       "//chrome/browser/chromeos/extensions/telemetry/api:browser_tests",
       "//chromeos/crosapi/mojom",
       "//chromeos/lacros",
@@ -4876,8 +4850,6 @@
       "../browser/chromeos/extensions/login_screen/login_screen_storage/login_screen_storage_apitest.cc",
       "../browser/chromeos/extensions/wallpaper_apitest.cc",
       "../browser/chromeos/extensions/wm/wm_desks_private_apitest_lacros.cc",
-      "../browser/chromeos/policy/dlp/dlp_content_manager_test_helper.cc",
-      "../browser/chromeos/policy/dlp/dlp_content_manager_test_helper.h",
       "../browser/chromeos/tablet_mode/tablet_mode_page_behavior_browsertest.cc",
       "../browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_lacros_apitest.cc",
       "../browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc",
@@ -4940,6 +4912,7 @@
       ":webrtc_browser_tests_base",
       "//chrome/app:command_ids",
       "//chrome/browser/chromeos",
+      "//chrome/browser/chromeos:test_support",
       "//chrome/browser/chromeos/extensions/vpn_provider",
       "//chrome/browser/chromeos/extensions/wm",
       "//chrome/browser/metrics/structured",
@@ -7305,8 +7278,6 @@
       "../browser/apps/intent_helper/metrics/intent_handling_metrics_unittest.cc",
       "../browser/apps/intent_helper/supported_links_infobar_prefs_service_unittest.cc",
       "../browser/certificate_provider/certificate_provider_service_unittest.cc",
-      "../browser/chromeos/arc/arc_external_protocol_dialog_unittest.cc",
-      "../browser/chromeos/arc/open_with_menu_unittest.cc",
       "../browser/download/notification/download_item_notification_unittest.cc",
       "../browser/extensions/api/document_scan/document_scan_api_unittest.cc",
       "../browser/hid/hid_pinned_notification_unittest.cc",
@@ -7320,13 +7291,16 @@
 
     deps += [
       "//chrome/browser/chromeos",
-      "//chrome/browser/chromeos/launcher_search:search_util",
+      "//chrome/browser/chromeos:test_support",
       "//chromeos/components/disks:prefs",
       "//chromeos/dbus/power",
       "//components/arc/common",
       "//components/arc/common:arc_intent_helper_constants",
       "//components/arc/common:arc_test_support",
       "//ui/chromeos",
+
+      # Unit tests from subdirectories.
+      "//chrome/browser/chromeos:unit_tests",
     ]
 
     if (use_cups) {
@@ -7626,8 +7600,7 @@
       "//chrome/browser/ash/system_extensions:unit_tests",
       "//chrome/browser/ash/system_web_apps/test_support",
       "//chrome/browser/chromeos",
-      "//chrome/browser/chromeos:test_support",
-      "//chrome/browser/chromeos:unit_tests",
+      "//chrome/browser/chromeos/launcher_search:search_util",
       "//chrome/browser/enterprise/connectors/device_trust/attestation/ash",
       "//chrome/browser/nearby_sharing:share_target",
       "//chrome/browser/nearby_sharing/certificates",
@@ -7747,27 +7720,6 @@
       "../browser/apps/app_service/app_service_proxy_lacros_unittest.cc",
       "../browser/apps/app_service/mock_crosapi_app_service_proxy.cc",
       "../browser/apps/app_service/mock_crosapi_app_service_proxy.h",
-      "../browser/chromeos/policy/dlp/data_transfer_dlp_controller_unittest.cc",
-      "../browser/chromeos/policy/dlp/dlp_clipboard_notifier_unittest.cc",
-      "../browser/chromeos/policy/dlp/dlp_confidential_contents_unittest.cc",
-      "../browser/chromeos/policy/dlp/dlp_confidential_file_unittest.cc",
-      "../browser/chromeos/policy/dlp/dlp_content_tab_helper_unittest.cc",
-      "../browser/chromeos/policy/dlp/dlp_drag_drop_notifier_unittest.cc",
-      "../browser/chromeos/policy/dlp/dlp_reporting_manager_test_helper.cc",
-      "../browser/chromeos/policy/dlp/dlp_reporting_manager_test_helper.h",
-      "../browser/chromeos/policy/dlp/dlp_reporting_manager_unittest.cc",
-      "../browser/chromeos/policy/dlp/dlp_rules_manager_impl_unittest.cc",
-      "../browser/chromeos/policy/dlp/dlp_rules_manager_test_utils.cc",
-      "../browser/chromeos/policy/dlp/dlp_rules_manager_test_utils.h",
-      "../browser/chromeos/policy/dlp/dlp_scoped_file_access_delegate_unittest.cc",
-      "../browser/chromeos/policy/dlp/mock_dlp_content_manager.cc",
-      "../browser/chromeos/policy/dlp/mock_dlp_content_manager.h",
-      "../browser/chromeos/policy/dlp/mock_dlp_content_observer.cc",
-      "../browser/chromeos/policy/dlp/mock_dlp_content_observer.h",
-      "../browser/chromeos/policy/dlp/mock_dlp_rules_manager.cc",
-      "../browser/chromeos/policy/dlp/mock_dlp_rules_manager.h",
-      "../browser/chromeos/reporting/device_reporting_settings_lacros_unittest.cc",
-      "../browser/chromeos/reporting/metric_reporting_manager_lacros_unittest.cc",
       "../browser/lacros/account_manager/account_manager_util_unittest.cc",
       "../browser/lacros/account_manager/account_profile_mapper_unittest.cc",
       "../browser/lacros/account_manager/get_account_information_helper_unittest.cc",
@@ -7793,12 +7745,10 @@
       "../browser/signin/signin_ui_delegate_impl_lacros_unittest.cc",
       "../browser/upgrade_detector/get_installed_version_lacros_unittest.cc",
       "../common/chrome_paths_lacros_unittest.cc",
-      "../common/extensions/api/file_browser_handlers/file_browser_handler_manifest_unittest.cc",
     ]
 
     deps += [
       "//chrome/browser/chromeos:dlp_policy_event_proto",
-      "//chrome/browser/chromeos/launcher_search:unit_tests",
       "//chrome/browser/policy:onc",
       "//chrome/browser/policy:unit_tests",
       "//chromeos/components/onc:onc",
@@ -8302,18 +8252,7 @@
     }
 
     if (is_chromeos) {
-      sources += [
-        "../browser/chromeos/extensions/contact_center_insights/contact_center_insights_extension_manager_unittest.cc",
-        "../browser/chromeos/extensions/login_screen/login/external_logout_request/external_logout_request_event_handler_unittest.cc",
-        "../browser/chromeos/extensions/login_screen/login_state/login_state_api_unittest.cc",
-        "../browser/chromeos/reporting/network/network_bandwidth_sampler_unittest.cc",
-      ]
-      deps += [
-        "//chrome/browser/chromeos/extensions/telemetry:unit_tests",
-        "//chrome/common/chromeos/extensions",
-        "//chromeos/dbus/missive:missive",
-        "//components/reporting/proto:metric_data_proto",
-      ]
+      deps += [ "//chromeos/dbus/missive" ]
     }
 
     if (is_chromeos_ash) {
@@ -8323,9 +8262,6 @@
         "../browser/ash/login/easy_unlock/easy_unlock_notification_controller_unittest.cc",
         "../browser/ash/login/easy_unlock/easy_unlock_service_regular_unittest.cc",
         "../browser/ash/login/easy_unlock/smartlock_feature_usage_metrics_unittest.cc",
-        "../browser/chromeos/extensions/login_screen/login/external_logout_done/external_logout_done_event_handler_unittest.cc",
-        "../browser/chromeos/extensions/login_screen/login_screen_storage/login_screen_storage_api_ash_unittest.cc",
-        "../browser/chromeos/extensions/login_screen/login_state/session_state_changed_event_dispatcher_ash_unittest.cc",
         "../browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api_ash_unittest.cc",
         "../browser/extensions/api/file_system/consent_provider_unittest.cc",
         "../browser/extensions/api/image_writer_private/removable_storage_provider_chromeos_unittest.cc",
@@ -10009,6 +9945,7 @@
     if (is_chromeos) {
       deps += [
         "//chrome/browser/chromeos",
+        "//chrome/browser/chromeos:test_support",
         "//chromeos/constants",
         "//chromeos/ui/base",
         "//chromeos/ui/frame",
@@ -10021,16 +9958,6 @@
 
       sources += [
         "../browser/chromeos/policy/dlp/dlp_content_manager_browsertest.cc",
-        "../browser/chromeos/policy/dlp/dlp_content_manager_test_helper.cc",
-        "../browser/chromeos/policy/dlp/dlp_content_manager_test_helper.h",
-        "../browser/chromeos/policy/dlp/dlp_reporting_manager_test_helper.cc",
-        "../browser/chromeos/policy/dlp/dlp_reporting_manager_test_helper.h",
-        "../browser/chromeos/policy/dlp/dlp_rules_manager_test_utils.cc",
-        "../browser/chromeos/policy/dlp/dlp_rules_manager_test_utils.h",
-        "../browser/chromeos/policy/dlp/mock_dlp_content_observer.cc",
-        "../browser/chromeos/policy/dlp/mock_dlp_content_observer.h",
-        "../browser/chromeos/policy/dlp/mock_dlp_rules_manager.cc",
-        "../browser/chromeos/policy/dlp/mock_dlp_rules_manager.h",
         "../browser/printing/test_print_preview_dialog_cloned_observer.cc",
         "../browser/printing/test_print_preview_dialog_cloned_observer.h",
         "../browser/printing/test_print_view_manager_for_request_preview.cc",
diff --git a/chrome/test/data/extensions/api_test/system_log.pem b/chrome/test/data/extensions/api_test/system_log.pem
new file mode 100644
index 0000000..56608c1
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/system_log.pem
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDCTAkTytmrAAIB
+p3igojmW3L1+h8q+qKB7lt+D7H/wyCpfhb1XUd4GSQdkw8Ky3pC8Vx+bqmcwo12o
+sCvTP0Y+Cr8I9Z1tU8idbsRNKWGU44kR6ZPmh39bfpi5kJlicga1frMYwnknkZuu
+mwBCo4qMQ/qEfv82edqIB0RkI/9XXVtDCd68c7ajArjdShzA35whD669ijsF3mxb
+Spou7tAk4JxAf8bPFGa6By0AhGPumt3OvmpGi4sdaHnBm23ow+k2b4OyJyHcUfXZ
+fjvPR95pu5Npx3pUL6mUCfwDJK5qGTQrd7BxirnSjyxA5mWLbRw4Yeq/6DjPjDJd
+eDr7EjYVAgMBAAECggEAFtDWngrg2Eo7chXy6IC0R4lrUnZAB3cwxTfjI7rmuTp1
+c1shRVA5RL6to2uzgM1O7LbvC24NXlzzYhwx6/APCmO4/s8s1Io//BtmP3NftfFU
+MWoe3TVwbf47O/XayoB+VjC8d5NapnFcTpAoDdXmLpt1nw/KCLZyxCzU9KIfhBLK
+H9d96Mt+1ZLTjfpica1OYljl8sohP1g7l59oHyDpw+4r7n0RoYMqjcyunKRMY0DN
+5jsDtm1II/VadT5EzEk7EbQ5aeXgR/SvaR+8TRtOU8GFccE+fOU0OqdiN8ya4epR
+7izJ0K87q7xx73saprxuOW6oDSlyJmiqttbZv5hJLwKBgQDp0BdkoniwLd9/SI/e
+PZ/UmZ7llUJt5Jp5TJ/zoolwtbnymbIqngZS51mdfnwBNqAHnp1sTOuBsr0GRBoD
+u9NE+IOrCyxczvKuAprfsVz11AtPV9wbQRSmIdVeLUOaF6v7kOJNeZw1FHoRRvZr
+5uLszZ2tHx7Cv0xfC00SRbT2zwKBgQDUvAD413zMPfDDebUc6F8HlK5/qekeEzTI
+Zmnb/hxCqOrYnyK4NXxnQIm+MJZFGD3cLhdswRSu1ZU1/G5E/qxe17pM0d7Q2xDf
+3wh68SDr7mqNjcIBDunPjWJ3Fke2NEgz27VqU5GnWCwJJLFABQbrFEVlsL+jQL/3
+4l/rZ0B92wKBgHtRu+TiJJGXwFeb5/WpvxEc7Ufdz6mydx8fIQYZZjBCSQ8BrYz4
+yBEV4JhGzBS/wOwD5rfmYhiIM1aIuMfbWvT3tkqSnBVfOXQ5/4GYRJWL/2MbzgW5
+77AoDCed7BfsAFOw+Qsv5wnAARn3uaTzpCCN2mojDdBdoWRHy6Clj2rVAoGAFOUG
+X2qi6linHjwFCvrT4qW64fUpXXfbdleAzEfQNMfskSxIN7mhJ28SWGjjSZQQ92Bb
+kqYARw/ZYP0TQ5mUCpi7xrHSZccuiB6a8aBfcGzxcEfdJ0d0tZsYccPxdTb7ZISO
+9AuTQdGKObet5TDZNhu+mTdcC0ff0xQcAb4ZeoMCgYEAt+nA7oFTkn9RYGSYzdq7
+dFkvUhXkFvaB4UI5iMl4D9nXY39FmGO9Vkm7CRjBgdKAHOPJq5NuZbxRQxxYoLFB
+5bXo6Ge8YyP1ddE22uRJCMWTHAispEIjycRWhRLAV5MkzeRT/A1bh1Os4gRQ0rN1
+o4+jAn9qEP4eqYlVMqNzNLc=
+-----END PRIVATE KEY-----
diff --git a/chrome/test/data/extensions/api_test/system_log/manifest.json b/chrome/test/data/extensions/api_test/system_log/manifest.json
new file mode 100644
index 0000000..e28c4ddc
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/system_log/manifest.json
@@ -0,0 +1,12 @@
+{
+  "name": "System Log API test",
+  "version": "1.0",
+  "manifest_version": 3,
+  "description": "API tests for System Log extensions API",
+  "background": {
+    "service_worker": "test.js"
+  },
+  "permissions": [
+    "systemLog"
+  ]
+}
diff --git a/chrome/test/data/extensions/api_test/system_log/test.js b/chrome/test/data/extensions/api_test/system_log/test.js
new file mode 100644
index 0000000..3f31372
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/system_log/test.js
@@ -0,0 +1,29 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+const logOptions = { message: "Test log message" };
+
+const testCases = [
+  async function AddLogWithCallback() {
+    chrome.systemLog.add(logOptions, () => {
+      chrome.test.assertNoLastError();
+      chrome.test.succeed();
+    });
+  },
+  async function AddLogWithPromise() {
+    await chrome.systemLog.add(logOptions);
+    chrome.test.succeed();
+  },
+];
+
+chrome.test.getConfig(async (config) => {
+  const testName = config.customArg;
+  const testCase = testCases.find((f) => f.name === testName);
+  if (!testCase) {
+    chrome.test.notifyFail(`Test case '${testName}' not found`);
+    return;
+  }
+
+  chrome.test.runTests([testCase]);
+});
diff --git a/chrome/test/data/password/captured_sites/cipd.yaml b/chrome/test/data/password/captured_sites/cipd.yaml
deleted file mode 100644
index 3723e0c..0000000
--- a/chrome/test/data/password/captured_sites/cipd.yaml
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2019 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:$(cat version.txt)
-package: chromium/chrome/test/data/password/captured_sites
-
-# Web Page Replay (WPR) Go archives and test recipes for Chrome Password Manager
-# captured sites tests.
-# Each WPR go archive can simulate the checkout workflow on a site.
-# Each recipe contains instructions for the test framework to perform a password
-# manager scenario.
-# Captured Sites Test Framework Eng doc:
-# https://docs.google.com/document/d/12ZLoGmBK9kc5C5ComHkJWWJUXOda5K0uFr-hfSt6ZUg
-description: captured sites test archives and recipes.
-install_mode: copy
-data:
-  - dir: capture_update_pass
-  - dir: sign_in_pass
-  - dir: sign_up_fill
-  - dir: sign_up_pass
diff --git a/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_extension_gif.js b/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_extension_gif.js
index bef5aa4d..290c486 100644
--- a/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_extension_gif.js
+++ b/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_extension_gif.js
@@ -9,7 +9,7 @@
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {assertFalse, assertTrue} from 'chrome://webui-test/chromeos/chai_assert.js';
 
-import {deepQuerySelector} from './emoji_picker_test_util.js';
+import {deepQuerySelector, timeout, waitForCondition} from './emoji_picker_test_util.js';
 
 const ACTIVE_CATEGORY_BUTTON = 'category-button-active';
 
@@ -95,7 +95,7 @@
 
     test(
         category + ' category button should be active after clicking at it.',
-        () => {
+        async () => {
           const allCategoryButtons =
               Array
                   .from(
@@ -105,13 +105,13 @@
                   .map(item => item.shadowRoot.querySelector('cr-icon-button'));
           const categoryButton = allCategoryButtons[categoryIndex];
           categoryButton.click();
-          flush();
-          assertTrue(isCategoryButtonActive(categoryButton));
-          allCategoryButtons.forEach((categoryButtonItem, index) => {
-            if (index !== categoryIndex) {
-              assertFalse(isCategoryButtonActive(categoryButtonItem));
-            }
-          });
+          waitForCondition(
+              () => isCategoryButtonActive(categoryButton) &&
+                  allCategoryButtons.every(
+                      (categoryButtonItem, index) =>
+                          (index === categoryIndex ||
+                           isCategoryButtonActive(categoryButtonItem))),
+              'gif section failed to be active', 5000);
         });
   });
 }
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js
index d4950119..f282663 100644
--- a/chrome/test/data/webui/settings/cr_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -1062,7 +1062,8 @@
 ].forEach(test => registerTestSuites(...test));
 
 // TODO(crbug.com/1403969): SecurityPage_SafeBrowsing suite is flaky on Mac.
-GEN('#if !BUILDFLAG(IS_MAC)');
+// TODO(crbug.com/1404109): SecurityPage_SafeBrowsing suite is flaky on Linux.
+GEN('#if !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_LINUX)');
 registerTestSuites(
     'SecurityPage', 'security_page_test.js', ['SecurityPage_SafeBrowsing']);
 GEN('#endif');
diff --git a/chrome/test/data/webui/settings/privacy_sandbox_page_test.ts b/chrome/test/data/webui/settings/privacy_sandbox_page_test.ts
index 4aea5a7c..8e8dc964 100644
--- a/chrome/test/data/webui/settings/privacy_sandbox_page_test.ts
+++ b/chrome/test/data/webui/settings/privacy_sandbox_page_test.ts
@@ -7,7 +7,7 @@
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {CrDialogElement, SettingsPrivacySandboxAdMeasurementSubpageElement, SettingsPrivacySandboxFledgeSubpageElement, SettingsPrivacySandboxPageElement, SettingsPrivacySandboxTopicsSubpageElement} from 'chrome://settings/lazy_load.js';
 import {CrSettingsPrefs, PrivacySandboxBrowserProxyImpl, Router, routes, SettingsPrefsElement} from 'chrome://settings/settings.js';
-import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js';
 import {isChildVisible, isVisible} from 'chrome://webui-test/test_util.js';
 
@@ -362,6 +362,17 @@
     assertTrue(page.$.topicsToggle.controlDisabled());
     assertFalse(isChildVisible(page, '#currentTopicsSection'));
   });
+
+  test('footerLinks', async function() {
+    assertTrue(isChildVisible(page, '#footer'));
+    const links =
+        page.shadowRoot!.querySelectorAll<HTMLAnchorElement>('#footer a[href]');
+    assertEquals(links.length, 2, 'footer should contains two links');
+    const hrefs = Array.from<HTMLAnchorElement>(links).map(link => link.href);
+    const expectedLinks =
+        ['chrome://settings/adPrivacy/sites', 'chrome://settings/cookies'];
+    assertDeepEquals(hrefs, expectedLinks);
+  });
 });
 
 suite('PrivacySandboxFledgeSubpageTests', function() {
@@ -510,6 +521,17 @@
         loadTimeData.getString('fledgePageBlockedSitesDescription'),
         blockedSitesDescription.innerText);
   });
+
+  test('footerLinks', async function() {
+    assertTrue(isChildVisible(page, '#footer'));
+    const links =
+        page.shadowRoot!.querySelectorAll<HTMLAnchorElement>('#footer a[href]');
+    assertEquals(links.length, 2, 'footer should contains two links');
+    const hrefs = Array.from<HTMLAnchorElement>(links).map(link => link.href);
+    const expectedLinks =
+        ['chrome://settings/adPrivacy/interests', 'chrome://settings/cookies'];
+    assertDeepEquals(hrefs, expectedLinks);
+  });
 });
 
 suite('PrivacySandboxAdMeasurementSubpageTests', function() {
diff --git a/chrome/test/data/webui/side_panel/bookmarks/test_bookmarks_api_proxy.ts b/chrome/test/data/webui/side_panel/bookmarks/test_bookmarks_api_proxy.ts
index 47adfa87..50ffed4f 100644
--- a/chrome/test/data/webui/side_panel/bookmarks/test_bookmarks_api_proxy.ts
+++ b/chrome/test/data/webui/side_panel/bookmarks/test_bookmarks_api_proxy.ts
@@ -76,16 +76,17 @@
     this.folders_ = folders;
   }
 
-  contextMenuOpenBookmarkInNewTab(id: string, source: ActionSource) {
-    this.methodCalled('contextMenuOpenBookmarkInNewTab', id, source);
+  contextMenuOpenBookmarkInNewTab(ids: string[], source: ActionSource) {
+    this.methodCalled('contextMenuOpenBookmarkInNewTab', ids, source);
   }
 
-  contextMenuOpenBookmarkInNewWindow(id: string, source: ActionSource) {
-    this.methodCalled('contextMenuOpenBookmarkInNewWindow', id, source);
+  contextMenuOpenBookmarkInNewWindow(ids: string[], source: ActionSource) {
+    this.methodCalled('contextMenuOpenBookmarkInNewWindow', ids, source);
   }
 
-  contextMenuOpenBookmarkInIncognitoWindow(id: string, source: ActionSource) {
-    this.methodCalled('contextMenuOpenBookmarkInIncognitoWindow', id, source);
+  contextMenuOpenBookmarkInIncognitoWindow(
+      ids: string[], source: ActionSource) {
+    this.methodCalled('contextMenuOpenBookmarkInIncognitoWindow', ids, source);
   }
 
   contextMenuDelete(id: string, source: ActionSource) {
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 02d728c..b7efdc6a 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-15299.0.0
\ No newline at end of file
+15300.0.0
\ No newline at end of file
diff --git a/chromeos/ash/components/drivefs/drivefs_pin_manager.cc b/chromeos/ash/components/drivefs/drivefs_pin_manager.cc
index 838061a8..496483d 100644
--- a/chromeos/ash/components/drivefs/drivefs_pin_manager.cc
+++ b/chromeos/ash/components/drivefs/drivefs_pin_manager.cc
@@ -4,12 +4,14 @@
 
 #include "chromeos/ash/components/drivefs/drivefs_pin_manager.h"
 
+#include <locale>
 #include <utility>
 #include <vector>
 
 #include "base/functional/bind.h"
 #include "base/functional/callback_forward.h"
 #include "base/logging.h"
+#include "base/no_destructor.h"
 #include "base/ranges/algorithm.h"
 #include "base/strings/stringprintf.h"
 #include "base/system/sys_info.h"
@@ -54,6 +56,12 @@
   }
 };
 
+class NumPunct : public std::numpunct<char> {
+ private:
+  char do_thousands_sep() const override { return ','; }
+  std::string do_grouping() const override { return "\3"; }
+};
+
 }  // namespace
 
 std::ostream& operator<<(std::ostream& out, HumanReadableSize size) {
@@ -67,8 +75,16 @@
     i = -i;
   }
 
+  {
+    static const base::NoDestructor<std::locale> with_separators(
+        std::locale::classic(), new NumPunct);
+    std::locale old_locale = out.imbue(*with_separators);
+    out << i;
+    out.imbue(std::move(old_locale));
+  }
+
   if (i < 1024) {
-    return out << i << " B";
+    return out;
   }
 
   double d = static_cast<double>(i) / 1024;
@@ -79,7 +95,7 @@
   }
 
   const int precision = d < 10 ? 2 : d < 100 ? 1 : 0;
-  return out << base::StringPrintf("%.*f %ciB", precision, d, *unit);
+  return out << base::StringPrintf(" (%.*f %c)", precision, d, *unit);
 }
 
 std::ostream& operator<<(std::ostream& out, const SetupError error) {
@@ -89,15 +105,12 @@
     return out << #s;
     PRINT(Success)
     PRINT(ManagerDisabled)
-    PRINT(ErrorCalculatingFreeDiskSpace)
-    PRINT(ErrorRetrievingSearchResults)
-    PRINT(ErrorResultsReturnedInvalid)
-    PRINT(ErrorNotEnoughFreeSpace)
-    PRINT(ErrorRetrievingSearchResultsForPinning)
-    PRINT(ErrorResultsReturnedInvalidForPinning)
-    PRINT(ErrorFailedToPinItem)
-    PRINT(ErrorSearchQueryNotBound)
-    PRINT(ErrorManagerStopped)
+    PRINT(ManagerStopped)
+    PRINT(CannotCalculateFreeSpace)
+    PRINT(CannotRetrieveSearchResults)
+    PRINT(CannotPinItem)
+    PRINT(NotEnoughSpace)
+    PRINT(SearchQueryNotBound)
 #undef PRINT
   }
 
@@ -116,9 +129,9 @@
     PRINT(Error)
     PRINT(NotStarted)
     PRINT(Started)
-    PRINT(CalculatedFreeLocalDiskSpace)
-    PRINT(CalculatedRequiredDiskSpace)
-    PRINT(FinishedSetup)
+    PRINT(CalculatedFreeSpace)
+    PRINT(CalculatedRequiredSpace)
+    PRINT(Finished)
 #undef PRINT
   }
 
@@ -155,7 +168,7 @@
 
 int64_t DriveFsPinManager::InProgressSyncingItems::RemoveItem(
     const std::string& path,
-    int64_t total_bytes) {
+    const int64_t total_bytes) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   const auto it = in_progress_items_.find(path);
   if (it == in_progress_items_.end()) {
@@ -216,32 +229,26 @@
   return unstarted_items;
 }
 
-bool ManagerState::SetupInProgress() {
-  return progress.stage != SetupStage::kFinishedSetup &&
+bool ManagerState::SetupInProgress() const {
+  return progress.stage != SetupStage::kFinished &&
          progress.stage != SetupStage::kError &&
          progress.stage != SetupStage::kNotStarted;
 }
 
-DriveFsPinManager::DriveFsPinManager(bool enabled,
-                                     const base::FilePath& profile_path,
-                                     mojom::DriveFs* drivefs_interface)
-    : enabled_(enabled),
-      free_disk_space_(std::make_unique<FreeDiskSpaceImpl>()),
-      profile_path_(profile_path),  // The GCache directory is located in the
-                                    // users profile path.
-      drivefs_interface_(drivefs_interface),
-      task_runner_(base::ThreadPool::CreateSequencedTaskRunner({})),
-      syncing_items_(
-          base::SequenceBound<InProgressSyncingItems>{task_runner_}) {}
-
 DriveFsPinManager::DriveFsPinManager(
     bool enabled,
     const base::FilePath& profile_path,
     mojom::DriveFs* drivefs_interface,
     std::unique_ptr<FreeDiskSpaceDelegate> free_disk_space)
-    : DriveFsPinManager(enabled, profile_path, drivefs_interface) {
-  free_disk_space_ = std::move(free_disk_space);
-}
+    : enabled_(enabled),
+      free_disk_space_(free_disk_space ? std::move(free_disk_space)
+                                       : std::make_unique<FreeDiskSpaceImpl>()),
+      profile_path_(profile_path),  // The GCache directory is located in the
+                                    // users profile path.
+      drivefs_interface_(drivefs_interface),
+      task_runner_(base::ThreadPool::CreateSequencedTaskRunner({})),
+      syncing_items_(
+          base::SequenceBound<InProgressSyncingItems>{task_runner_}) {}
 
 DriveFsPinManager::~DriveFsPinManager() = default;
 
@@ -270,24 +277,21 @@
 }
 
 void DriveFsPinManager::Stop() {
-  Complete(SetupError::kErrorManagerStopped);
+  Complete(SetupError::kManagerStopped);
 }
 
-void DriveFsPinManager::OnFreeDiskSpaceRetrieved(int64_t free_space) {
-  if (free_space == -1) {
+void DriveFsPinManager::OnFreeDiskSpaceRetrieved(const int64_t free_space) {
+  if (free_space < 0) {
     LOG(ERROR) << "Cannot calculate free space";
-    std::move(complete_callback_)
-        .Run(SetupError::kErrorCalculatingFreeDiskSpace);
-    return;
+    return Complete(SetupError::kCannotCalculateFreeSpace);
   }
 
-  state_.progress.stage = SetupStage::kCalculatedFreeLocalDiskSpace;
+  VLOG(2) << "Free space: " << HumanReadableSize(free_space);
+  state_.progress.stage = SetupStage::kCalculatedFreeSpace;
   state_.progress.available_disk_space = free_space;
   NotifyProgress();
 
-  VLOG(1) << "Starting to search for items to calculate required space";
-  VLOG(2) << "Free space: "
-          << HumanReadableSize(state_.progress.available_disk_space);
+  VLOG(1) << "Enumerating items to calculate required space...";
   mojom::QueryParametersPtr query = CreateMyDriveQuery();
   drivefs_interface_->StartSearchQuery(
       search_query_.BindNewPipeAndPassReceiver(), std::move(query));
@@ -299,16 +303,9 @@
 void DriveFsPinManager::OnSearchResultForSizeCalculation(
     const drive::FileError error,
     const absl::optional<std::vector<drivefs::mojom::QueryItemPtr>> items) {
-  if (error != drive::FILE_ERROR_OK) {
+  if (error != drive::FILE_ERROR_OK || !items) {
     LOG(ERROR) << "Cannot list files for size calculation: " << error;
-    Complete(SetupError::kErrorRetrievingSearchResults);
-    return;
-  }
-
-  if (!items.has_value()) {
-    LOG(ERROR) << "Invalid item list";
-    Complete(SetupError::kErrorResultsReturnedInvalid);
-    return;
+    return Complete(SetupError::kCannotRetrieveSearchResults);
   }
 
   if (items->empty()) {
@@ -318,8 +315,7 @@
             << HumanReadableSize(state_.progress.required_disk_space);
     VLOG(1) << "Free space: "
             << HumanReadableSize(state_.progress.available_disk_space);
-    StartBatchPinning();
-    return;
+    return StartBatchPinning();
   }
 
   VLOG(2) << "Iterating over " << items->size()
@@ -345,13 +341,11 @@
                << HumanReadableSize(state_.progress.required_disk_space)
                << ", Free = "
                << HumanReadableSize(state_.progress.available_disk_space);
-    Complete(SetupError::kErrorNotEnoughFreeSpace);
-    return;
+    return Complete(SetupError::kNotEnoughSpace);
   }
 
   if (!search_query_.is_bound()) {
-    Complete(SetupError::kErrorSearchQueryNotBound);
-    return;
+    return Complete(SetupError::kSearchQueryNotBound);
   }
 
   NotifyProgress();
@@ -362,9 +356,14 @@
 
 void DriveFsPinManager::Complete(const SetupError error) {
   state_.progress.error = error;
-  state_.progress.stage = error == SetupError::kSuccess
-                              ? SetupStage::kFinishedSetup
-                              : SetupStage::kError;
+  if (error == SetupError::kSuccess) {
+    VLOG(1) << "Finished with success";
+    state_.progress.stage = SetupStage::kFinished;
+  } else {
+    LOG(ERROR) << "Finished with error: " << error;
+    state_.progress.stage = SetupStage::kError;
+  }
+
   NotifyProgress();
   weak_ptr_factory_.InvalidateWeakPtrs();
   search_query_.reset();
@@ -377,12 +376,11 @@
   // Restart the search query.
   search_query_.reset();
 
-  state_.progress.stage = SetupStage::kCalculatedRequiredDiskSpace;
+  state_.progress.stage = SetupStage::kCalculatedRequiredSpace;
   NotifyProgress();
 
-  mojom::QueryParametersPtr query = CreateMyDriveQuery();
   drivefs_interface_->StartSearchQuery(
-      search_query_.BindNewPipeAndPassReceiver(), std::move(query));
+      search_query_.BindNewPipeAndPassReceiver(), CreateMyDriveQuery());
   search_query_->GetNextPage(
       base::BindOnce(&DriveFsPinManager::OnSearchResultsForPinning,
                      weak_ptr_factory_.GetWeakPtr()));
@@ -397,18 +395,11 @@
 }
 
 void DriveFsPinManager::OnSearchResultsForPinning(
-    drive::FileError error,
-    absl::optional<std::vector<drivefs::mojom::QueryItemPtr>> items) {
-  if (error != drive::FILE_ERROR_OK) {
+    const drive::FileError error,
+    const absl::optional<std::vector<drivefs::mojom::QueryItemPtr>> items) {
+  if (error != drive::FILE_ERROR_OK || !items) {
     LOG(ERROR) << "Cannot list files to pin: " << error;
-    Complete(SetupError::kErrorRetrievingSearchResultsForPinning);
-    return;
-  }
-
-  if (!items.has_value()) {
-    LOG(ERROR) << "Invalid item list";
-    Complete(SetupError::kErrorResultsReturnedInvalidForPinning);
-    return;
+    return Complete(SetupError::kCannotRetrieveSearchResults);
   }
 
   if (items->empty()) {
@@ -417,11 +408,10 @@
     if (state_.progress.error_count > 0) {
       LOG(ERROR) << "There were " << state_.progress.error_count
                  << " errors while pinning files";
-      Complete(SetupError::kErrorFailedToPinItem);
-    } else {
-      Complete(SetupError::kSuccess);
+      return Complete(SetupError::kCannotPinItem);
     }
-    return;
+
+    return Complete(SetupError::kSuccess);
   }
 
   // TODO(b/259454320): Free disk space should be retrieved here and after the
@@ -451,8 +441,7 @@
   }
 
   if (!search_query_.is_bound()) {
-    Complete(SetupError::kErrorSearchQueryNotBound);
-    return;
+    return Complete(SetupError::kSearchQueryNotBound);
   }
 
   VLOG(1) << "All items in current batch are already pinned";
@@ -517,8 +506,7 @@
 
 void DriveFsPinManager::MaybeStartSearch(size_t remaining_items) {
   if (!search_query_.is_bound()) {
-    Complete(SetupError::kErrorSearchQueryNotBound);
-    return;
+    return Complete(SetupError::kSearchQueryNotBound);
   }
 
   if (remaining_items == 0) {
diff --git a/chromeos/ash/components/drivefs/drivefs_pin_manager.h b/chromeos/ash/components/drivefs/drivefs_pin_manager.h
index d6628be..1984f87b 100644
--- a/chromeos/ash/components/drivefs/drivefs_pin_manager.h
+++ b/chromeos/ash/components/drivefs/drivefs_pin_manager.h
@@ -43,17 +43,14 @@
 // Errors that are returned via the completion callback that indicate either
 // which stage the failure was at or whether the initial setup was a success.
 enum class SetupError {
-  kSuccess = 0,
-  kManagerDisabled = 1,
-  kErrorCalculatingFreeDiskSpace = 2,
-  kErrorRetrievingSearchResults = 3,
-  kErrorResultsReturnedInvalid = 4,
-  kErrorNotEnoughFreeSpace = 5,
-  kErrorRetrievingSearchResultsForPinning = 6,
-  kErrorResultsReturnedInvalidForPinning = 7,
-  kErrorFailedToPinItem = 8,
-  kErrorSearchQueryNotBound = 9,
-  kErrorManagerStopped = 10,
+  kSuccess,
+  kManagerDisabled,
+  kManagerStopped,
+  kCannotCalculateFreeSpace,
+  kCannotRetrieveSearchResults,
+  kCannotPinItem,
+  kNotEnoughSpace,
+  kSearchQueryNotBound,
 };
 
 COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DRIVEFS)
@@ -65,11 +62,11 @@
 // through.
 enum class SetupStage {
   kError = -1,
-  kNotStarted = 0,
-  kStarted = 1,
-  kCalculatedFreeLocalDiskSpace = 2,
-  kCalculatedRequiredDiskSpace = 3,
-  kFinishedSetup = 4,
+  kNotStarted,
+  kStarted,
+  kCalculatedFreeSpace,
+  kCalculatedRequiredSpace,
+  kFinished,
 };
 
 COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DRIVEFS)
@@ -114,7 +111,7 @@
 struct ManagerState {
   SetupProgress progress;
 
-  bool SetupInProgress();
+  bool SetupInProgress() const;
 };
 
 // Observe the setup progress via subscribing as an observer on the
@@ -139,13 +136,11 @@
 class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DRIVEFS) DriveFsPinManager
     : public DriveFsHostObserver {
  public:
-  DriveFsPinManager(bool enabled,
-                    const base::FilePath& profile_path,
-                    mojom::DriveFs* drivefs_interface);
-  DriveFsPinManager(bool enabled,
-                    const base::FilePath& profile_path,
-                    mojom::DriveFs* drivefs_interface,
-                    std::unique_ptr<FreeDiskSpaceDelegate> free_disk_space);
+  DriveFsPinManager(
+      bool enabled,
+      const base::FilePath& profile_path,
+      mojom::DriveFs* drivefs_interface,
+      std::unique_ptr<FreeDiskSpaceDelegate> free_disk_space = nullptr);
 
   DriveFsPinManager(const DriveFsPinManager&) = delete;
   DriveFsPinManager& operator=(const DriveFsPinManager&) = delete;
@@ -287,18 +282,18 @@
   // Report progress to all the observers.
   void NotifyProgress();
 
-  // Denotes whether the feature is enabled. if the feature is disabled no setup
+  // Denotes whether the feature is enabled. If the feature is disabled no setup
   // nor monitoring occurs.
   bool enabled_ = false;
 
   base::OnceCallback<void(SetupError)> complete_callback_;
-  std::unique_ptr<FreeDiskSpaceDelegate> free_disk_space_;
+  const std::unique_ptr<FreeDiskSpaceDelegate> free_disk_space_;
 
   ManagerState state_;
   base::ObserverList<DriveFsBulkPinObserver>::Unchecked observers_;
 
-  base::FilePath profile_path_;
-  raw_ptr<mojom::DriveFs> drivefs_interface_;
+  const base::FilePath profile_path_;
+  const raw_ptr<mojom::DriveFs> drivefs_interface_;
   mojo::Remote<mojom::SearchQuery> search_query_;
   base::ElapsedTimer timer_;
 
diff --git a/chromeos/ash/components/drivefs/drivefs_pin_manager_unittest.cc b/chromeos/ash/components/drivefs/drivefs_pin_manager_unittest.cc
index 24f74afa6..2d840b9 100644
--- a/chromeos/ash/components/drivefs/drivefs_pin_manager_unittest.cc
+++ b/chromeos/ash/components/drivefs/drivefs_pin_manager_unittest.cc
@@ -217,7 +217,7 @@
 
   EXPECT_CALL(mock_drivefs_, OnStartSearchQuery(_)).Times(0);
   EXPECT_CALL(mock_drivefs_, OnGetNextPage(_)).Times(0);
-  EXPECT_CALL(mock_callback, Run(SetupError::kErrorCalculatingFreeDiskSpace))
+  EXPECT_CALL(mock_callback, Run(SetupError::kCannotCalculateFreeSpace))
       .WillOnce(RunClosure(run_loop.QuitClosure()));
   EXPECT_CALL(*mock_free_disk_space, AmountOfFreeDiskSpace(gcache_dir_, _))
       .WillOnce(RunOnceCallback<1>(-1));
@@ -239,7 +239,7 @@
   EXPECT_CALL(mock_drivefs_, OnGetNextPage(_))
       .WillOnce(DoAll(PopulateNoSearchItems(),
                       Return(drive::FileError::FILE_ERROR_FAILED)));
-  EXPECT_CALL(mock_callback, Run(SetupError::kErrorRetrievingSearchResults))
+  EXPECT_CALL(mock_callback, Run(SetupError::kCannotRetrieveSearchResults))
       .WillOnce(RunClosure(run_loop.QuitClosure()));
   EXPECT_CALL(*mock_free_disk_space, AmountOfFreeDiskSpace(gcache_dir_, _))
       .WillOnce(RunOnceCallback<1>(1024));  // 1 MB.
@@ -260,7 +260,7 @@
   EXPECT_CALL(mock_drivefs_, OnStartSearchQuery(_)).Times(1);
   EXPECT_CALL(mock_drivefs_, OnGetNextPage(_))
       .WillOnce(Return(drive::FileError::FILE_ERROR_OK));
-  EXPECT_CALL(mock_callback, Run(SetupError::kErrorResultsReturnedInvalid))
+  EXPECT_CALL(mock_callback, Run(SetupError::kCannotRetrieveSearchResults))
       .WillOnce(RunClosure(run_loop.QuitClosure()));
   EXPECT_CALL(*mock_free_disk_space, AmountOfFreeDiskSpace(gcache_dir_, _))
       .WillOnce(RunOnceCallback<1>(1024));  // 1 MB.
@@ -286,7 +286,7 @@
   EXPECT_CALL(mock_drivefs_, OnGetNextPage(_))
       .WillOnce(DoAll(PopulateSearchItems(expected_drive_items),
                       Return(drive::FileError::FILE_ERROR_OK)));
-  EXPECT_CALL(mock_callback, Run(SetupError::kErrorNotEnoughFreeSpace))
+  EXPECT_CALL(mock_callback, Run(SetupError::kNotEnoughSpace))
       .WillOnce(RunClosure(run_loop.QuitClosure()));
   EXPECT_CALL(*mock_free_disk_space, AmountOfFreeDiskSpace(gcache_dir_, _))
       .WillOnce(RunOnceCallback<1>(1024));  // 1 MB.
@@ -319,7 +319,7 @@
       // operations being mock failed.
       .WillOnce(DoAll(PopulateSearchItems(expected_drive_items),
                       Return(drive::FileError::FILE_ERROR_OK)));
-  EXPECT_CALL(mock_callback, Run(SetupError::kErrorFailedToPinItem))
+  EXPECT_CALL(mock_callback, Run(SetupError::kCannotPinItem))
       .WillOnce(RunClosure(run_loop.QuitClosure()));
   EXPECT_CALL(*mock_free_disk_space, AmountOfFreeDiskSpace(gcache_dir_, _))
       .WillOnce(RunOnceCallback<1>(1024));  // 1 MB.
@@ -569,9 +569,9 @@
   status->item_events.at(0)->bytes_transferred = 10;
   EXPECT_CALL(
       mock_pin_observer,
-      OnSetupProgress(AllOf(Field(&SetupProgress::pinned_disk_space, 10),
-                            Field(&SetupProgress::stage,
-                                  SetupStage::kCalculatedRequiredDiskSpace))))
+      OnSetupProgress(AllOf(
+          Field(&SetupProgress::pinned_disk_space, 10),
+          Field(&SetupProgress::stage, SetupStage::kCalculatedRequiredSpace))))
       .Times(1)
       .WillOnce(RunClosure(setup_progress_run_loop.QuitClosure()));
   manager->OnSyncingStatusUpdate(*status);
@@ -594,9 +594,9 @@
                              mojom::ItemEvent::State::kCompleted);
   status->item_events.at(0)->bytes_transferred = 128;
   EXPECT_CALL(mock_pin_observer,
-              OnSetupProgress(AllOf(
-                  Field(&SetupProgress::pinned_disk_space, 128),
-                  Field(&SetupProgress::stage, SetupStage::kFinishedSetup))))
+              OnSetupProgress(
+                  AllOf(Field(&SetupProgress::pinned_disk_space, 128),
+                        Field(&SetupProgress::stage, SetupStage::kFinished))))
       .Times(1)
       .WillOnce(RunClosure(setup_progress_run_loop.QuitClosure()));
   manager->OnSyncingStatusUpdate(*status);
diff --git a/components/device_event_log/device_event_log.h b/components/device_event_log/device_event_log.h
index a4a5723..00d62f9 100644
--- a/components/device_event_log/device_event_log.h
+++ b/components/device_event_log/device_event_log.h
@@ -76,6 +76,9 @@
 #define GEOLOCATION_LOG(level)                         \
   DEVICE_LOG(::device_event_log::LOG_TYPE_GEOLOCATION, \
              ::device_event_log::LOG_LEVEL_##level)
+#define EXTENSIONS_LOG(level)                         \
+  DEVICE_LOG(::device_event_log::LOG_TYPE_EXTENSIONS, \
+             ::device_event_log::LOG_LEVEL_##level)
 
 #if BUILDFLAG(IS_ANDROID) && defined(OFFICIAL_BUILD)
 // FIDO_LOG is discarded for release Android builds in order to reduce binary
@@ -138,8 +141,10 @@
   LOG_TYPE_CAMERA = 10,
   // Geolocation related events (i.e. services/device/geolocation).
   LOG_TYPE_GEOLOCATION = 11,
+  // Logs from extensions
+  LOG_TYPE_EXTENSIONS = 12,
   // Used internally, must be the last type (may be changed).
-  LOG_TYPE_UNKNOWN = 12
+  LOG_TYPE_UNKNOWN = 13
 };
 
 // Used to specify the detail level for logging. In GetAsString, used to
diff --git a/components/device_event_log/device_event_log_impl.cc b/components/device_event_log/device_event_log_impl.cc
index c1a5bddc..aaeba0d 100644
--- a/components/device_event_log/device_event_log_impl.cc
+++ b/components/device_event_log/device_event_log_impl.cc
@@ -41,6 +41,7 @@
 const char kLogTypeSerialDesc[] = "Serial";
 const char kLogTypeCameraDesc[] = "Camera";
 const char kLogTypeGeolocationDesc[] = "Geolocation";
+const char kLogTypeExtensionsDesc[] = "Extensions";
 
 enum class ShowTime {
   kNone,
@@ -74,6 +75,8 @@
       return kLogTypeCameraDesc;
     case LOG_TYPE_GEOLOCATION:
       return kLogTypeGeolocationDesc;
+    case LOG_TYPE_EXTENSIONS:
+      return kLogTypeExtensionsDesc;
     case LOG_TYPE_UNKNOWN:
       break;
   }
diff --git a/components/policy/test_support/fake_dmserver.cc b/components/policy/test_support/fake_dmserver.cc
index de24b8af..89a1fd8a 100644
--- a/components/policy/test_support/fake_dmserver.cc
+++ b/components/policy/test_support/fake_dmserver.cc
@@ -147,21 +147,19 @@
   return true;
 }
 
-bool FakeDMServer::WriteURLToPipe(const base::ScopedFD& startup_pipe) {
+bool FakeDMServer::WriteURLToPipe(base::ScopedFD&& startup_pipe) {
   GURL server_url = EmbeddedPolicyTestServer::GetServiceURL();
   std::string server_data =
       base::StringPrintf("{\"host\": \"%s\", \"port\": %s}",
                          server_url.host().c_str(), server_url.port().c_str());
 
-  base::PlatformFile fd(startup_pipe.get());
-  base::File pipe_writer(fd);
+  base::File pipe_writer(startup_pipe.release());
   if (!pipe_writer.WriteAtCurrentPosAndCheck(
           base::as_bytes(base::make_span(server_data)))) {
     LOG(ERROR) << "Failed to write the server url data to the pipe, data: "
                << server_data;
     return false;
   }
-  pipe_writer.Close();
   return true;
 }
 
diff --git a/components/policy/test_support/fake_dmserver.h b/components/policy/test_support/fake_dmserver.h
index f3c2f9b..230903e 100644
--- a/components/policy/test_support/fake_dmserver.h
+++ b/components/policy/test_support/fake_dmserver.h
@@ -111,7 +111,7 @@
   // Writes the host and port of the EmbeddedPolicyTestServer to the given pipe
   // in a json format {"host": "localhost", "port": 1234}, it will return true
   // if it's able to write the URL to the pipe, and false otherwise.
-  bool WriteURLToPipe(const base::ScopedFD& startup_pipe);
+  bool WriteURLToPipe(base::ScopedFD&& startup_pipe);
 
   // Overrides the EmbeddedPolicyTestServer request handler.
   std::unique_ptr<net::test_server::HttpResponse> HandleRequest(
diff --git a/components/policy/test_support/fake_dmserver_main.cc b/components/policy/test_support/fake_dmserver_main.cc
index 21f2e7f..a8d2f042 100644
--- a/components/policy/test_support/fake_dmserver_main.cc
+++ b/components/policy/test_support/fake_dmserver_main.cc
@@ -25,11 +25,13 @@
   base::RunLoop run_loop;
   fakedms::FakeDMServer policy_test_server(policy_blob_path, client_state_path,
                                            run_loop.QuitClosure());
-  if (!policy_test_server.Start())
+  if (!policy_test_server.Start()) {
     return 1;
+  }
   if (startup_pipe.is_valid()) {
-    if (!policy_test_server.WriteURLToPipe(startup_pipe))
+    if (!policy_test_server.WriteURLToPipe(std::move(startup_pipe))) {
       return 1;
+    }
   }
   run_loop.Run();
   return 0;
diff --git a/components/safety_check/DIR_METADATA b/components/safety_check/DIR_METADATA
index a925329a..8c78036 100644
--- a/components/safety_check/DIR_METADATA
+++ b/components/safety_check/DIR_METADATA
@@ -1 +1,4 @@
 team_email: "chrome-privacy-core@google.com"
+monorail {
+  component: "UI>Settings>SafetyCheck"
+}
diff --git a/components/services/app_service/public/cpp/icon_types.h b/components/services/app_service/public/cpp/icon_types.h
index 084a2e37..9bbc503 100644
--- a/components/services/app_service/public/cpp/icon_types.h
+++ b/components/services/app_service/public/cpp/icon_types.h
@@ -101,6 +101,18 @@
   // is from a maskable icon.
   bool is_maskable_icon = false;
 
+  // PNG-encoded bytes for the foreground icon data. Only available for the
+  // adaptive icon, e.g. some ARC app icons, when `icon_type` is kUncompressed.
+  // This field should be set by GetCompressedIconData only for
+  // publishers to get the raw icon data.
+  std::vector<uint8_t> foreground_icon_png_data;
+
+  // PNG-encoded bytes for the background icon data. Only available for the
+  // adaptive icon, e.g. some ARC app icons, when `icon_type` is kUncompressed.
+  // This field should be set by GetCompressedIconData only for
+  // publishers to get the raw icon data.
+  std::vector<uint8_t> background_icon_png_data;
+
   // Specifies whether the icon provided is a placeholder. That field should
   // only be true if the corresponding `LoadIcon` call had
   // `allow_placeholder_icon` set to true, which states whether the caller will
diff --git a/components/services/storage/public/mojom/service_worker_database.mojom b/components/services/storage/public/mojom/service_worker_database.mojom
index 69902b7..0fe5fe5d 100644
--- a/components/services/storage/public/mojom/service_worker_database.mojom
+++ b/components/services/storage/public/mojom/service_worker_database.mojom
@@ -68,8 +68,6 @@
   // Not populated until the registration is stored into database.
   int64 resources_total_size_bytes = 0;
 
-  // TODO(crbug.com/1177199): merge COEP to policy container
-  network.mojom.CrossOriginEmbedderPolicy cross_origin_embedder_policy;
   blink.mojom.PolicyContainerPolicies? policy_container_policies;
 
   // The type of the frame that registered this service worker, which is used
diff --git a/components/services/storage/service_worker/service_worker_database.cc b/components/services/storage/service_worker/service_worker_database.cc
index 42603dde..2d52344 100644
--- a/components/services/storage/service_worker/service_worker_database.cc
+++ b/components/services/storage/service_worker/service_worker_database.cc
@@ -1803,48 +1803,52 @@
     }
     switch (data.cross_origin_embedder_policy_value()) {
       case ServiceWorkerRegistrationData::REQUIRE_CORP:
-        (*out)->cross_origin_embedder_policy.value =
-            network::mojom::CrossOriginEmbedderPolicyValue::kRequireCorp;
-        (*out)->policy_container_policies->cross_origin_embedder_policy =
+        (*out)->policy_container_policies->cross_origin_embedder_policy.value =
             network::mojom::CrossOriginEmbedderPolicyValue::kRequireCorp;
         break;
       case ServiceWorkerRegistrationData::CREDENTIALLESS:
-        (*out)->cross_origin_embedder_policy.value =
-            network::mojom::CrossOriginEmbedderPolicyValue::kCredentialless;
-        (*out)->policy_container_policies->cross_origin_embedder_policy =
+        (*out)->policy_container_policies->cross_origin_embedder_policy.value =
             network::mojom::CrossOriginEmbedderPolicyValue::kCredentialless;
         break;
       case ServiceWorkerRegistrationData::NONE_OR_NOT_EXIST:
-        (*out)->cross_origin_embedder_policy.value =
-            network::mojom::CrossOriginEmbedderPolicyValue::kNone;
-        (*out)->policy_container_policies->cross_origin_embedder_policy =
+        (*out)->policy_container_policies->cross_origin_embedder_policy.value =
             network::mojom::CrossOriginEmbedderPolicyValue::kNone;
     }
   }
 
   if (data.has_cross_origin_embedder_policy_reporting_endpoint()) {
-    (*out)->cross_origin_embedder_policy.reporting_endpoint =
+    (*out)
+        ->policy_container_policies->cross_origin_embedder_policy
+        .reporting_endpoint =
         data.cross_origin_embedder_policy_reporting_endpoint();
   }
 
   if (data.has_cross_origin_embedder_policy_report_only_value()) {
     switch (data.cross_origin_embedder_policy_report_only_value()) {
       case ServiceWorkerRegistrationData::REQUIRE_CORP:
-        (*out)->cross_origin_embedder_policy.report_only_value =
+        (*out)
+            ->policy_container_policies->cross_origin_embedder_policy
+            .report_only_value =
             network::mojom::CrossOriginEmbedderPolicyValue::kRequireCorp;
         break;
       case ServiceWorkerRegistrationData::CREDENTIALLESS:
-        (*out)->cross_origin_embedder_policy.report_only_value =
+        (*out)
+            ->policy_container_policies->cross_origin_embedder_policy
+            .report_only_value =
             network::mojom::CrossOriginEmbedderPolicyValue::kCredentialless;
         break;
-      default:
-        (*out)->cross_origin_embedder_policy.report_only_value =
+      case ServiceWorkerRegistrationData::NONE_OR_NOT_EXIST:
+        (*out)
+            ->policy_container_policies->cross_origin_embedder_policy
+            .report_only_value =
             network::mojom::CrossOriginEmbedderPolicyValue::kNone;
     }
   }
 
   if (data.has_cross_origin_embedder_policy_report_only_reporting_endpoint()) {
-    (*out)->cross_origin_embedder_policy.report_only_reporting_endpoint =
+    (*out)
+        ->policy_container_policies->cross_origin_embedder_policy
+        .report_only_reporting_endpoint =
         data.cross_origin_embedder_policy_report_only_reporting_endpoint();
   }
 
@@ -1906,7 +1910,7 @@
 }
 
 ServiceWorkerRegistrationData::CrossOriginEmbedderPolicyValue
-ConvertCrossOriginEmbedderPolicyFromMojomToProtocolBuffer(
+ConvertCrossOriginEmbedderPolicyValueFromMojomToProtocolBuffer(
     network::mojom::CrossOriginEmbedderPolicyValue value) {
   switch (value) {
     case network::mojom::CrossOriginEmbedderPolicyValue::kNone:
@@ -2033,24 +2037,6 @@
           ServiceWorkerRegistrationData_ServiceWorkerUpdateViaCacheType>(
           registration.update_via_cache));
 
-  data.set_cross_origin_embedder_policy_value(
-      ConvertCrossOriginEmbedderPolicyFromMojomToProtocolBuffer(
-          registration.cross_origin_embedder_policy.value));
-
-  if (registration.cross_origin_embedder_policy.reporting_endpoint) {
-    data.set_cross_origin_embedder_policy_reporting_endpoint(
-        registration.cross_origin_embedder_policy.reporting_endpoint.value());
-  }
-  data.set_cross_origin_embedder_policy_report_only_value(
-      ConvertCrossOriginEmbedderPolicyFromMojomToProtocolBuffer(
-          registration.cross_origin_embedder_policy.report_only_value));
-  if (registration.cross_origin_embedder_policy
-          .report_only_reporting_endpoint) {
-    data.set_cross_origin_embedder_policy_report_only_reporting_endpoint(
-        registration.cross_origin_embedder_policy.report_only_reporting_endpoint
-            .value());
-  }
-
   switch (registration.ancestor_frame_type) {
     case blink::mojom::AncestorFrameType::kNormalFrame:
       data.set_ancestor_frame_type(ServiceWorkerRegistrationData::NORMAL_FRAME);
@@ -2061,6 +2047,28 @@
   }
 
   if (registration.policy_container_policies) {
+    data.set_cross_origin_embedder_policy_value(
+        ConvertCrossOriginEmbedderPolicyValueFromMojomToProtocolBuffer(
+            registration.policy_container_policies->cross_origin_embedder_policy
+                .value));
+
+    if (registration.policy_container_policies->cross_origin_embedder_policy
+            .reporting_endpoint) {
+      data.set_cross_origin_embedder_policy_reporting_endpoint(
+          registration.policy_container_policies->cross_origin_embedder_policy
+              .reporting_endpoint.value());
+    }
+    data.set_cross_origin_embedder_policy_report_only_value(
+        ConvertCrossOriginEmbedderPolicyValueFromMojomToProtocolBuffer(
+            registration.policy_container_policies->cross_origin_embedder_policy
+                .report_only_value));
+    if (registration.policy_container_policies->cross_origin_embedder_policy
+            .report_only_reporting_endpoint) {
+      data.set_cross_origin_embedder_policy_report_only_reporting_endpoint(
+          registration.policy_container_policies->cross_origin_embedder_policy
+              .report_only_reporting_endpoint.value());
+    }
+
     ServiceWorkerRegistrationData::PolicyContainerPolicies* policies =
         data.mutable_policy_container_policies();
     policies->set_referrer_policy(
diff --git a/components/services/storage/service_worker/service_worker_database_unittest.cc b/components/services/storage/service_worker/service_worker_database_unittest.cc
index b773a3b..f5a8de4c 100644
--- a/components/services/storage/service_worker/service_worker_database_unittest.cc
+++ b/components/services/storage/service_worker/service_worker_database_unittest.cc
@@ -89,18 +89,9 @@
   EXPECT_EQ(expected.resources_total_size_bytes,
             actual.resources_total_size_bytes);
   EXPECT_EQ(expected.script_response_time, actual.script_response_time);
-  EXPECT_EQ(expected.cross_origin_embedder_policy,
-            actual.cross_origin_embedder_policy);
   EXPECT_EQ(expected.ancestor_frame_type, actual.ancestor_frame_type);
-  if (expected.policy_container_policies) {
-    EXPECT_EQ(expected.policy_container_policies,
-              actual.policy_container_policies);
-  } else {
-    // Null policy container policies will be read as default policies because
-    // there's always going to be a default Cross Origin Embedder Policy
-    EXPECT_EQ(blink::mojom::PolicyContainerPolicies::New(),
-              actual.policy_container_policies);
-  }
+  EXPECT_EQ(expected.policy_container_policies,
+            actual.policy_container_policies);
 }
 
 void VerifyResourceRecords(const std::vector<ResourceRecordPtr>& expected,
@@ -590,12 +581,9 @@
   data1.version_id = 1000;
   data1.resources_total_size_bytes = 100;
   data1.script_response_time = base::Time::FromJsTime(0);
-  data1.cross_origin_embedder_policy = CrossOriginEmbedderPolicyNone();
   data1.ancestor_frame_type = blink::mojom::AncestorFrameType::kNormalFrame;
   data1.policy_container_policies =
       blink::mojom::PolicyContainerPolicies::New();
-  data1.policy_container_policies->cross_origin_embedder_policy =
-      data1.cross_origin_embedder_policy.value;
   std::vector<ResourceRecordPtr> resources1;
   resources1.push_back(CreateResource(1, data1.script, 100));
   ASSERT_EQ(ServiceWorkerDatabase::Status::kOk,
@@ -619,12 +607,11 @@
   data2.version_id = 2000;
   data2.resources_total_size_bytes = 200;
   data2.script_response_time = base::Time::FromJsTime(42);
-  data2.cross_origin_embedder_policy = CrossOriginEmbedderPolicyRequireCorp();
   data2.ancestor_frame_type = blink::mojom::AncestorFrameType::kFencedFrame;
   data2.policy_container_policies =
       blink::mojom::PolicyContainerPolicies::New();
   data2.policy_container_policies->cross_origin_embedder_policy =
-      data2.cross_origin_embedder_policy.value;
+      CrossOriginEmbedderPolicyRequireCorp();
   std::vector<ResourceRecordPtr> resources2;
   resources2.push_back(CreateResource(2, data2.script, 200));
   ASSERT_EQ(ServiceWorkerDatabase::Status::kOk,
@@ -648,11 +635,10 @@
   data3.version_id = 3000;
   data3.resources_total_size_bytes = 300;
   data3.script_response_time = base::Time::FromJsTime(420);
-  data3.cross_origin_embedder_policy = CrossOriginEmbedderPolicyNone();
   data3.policy_container_policies =
       blink::mojom::PolicyContainerPolicies::New();
   data3.policy_container_policies->cross_origin_embedder_policy =
-      data3.cross_origin_embedder_policy.value;
+      CrossOriginEmbedderPolicyNone();
   std::vector<ResourceRecordPtr> resources3;
   resources3.push_back(CreateResource(3, data3.script, 300));
   ASSERT_EQ(ServiceWorkerDatabase::Status::kOk,
@@ -667,12 +653,10 @@
   data4.version_id = 4000;
   data4.resources_total_size_bytes = 400;
   data4.script_response_time = base::Time::FromJsTime(4200);
-  data4.cross_origin_embedder_policy =
-      CrossOriginEmbedderPolicyCredentialless();
   data4.policy_container_policies =
       blink::mojom::PolicyContainerPolicies::New();
   data4.policy_container_policies->cross_origin_embedder_policy =
-      data4.cross_origin_embedder_policy.value;
+      CrossOriginEmbedderPolicyCredentialless();
   std::vector<ResourceRecordPtr> resources4;
   resources4.push_back(CreateResource(4, data4.script, 400));
   ASSERT_EQ(ServiceWorkerDatabase::Status::kOk,
@@ -718,12 +702,11 @@
   data1.script = URL(origin1, "/script1.js");
   data1.version_id = 1000;
   data1.resources_total_size_bytes = 100;
-  data1.cross_origin_embedder_policy = CrossOriginEmbedderPolicyNone();
   data1.ancestor_frame_type = blink::mojom::AncestorFrameType::kNormalFrame;
   data1.policy_container_policies =
       blink::mojom::PolicyContainerPolicies::New();
   data1.policy_container_policies->cross_origin_embedder_policy =
-      data1.cross_origin_embedder_policy.value;
+      CrossOriginEmbedderPolicyNone();
   std::vector<ResourceRecordPtr> resources1;
   resources1.push_back(CreateResource(1, data1.script, 100));
   ASSERT_EQ(ServiceWorkerDatabase::Status::kOk,
@@ -738,12 +721,11 @@
   data2.version_id = 2000;
   data2.resources_total_size_bytes = 200;
   data2.update_via_cache = blink::mojom::ServiceWorkerUpdateViaCache::kNone;
-  data2.cross_origin_embedder_policy = CrossOriginEmbedderPolicyRequireCorp();
   data2.ancestor_frame_type = blink::mojom::AncestorFrameType::kFencedFrame;
   data2.policy_container_policies =
       blink::mojom::PolicyContainerPolicies::New();
   data2.policy_container_policies->cross_origin_embedder_policy =
-      data2.cross_origin_embedder_policy.value;
+      CrossOriginEmbedderPolicyRequireCorp();
   std::vector<ResourceRecordPtr> resources2;
   resources2.push_back(CreateResource(2, data2.script, 200));
   ASSERT_EQ(ServiceWorkerDatabase::Status::kOk,
@@ -757,12 +739,10 @@
   data3.script = URL(origin3, "/script3.js");
   data3.version_id = 3000;
   data3.resources_total_size_bytes = 300;
-  data3.cross_origin_embedder_policy =
-      CrossOriginEmbedderPolicyCredentialless();
   data3.policy_container_policies =
       blink::mojom::PolicyContainerPolicies::New();
   data3.policy_container_policies->cross_origin_embedder_policy =
-      data3.cross_origin_embedder_policy.value;
+      CrossOriginEmbedderPolicyCredentialless();
   std::vector<ResourceRecordPtr> resources3;
   resources3.push_back(CreateResource(3, data3.script, 300));
   ASSERT_EQ(ServiceWorkerDatabase::Status::kOk,
@@ -798,13 +778,11 @@
   data5.script = URL(origin5, "/script5.js");
   data5.version_id = 5000;
   data5.resources_total_size_bytes = 500;
-  data5.cross_origin_embedder_policy =
-      CrossOriginEmbedderPolicyCredentialless();
   std::vector<ResourceRecordPtr> resources5;
   data5.policy_container_policies =
       blink::mojom::PolicyContainerPolicies::New();
   data5.policy_container_policies->cross_origin_embedder_policy =
-      data5.cross_origin_embedder_policy.value;
+      CrossOriginEmbedderPolicyCredentialless();
   resources5.push_back(CreateResource(5, data5.script, 500));
   ASSERT_EQ(ServiceWorkerDatabase::Status::kOk,
             database->WriteRegistration(data5, resources5, &deleted_version));
@@ -819,12 +797,10 @@
   data6.script = URL(origin6, "/script6.js");
   data6.version_id = 6000;
   data6.resources_total_size_bytes = 600;
-  data6.cross_origin_embedder_policy =
-      CrossOriginEmbedderPolicyCredentialless();
   data6.policy_container_policies =
       blink::mojom::PolicyContainerPolicies::New();
   data6.policy_container_policies->cross_origin_embedder_policy =
-      data6.cross_origin_embedder_policy.value;
+      CrossOriginEmbedderPolicyCredentialless();
   std::vector<ResourceRecordPtr> resources6;
   resources6.push_back(CreateResource(6, data6.script, 600));
   ASSERT_EQ(ServiceWorkerDatabase::Status::kOk,
@@ -844,12 +820,10 @@
   data7.script = URL(origin7, "/script7.js");
   data7.version_id = 7000;
   data7.resources_total_size_bytes = 700;
-  data7.cross_origin_embedder_policy =
-      CrossOriginEmbedderPolicyCredentialless();
   data7.policy_container_policies =
       blink::mojom::PolicyContainerPolicies::New();
   data7.policy_container_policies->cross_origin_embedder_policy =
-      data7.cross_origin_embedder_policy.value;
+      CrossOriginEmbedderPolicyCredentialless();
   std::vector<ResourceRecordPtr> resources7;
   resources7.push_back(CreateResource(7, data7.script, 700));
   ASSERT_EQ(ServiceWorkerDatabase::Status::kOk,
@@ -2635,10 +2609,9 @@
     data.script = URL(origin, "/script.js");
     data.version_id = 456;
     data.resources_total_size_bytes = 100;
-    data.cross_origin_embedder_policy = policy;
     data.policy_container_policies =
         blink::mojom::PolicyContainerPolicies::New();
-    data.policy_container_policies->cross_origin_embedder_policy = policy.value;
+    data.policy_container_policies->cross_origin_embedder_policy = policy;
     std::vector<ResourceRecordPtr> resources;
     resources.push_back(CreateResource(1, data.script, 100));
 
@@ -2724,12 +2697,12 @@
   std::string value;
   ASSERT_TRUE(data.SerializeToString(&value));
 
-  // Parse the serialized data. The policy is kNone if it's not set.
+  // Parse the serialized data. The policy container policies will be null if
+  // neither COEP nor policy container is set.
   RegistrationDataPtr registration;
   ASSERT_EQ(ServiceWorkerDatabase::Status::kOk,
             database->ParseRegistrationData(value, key, &registration));
-  EXPECT_EQ(network::mojom::CrossOriginEmbedderPolicyValue::kNone,
-            registration->cross_origin_embedder_policy.value);
+  EXPECT_FALSE(registration->policy_container_policies);
 }
 
 const network::mojom::WebSandboxFlags kWebSandboxFlags[] = {
@@ -2775,8 +2748,6 @@
         data.version_id = 456;
         data.resources_total_size_bytes = 100;
         data.policy_container_policies = std::move(policies);
-        data.cross_origin_embedder_policy.value =
-            data.policy_container_policies->cross_origin_embedder_policy;
         std::vector<ResourceRecordPtr> resources;
         resources.push_back(CreateResource(1, data.script, 100));
 
@@ -2809,7 +2780,7 @@
              network::mojom::CrossOriginEmbedderPolicyValue::kRequireCorp,
              network::mojom::CrossOriginEmbedderPolicyValue::kCredentialless,
          }) {
-      policies->cross_origin_embedder_policy = value;
+      policies->cross_origin_embedder_policy.value = value;
       store_and_restore(policies->Clone());
     }
   }
@@ -3026,7 +2997,8 @@
         data.version_id = 456;
         data.fetch_handler_type = type;
         data.resources_total_size_bytes = 100;
-        data.cross_origin_embedder_policy = CrossOriginEmbedderPolicyNone();
+        data.policy_container_policies =
+            blink::mojom::PolicyContainerPolicies::New();
         std::vector<ResourceRecordPtr> resources;
         resources.push_back(CreateResource(1, data.script, 100));
 
diff --git a/components/sync/driver/sync_service_impl.cc b/components/sync/driver/sync_service_impl.cc
index 3f833c0..520a3594 100644
--- a/components/sync/driver/sync_service_impl.cc
+++ b/components/sync/driver/sync_service_impl.cc
@@ -57,7 +57,7 @@
              "ListenForInvalidationsInLocalSync",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// The initial state of sync, for the Sync.InitialState histogram. Even if
+// The initial state of sync, for the Sync.InitialState2 histogram. Even if
 // this value is CAN_START, sync startup might fail for reasons that we may
 // want to consider logging in the future, such as a passphrase needed for
 // decryption, or the version of Chrome being too old. This enum is used to
@@ -92,7 +92,6 @@
   } else if (!first_setup_complete) {
     sync_state = NEEDS_CONFIRMATION;
   }
-  base::UmaHistogramEnumeration("Sync.InitialState", sync_state);
   if (is_regular_profile_for_uma) {
     base::UmaHistogramEnumeration("Sync.InitialState2", sync_state);
   }
diff --git a/content/browser/renderer_host/agent_scheduling_group_host.cc b/content/browser/renderer_host/agent_scheduling_group_host.cc
index 664da04..a6d974dc 100644
--- a/content/browser/renderer_host/agent_scheduling_group_host.cc
+++ b/content/browser/renderer_host/agent_scheduling_group_host.cc
@@ -141,8 +141,7 @@
 }
 
 AgentSchedulingGroupHost::AgentSchedulingGroupHost(RenderProcessHost& process)
-    : process_(process),
-      receiver_(this) {
+    : process_(process.GetSafeRef()), receiver_(this) {
   process_->AddObserver(this);
 
   // The RenderProcessHost's channel and other mojo interfaces are bound by the
diff --git a/content/browser/renderer_host/agent_scheduling_group_host.h b/content/browser/renderer_host/agent_scheduling_group_host.h
index d5af2e93..cf9ac1e 100644
--- a/content/browser/renderer_host/agent_scheduling_group_host.h
+++ b/content/browser/renderer_host/agent_scheduling_group_host.h
@@ -156,7 +156,10 @@
   static int32_t GetNextID();
 
   // The RenderProcessHost this AgentSchedulingGroup is assigned to.
-  const raw_ref<RenderProcessHost> process_;
+  //
+  // TODO(https://crbug.com/1382971): Change back to `raw_ref` after the ad-hoc
+  // debugging is no longer needed to investigate the bug.
+  const base::SafeRef<RenderProcessHost> process_;
 
   int32_t id_for_debugging_{GetNextID()};
 
diff --git a/content/browser/renderer_host/policy_container_host.cc b/content/browser/renderer_host/policy_container_host.cc
index 6cfd88e..cc53505 100644
--- a/content/browser/renderer_host/policy_container_host.cc
+++ b/content/browser/renderer_host/policy_container_host.cc
@@ -142,12 +142,11 @@
       ip_address_space(policies.ip_address_space),
       content_security_policies(
           mojo::Clone(policies.content_security_policies)),
+      cross_origin_embedder_policy(policies.cross_origin_embedder_policy),
       sandbox_flags(policies.sandbox_flags),
       is_credentialless(policies.is_credentialless),
       can_navigate_top_without_user_gesture(
-          policies.can_navigate_top_without_user_gesture) {
-  cross_origin_embedder_policy.value = policies.cross_origin_embedder_policy;
-}
+          policies.can_navigate_top_without_user_gesture) {}
 
 PolicyContainerPolicies::PolicyContainerPolicies(
     const GURL& url,
@@ -200,7 +199,7 @@
 blink::mojom::PolicyContainerPoliciesPtr
 PolicyContainerPolicies::ToMojoPolicyContainerPolicies() const {
   return blink::mojom::PolicyContainerPolicies::New(
-      cross_origin_embedder_policy.value, referrer_policy,
+      cross_origin_embedder_policy, referrer_policy,
       mojo::Clone(content_security_policies), is_credentialless, sandbox_flags,
       ip_address_space, can_navigate_top_without_user_gesture);
 }
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index 8ba82589..01909cce 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -1455,7 +1455,7 @@
       delegate_(delegate),
       site_instance_(static_cast<SiteInstanceImpl*>(site_instance)),
       agent_scheduling_group_(
-          site_instance_->GetOrCreateAgentSchedulingGroup()),
+          site_instance_->GetOrCreateAgentSchedulingGroup().GetSafeRef()),
       frame_tree_(frame_tree),
       frame_tree_node_(frame_tree_node),
       owner_(frame_tree_node),
@@ -5733,6 +5733,11 @@
     return;
   }
 
+  // TODO(https://crbug.com/1382971): Remove the crash key logging after the
+  // ad-hoc bug investigation is no longer needed.
+  SCOPED_CRASH_KEY_STRING256("rfhi-uslf", "frame->ToDebugString",
+                             ToDebugString());
+
   // The `subresource_loader_factories_config` of the new factories might need
   // to depend on the pending (rather than the last committed) navigation,
   // because we can't predict if an in-flight Commit IPC might be present when
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h
index db16f07..2c82299 100644
--- a/content/browser/renderer_host/render_frame_host_impl.h
+++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -3749,7 +3749,10 @@
   // crashed, since using
   // SiteInstance::GetProcess()/GetOrCreateAgentSchedulingGroupHost() has the
   // side effect of creating the process again if it is gone.
-  const raw_ref<AgentSchedulingGroupHost> agent_scheduling_group_;
+  //
+  // TODO(https://crbug.com/1382971): Change back to `raw_ref` after the ad-hoc
+  // debugging is no longer needed to investigate the bug.
+  const base::SafeRef<AgentSchedulingGroupHost> agent_scheduling_group_;
 
   // Reference to the whole frame tree that this RenderFrameHost belongs to.
   // Allows this RenderFrameHost to add and remove nodes in response to
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index a00a9c50..ebe9c1e 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -1516,7 +1516,7 @@
                 ),
       id_(ChildProcessHostImpl::GenerateChildProcessUniqueId()),
       browser_context_(browser_context),
-      storage_partition_impl_(storage_partition_impl),
+      storage_partition_impl_(storage_partition_impl->GetWeakPtr()),
       sudden_termination_allowed_(true),
       is_blocked_(false),
       flags_(flags),
@@ -1912,7 +1912,7 @@
 #if BUILDFLAG(ENABLE_PPAPI)
   pepper_renderer_connection_ = base::MakeRefCounted<PepperRendererConnection>(
       GetID(), PluginServiceImpl::GetInstance(), GetBrowserContext(),
-      storage_partition_impl_);
+      GetStoragePartition());
   AddFilter(pepper_renderer_connection_.get());
 #endif
 
@@ -3184,7 +3184,11 @@
 }
 
 StoragePartitionImpl* RenderProcessHostImpl::GetStoragePartition() {
-  return storage_partition_impl_;
+  // TODO(https://crbug.com/1382971): Remove the `CHECK` after the ad-hoc
+  // debugging is no longer needed to investigate the bug.
+  CHECK(!!storage_partition_impl_);
+
+  return storage_partition_impl_.get();
 }
 
 static void AppendCompositorCommandLineFlags(base::CommandLine* command_line) {
@@ -3769,7 +3773,7 @@
 
 bool RenderProcessHostImpl::InSameStoragePartition(
     StoragePartition* partition) {
-  return storage_partition_impl_ == partition;
+  return GetStoragePartition() == partition;
 }
 
 int RenderProcessHostImpl::GetID() const {
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h
index ab6e8bdb..1d9fced 100644
--- a/content/browser/renderer_host/render_process_host_impl.h
+++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -1099,7 +1099,10 @@
   BrowserContext* browser_context_ = nullptr;
 
   // Owned by |browser_context_|.
-  raw_ptr<StoragePartitionImpl> storage_partition_impl_;
+  //
+  // TODO(https://crbug.com/1382971): Change back to `raw_ptr` after the ad-hoc
+  // debugging is no longer needed to investigate the bug.
+  base::WeakPtr<StoragePartitionImpl> storage_partition_impl_;
 
   // Owns the singular DomStorageProvider binding established by this renderer.
   mojo::Receiver<blink::mojom::DomStorageProvider>
diff --git a/content/browser/service_worker/service_worker_registry.cc b/content/browser/service_worker/service_worker_registry.cc
index 980bde9..908dc6e 100644
--- a/content/browser/service_worker/service_worker_registry.cc
+++ b/content/browser/service_worker/service_worker_registry.cc
@@ -410,19 +410,18 @@
     data->used_features.push_back(feature);
   data->ancestor_frame_type = registration->ancestor_frame_type();
 
+  data->policy_container_policies =
+      version->policy_container_host()
+          ? version->policy_container_host()
+                ->policies()
+                .ToMojoPolicyContainerPolicies()
+          : blink::mojom::PolicyContainerPolicies::New();
   // The ServiceWorkerVersion's COEP might be null if it is stored before
   // loading the main script. This happens in many unittests.
   if (version->cross_origin_embedder_policy()) {
-    data->cross_origin_embedder_policy =
+    data->policy_container_policies->cross_origin_embedder_policy =
         *version->cross_origin_embedder_policy();
   }
-  data->policy_container_policies =
-      blink::mojom::PolicyContainerPolicies::New();
-  if (version->policy_container_host()) {
-    data->policy_container_policies = version->policy_container_host()
-                                          ->policies()
-                                          .ToMojoPolicyContainerPolicies();
-  }
 
   ResourceList resources;
   version->script_cache_map()->GetResources(&resources);
@@ -917,7 +916,7 @@
                                                      data.used_features.end());
     version->set_used_features(std::move(used_features));
     version->set_cross_origin_embedder_policy(
-        data.cross_origin_embedder_policy);
+        data.policy_container_policies->cross_origin_embedder_policy);
     // policy_container_host could be null for registration restored from old DB
     if (data.policy_container_policies) {
       version->set_policy_container_host(
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
index 19733d05..a1a69b2 100644
--- a/content/browser/storage_partition_impl.cc
+++ b/content/browser/storage_partition_impl.cc
@@ -2813,7 +2813,7 @@
   network_context_.Bind(std::move(network_context_remote));
 }
 
-base::WeakPtr<StoragePartition> StoragePartitionImpl::GetWeakPtr() {
+base::WeakPtr<StoragePartitionImpl> StoragePartitionImpl::GetWeakPtr() {
   return weak_factory_.GetWeakPtr();
 }
 
diff --git a/content/browser/storage_partition_impl.h b/content/browser/storage_partition_impl.h
index cac5fcc..2dd21f692 100644
--- a/content/browser/storage_partition_impl.h
+++ b/content/browser/storage_partition_impl.h
@@ -243,7 +243,7 @@
   void ResetAttributionManagerForTesting(
       base::OnceCallback<void(bool)> callback) override;
 
-  base::WeakPtr<StoragePartition> GetWeakPtr();
+  base::WeakPtr<StoragePartitionImpl> GetWeakPtr();
   BackgroundFetchContext* GetBackgroundFetchContext();
   PaymentAppContextImpl* GetPaymentAppContext();
   BroadcastChannelService* GetBroadcastChannelService();
diff --git a/content/renderer/policy_container_util.cc b/content/renderer/policy_container_util.cc
index 7e303213..0437a82 100644
--- a/content/renderer/policy_container_util.cc
+++ b/content/renderer/policy_container_util.cc
@@ -16,7 +16,7 @@
 
   return std::make_unique<blink::WebPolicyContainer>(
       blink::WebPolicyContainerPolicies{
-          in->policies->cross_origin_embedder_policy,
+          in->policies->cross_origin_embedder_policy.value,
           in->policies->referrer_policy,
           ToWebContentSecurityPolicies(
               std::move(in->policies->content_security_policies)),
diff --git a/device/vr/android/web_xr_presentation_state.cc b/device/vr/android/web_xr_presentation_state.cc
index 2c5b9bc..d9d06422 100644
--- a/device/vr/android/web_xr_presentation_state.cc
+++ b/device/vr/android/web_xr_presentation_state.cc
@@ -13,7 +13,6 @@
 #include "components/viz/common/frame_sinks/begin_frame_args.h"
 #include "gpu/ipc/common/gpu_memory_buffer_impl_android_hardware_buffer.h"
 #include "ui/gl/gl_fence.h"
-#include "ui/gl/gl_image_egl.h"
 
 namespace device {
 
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index e8c8c7f..4ebca1f 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1809,6 +1809,7 @@
   PDFVIEWERPRIVATE_ISALLOWEDLOCALFILEACCESS = 1746,
   DECLARATIVENETREQUEST_UPDATESTATICRULES = 1747,
   FILEMANAGERPRIVATEINTERNAL_SEARCHFILES = 1748,
+  SYSTEMLOG_ADD = 1749,
   // Last entry: Add new entries above, then run:
   // tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/extensions/common/mojom/api_permission_id.mojom b/extensions/common/mojom/api_permission_id.mojom
index 10888bb94..6c077d02 100644
--- a/extensions/common/mojom/api_permission_id.mojom
+++ b/extensions/common/mojom/api_permission_id.mojom
@@ -270,6 +270,7 @@
   kWebRequestAuthProvider = 243,
   kChromeOSTelemetryNetworkInformation = 244,
   kPdfViewerPrivate = 245,
+  kSystemLog = 246,
 
   // Add new entries at the end of the enum and be sure to update the
   // "ExtensionPermission3" enum in tools/metrics/histograms/enums.xml
diff --git a/extensions/common/permissions/extensions_api_permissions.cc b/extensions/common/permissions/extensions_api_permissions.cc
index 583777a9..ca5b1c3 100644
--- a/extensions/common/permissions/extensions_api_permissions.cc
+++ b/extensions/common/permissions/extensions_api_permissions.cc
@@ -138,6 +138,8 @@
      APIPermissionInfo::kFlagDoesNotRequireManagedSessionFullLoginWarning},
     {APIPermissionID::kSystemCpu, "system.cpu",
      APIPermissionInfo::kFlagDoesNotRequireManagedSessionFullLoginWarning},
+    {APIPermissionID::kSystemLog, "systemLog",
+     APIPermissionInfo::kFlagDoesNotRequireManagedSessionFullLoginWarning},
     {APIPermissionID::kSystemMemory, "system.memory",
      APIPermissionInfo::kFlagDoesNotRequireManagedSessionFullLoginWarning},
     {APIPermissionID::kSystemNetwork, "system.network",
diff --git a/gpu/command_buffer/service/shared_image/gl_texture_image_backing.cc b/gpu/command_buffer/service/shared_image/gl_texture_image_backing.cc
index 340359e..7c89061 100644
--- a/gpu/command_buffer/service/shared_image/gl_texture_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/gl_texture_image_backing.cc
@@ -387,8 +387,8 @@
     std::vector<WGPUTextureFormat> view_formats) {
 #if BUILDFLAG(USE_DAWN) && BUILDFLAG(DAWN_ENABLE_BACKEND_OPENGLES)
   if (backend_type == WGPUBackendType_OpenGLES) {
-    if (!image_egl_) {
-      CreateEGLImage();
+    if (!gl_image_native_pixmap_) {
+      CreateGLImageNativePixmap();
     }
     std::unique_ptr<GLTextureImageRepresentationBase> texture;
     if (IsPassthrough()) {
@@ -464,18 +464,19 @@
   }
 }
 
-void GLTextureImageBacking::CreateEGLImage() {
+void GLTextureImageBacking::CreateGLImageNativePixmap() {
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OZONE)
   SharedContextState* shared_context_state = factory()->GetSharedContextState();
   ui::ScopedMakeCurrent smc(shared_context_state->context(),
                             shared_context_state->surface());
-  image_egl_ = gl::GLImageNativePixmap::CreateFromTexture(
+  gl_image_native_pixmap_ = gl::GLImageNativePixmap::CreateFromTexture(
       size(), ToBufferFormat(format()), GetGLServiceId());
   if (passthrough_texture_) {
     passthrough_texture_->SetLevelImage(passthrough_texture_->target(), 0,
-                                        image_egl_.get());
+                                        gl_image_native_pixmap_.get());
   } else if (texture_) {
-    texture_->SetLevelImage(texture_->target(), 0, image_egl_.get(),
+    texture_->SetLevelImage(texture_->target(), 0,
+                            gl_image_native_pixmap_.get(),
                             gles2::Texture::ImageState::BOUND);
   }
 #endif
diff --git a/gpu/command_buffer/service/shared_image/gl_texture_image_backing.h b/gpu/command_buffer/service/shared_image/gl_texture_image_backing.h
index 257ddb0..13908d8 100644
--- a/gpu/command_buffer/service/shared_image/gl_texture_image_backing.h
+++ b/gpu/command_buffer/service/shared_image/gl_texture_image_backing.h
@@ -9,7 +9,7 @@
 #include "gpu/command_buffer/service/shared_image/shared_image_format_utils.h"
 
 namespace gl {
-class GLImageEGL;
+class GLImageNativePixmap;
 }
 
 namespace gpu {
@@ -42,7 +42,7 @@
 
   GLenum GetGLTarget() const;
   GLuint GetGLServiceId() const;
-  void CreateEGLImage();
+  void CreateGLImageNativePixmap();
 
  private:
   // SharedImageBacking:
@@ -78,7 +78,7 @@
   GLFormatDesc format_desc_;
 
   sk_sp<SkPromiseImageTexture> cached_promise_texture_;
-  scoped_refptr<gl::GLImageEGL> image_egl_;
+  scoped_refptr<gl::GLImageNativePixmap> gl_image_native_pixmap_;
 };
 
 }  // namespace gpu
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index af0a0da..6ad8a84 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -1306,6 +1306,8 @@
       base::SysUTF8ToNSString(policy::key::kSafeBrowsingProtectionLevel) : @2,
 
       base::SysUTF8ToNSString(policy::key::kSearchSuggestEnabled) : @YES,
+
+      base::SysUTF8ToNSString(policy::key::kAppStoreRatingEnabled) : @NO,
     }];
   }
 
diff --git a/ios/chrome/browser/ui/app_store_rating/BUILD.gn b/ios/chrome/browser/ui/app_store_rating/BUILD.gn
index bd95f13..175b4eb 100644
--- a/ios/chrome/browser/ui/app_store_rating/BUILD.gn
+++ b/ios/chrome/browser/ui/app_store_rating/BUILD.gn
@@ -19,6 +19,7 @@
     "//components/prefs",
     "//ios/chrome/browser/application_context",
     "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/prefs:pref_names",
     "//ios/chrome/browser/promos_manager",
     "//ios/chrome/browser/promos_manager:constants",
     "//ios/chrome/browser/promos_manager:types",
@@ -68,6 +69,7 @@
     "//ios/chrome/browser/ui/default_promo:utils",
     "//ios/chrome/browser/ui/main:browser_interface_provider",
     "//ios/chrome/browser/ui/main/test",
+    "//ios/chrome/test:test_support",
     "//ios/web/public/test",
     "//testing/gtest",
     "//third_party/ocmock",
diff --git a/ios/chrome/browser/ui/app_store_rating/app_store_rating_display_handler.mm b/ios/chrome/browser/ui/app_store_rating/app_store_rating_display_handler.mm
index e00286d..6061b96bf 100644
--- a/ios/chrome/browser/ui/app_store_rating/app_store_rating_display_handler.mm
+++ b/ios/chrome/browser/ui/app_store_rating/app_store_rating_display_handler.mm
@@ -5,6 +5,9 @@
 #import "ios/chrome/browser/ui/app_store_rating/app_store_rating_display_handler.h"
 
 #import "base/check.h"
+#import "components/prefs/pref_service.h"
+#import "ios/chrome/browser/application_context/application_context.h"
+#import "ios/chrome/browser/prefs/pref_names.h"
 #import "ios/chrome/browser/promos_manager/constants.h"
 #import "ios/chrome/browser/promos_manager/impression_limit.h"
 
@@ -18,7 +21,10 @@
 
 - (void)handleDisplay {
   DCHECK(self.handler);
-  [self.handler requestAppStoreReview];
+  if (GetApplicationContext()->GetLocalState()->GetBoolean(
+          prefs::kAppStoreRatingPolicyEnabled)) {
+    [self.handler requestAppStoreReview];
+  }
 }
 
 #pragma mark - PromoProtocol
diff --git a/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent.mm b/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent.mm
index efb825e..e74f9a7 100644
--- a/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent.mm
+++ b/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent.mm
@@ -14,6 +14,7 @@
 #import "ios/chrome/browser/application_context/application_context.h"
 #import "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #import "ios/chrome/browser/main/browser.h"
+#import "ios/chrome/browser/prefs/pref_names.h"
 #import "ios/chrome/browser/promos_manager/constants.h"
 #import "ios/chrome/browser/promos_manager/promos_manager.h"
 #import "ios/chrome/browser/ui/app_store_rating/constants.h"
@@ -113,8 +114,10 @@
 // Calls the PromosManager to request iOS displays the
 // App Store Rating prompt to the user.
 - (void)requestPromoDisplay {
-  if (!_promosManager)
+  if (!_promosManager || !GetApplicationContext()->GetLocalState()->GetBoolean(
+                             prefs::kAppStoreRatingPolicyEnabled)) {
     return;
+  }
   _promosManager->RegisterPromoForSingleDisplay(
       promos_manager::Promo::AppStoreRating);
 }
diff --git a/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent_unittest.mm b/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent_unittest.mm
index 6860724..cefecff 100644
--- a/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent_unittest.mm
+++ b/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent_unittest.mm
@@ -21,6 +21,7 @@
 #import "ios/chrome/browser/ui/default_promo/default_browser_utils_test_support.h"
 #import "ios/chrome/browser/ui/main/browser_interface_provider.h"
 #import "ios/chrome/browser/ui/main/test/fake_scene_state.h"
+#import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h"
 #import "ios/web/public/test/web_task_environment.h"
 #import "testing/gmock/include/gmock/gmock.h"
 #import "testing/platform_test.h"
@@ -42,9 +43,13 @@
     CreateAppStoreRatingSceneAgent();
   }
 
-  ~AppStoreRatingSceneAgentTest() override { ClearUserDefaults(); }
+  ~AppStoreRatingSceneAgentTest() override {
+    ClearUserDefaults();
+    local_state_.Get()->ClearPref(prefs::kAppStoreRatingPolicyEnabled);
+  }
 
  protected:
+  IOSChromeScopedTestingLocalState local_state_;
   std::unique_ptr<TestChromeBrowserState> browser_state_;
   web::WebTaskEnvironment task_environment_;
   AppStoreRatingSceneAgent* test_scene_agent_;
@@ -200,6 +205,25 @@
       transitionedToActivationLevel:SceneActivationLevelForegroundActive];
 }
 
+// Tests that promo display is not requested when the App Store Rating policy is
+// disabled.
+TEST_F(AppStoreRatingSceneAgentTest, TestPolicyDisabled) {
+  EXPECT_CALL(*promos_manager_.get(), RegisterPromoForSingleDisplay(_))
+      .Times(0);
+
+  SetActiveDaysInPastWeek(3);
+  SetTotalDaysOnChrome(16);
+  EnableCPE();
+  SetTrueChromeLikelyDefaultBrowser();
+
+  // Disabling the policy.
+  local_state_.Get()->SetBoolean(prefs::kAppStoreRatingPolicyEnabled, false);
+
+  // Simulating the user launching or resuming the app.
+  [test_scene_agent_ sceneState:fake_scene_state_
+      transitionedToActivationLevel:SceneActivationLevelForegroundActive];
+}
+
 // Tests that promo display is requested when the user meets all
 // requirements to be considered engaged.
 TEST_F(AppStoreRatingSceneAgentTest, TestPromoCorrectlyRequested) {
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn
index de2227e..5941364 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn
@@ -17,7 +17,6 @@
   configs += [ "//build/config/compiler:enable_arc" ]
 
   deps = [
-    ":tab_context_menu",
     ":tab_grid_paging",
     ":tab_grid_ui",
     "grid:grid_ui",
@@ -72,6 +71,7 @@
     "//ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs",
     "//ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs:features",
     "//ios/chrome/browser/ui/tab_switcher/tab_grid/suggested_actions",
+    "//ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu",
     "//ios/chrome/browser/ui/tab_switcher/tab_grid/transitions",
     "//ios/chrome/browser/ui/thumb_strip",
     "//ios/chrome/browser/ui/thumb_strip:feature_flags",
@@ -134,7 +134,6 @@
   configs += [ "//build/config/compiler:enable_arc" ]
 
   deps = [
-    ":tab_context_menu",
     ":tab_grid_paging",
     ":tab_grid_ui_constants",
     "grid:grid_ui",
@@ -165,6 +164,7 @@
     "//ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs:features",
     "//ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs:pinned_tabs_ui",
     "//ios/chrome/browser/ui/tab_switcher/tab_grid/suggested_actions",
+    "//ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu",
     "//ios/chrome/browser/ui/tab_switcher/tab_grid/transitions",
     "//ios/chrome/browser/ui/table_view:styler",
     "//ios/chrome/browser/ui/thumb_strip",
@@ -178,33 +178,6 @@
   ]
 }
 
-source_set("tab_context_menu") {
-  sources = [
-    "tab_cell.h",
-    "tab_cell.mm",
-    "tab_context_menu_helper.h",
-    "tab_context_menu_helper.mm",
-    "tab_context_menu_provider.h",
-    "tab_item.h",
-    "tab_item.mm",
-    "tab_menu_actions_data_source.h",
-  ]
-
-  configs += [ "//build/config/compiler:enable_arc" ]
-
-  deps = [
-    "//base",
-    "//components/bookmarks/common",
-    "//components/prefs",
-    "//ios/chrome/browser/browser_state",
-    "//ios/chrome/browser/main:public",
-    "//ios/chrome/browser/ui/menu",
-    "//ios/chrome/browser/ui/menu:tab_context_menu_delegate",
-    "//ios/chrome/browser/ui/ntp:util",
-    "//ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs:features",
-  ]
-}
-
 source_set("unit_tests") {
   configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/BUILD.gn
index 9ef1d58..c000a841 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/BUILD.gn
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/BUILD.gn
@@ -60,10 +60,10 @@
     "//ios/chrome/browser/ui/incognito_reauth:incognito_reauth_ui",
     "//ios/chrome/browser/ui/menu",
     "//ios/chrome/browser/ui/tab_switcher",
-    "//ios/chrome/browser/ui/tab_switcher/tab_grid:tab_context_menu",
     "//ios/chrome/browser/ui/tab_switcher/tab_grid:tab_grid_paging",
     "//ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs:features",
     "//ios/chrome/browser/ui/tab_switcher/tab_grid/suggested_actions",
+    "//ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu",
     "//ios/chrome/browser/ui/tab_switcher/tab_grid/transitions",
     "//ios/chrome/browser/ui/thumb_strip",
     "//ios/chrome/browser/ui/thumb_strip:feature_flags",
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_cell.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_cell.h
index 94c48a19..ad8c62e 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_cell.h
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_cell.h
@@ -9,7 +9,7 @@
 
 #import "ios/chrome/browser/ui/commerce/price_card/price_card_view.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_theme.h"
-#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_cell.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_cell.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/transitions/grid_to_tab_transition_view.h"
 
 @class GridCell;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm
index 7991a6d..b15a646 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm
@@ -36,7 +36,7 @@
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/suggested_actions/suggested_actions_delegate.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/suggested_actions/suggested_actions_grid_cell.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/suggested_actions/suggested_actions_view_controller.h"
-#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu_provider.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_provider.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/transitions/grid_transition_layout.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_item.h"
 #import "ios/chrome/browser/ui/util/rtl_geometry.h"
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/BUILD.gn
index beb48f0..0aafb8a 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/BUILD.gn
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/BUILD.gn
@@ -42,8 +42,8 @@
     ":features",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/ui/tab_switcher",
-    "//ios/chrome/browser/ui/tab_switcher/tab_grid:tab_context_menu",
     "//ios/chrome/browser/ui/tab_switcher/tab_grid/grid:grid_ui",
+    "//ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu",
     "//ios/chrome/common/ui/colors",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_cell.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_cell.h
index a6eb6d6..0b528f93 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_cell.h
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_cell.h
@@ -7,7 +7,7 @@
 
 #import <UIKit/UIKit.h>
 
-#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_cell.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_cell.h"
 
 // A cell for the pinned tabs view. Contains an icon, title, snapshot.
 @interface PinnedCell : TabCell
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_tabs_view_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_tabs_view_controller.mm
index 6480032..84dd453e 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_tabs_view_controller.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_tabs_view_controller.mm
@@ -15,7 +15,7 @@
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_cell.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_tabs_constants.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_tabs_layout.h"
-#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu_provider.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_provider.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_item.h"
 #import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/BUILD.gn
new file mode 100644
index 0000000..52b72a02
--- /dev/null
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/BUILD.gn
@@ -0,0 +1,31 @@
+# Copyright 2022 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("tab_context_menu") {
+  sources = [
+    "tab_cell.h",
+    "tab_cell.mm",
+    "tab_context_menu_actions_data_source.h",
+    "tab_context_menu_helper.h",
+    "tab_context_menu_helper.mm",
+    "tab_context_menu_provider.h",
+    "tab_item.h",
+    "tab_item.mm",
+  ]
+
+  configs += [ "//build/config/compiler:enable_arc" ]
+
+  deps = [
+    "//base",
+    "//components/bookmarks/common",
+    "//components/prefs",
+    "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/main:public",
+    "//ios/chrome/browser/ui/menu",
+    "//ios/chrome/browser/ui/menu:tab_context_menu_delegate",
+    "//ios/chrome/browser/ui/ntp:util",
+    "//ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs:features",
+    "//url",
+  ]
+}
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_cell.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_cell.h
similarity index 72%
rename from ios/chrome/browser/ui/tab_switcher/tab_grid/tab_cell.h
rename to ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_cell.h
index ed44cd4..8747be5 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_cell.h
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_cell.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 IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CELL_H_
-#define IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CELL_H_
+#ifndef IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_TAB_CELL_H_
+#define IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_TAB_CELL_H_
 
 #import <UIKit/UIKit.h>
 
@@ -21,4 +21,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CELL_H_
+#endif  // IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_TAB_CELL_H_
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_cell.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_cell.mm
similarity index 82%
rename from ios/chrome/browser/ui/tab_switcher/tab_grid/tab_cell.mm
rename to ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_cell.mm
index 2601fbc..e7a2360 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_cell.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_cell.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.
 
-#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_cell.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_cell.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_menu_actions_data_source.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_actions_data_source.h
similarity index 63%
rename from ios/chrome/browser/ui/tab_switcher/tab_grid/tab_menu_actions_data_source.h
rename to ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_actions_data_source.h
index c4f8f58..6a25799 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_menu_actions_data_source.h
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_actions_data_source.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 IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_MENU_ACTIONS_DATA_SOURCE_H_
-#define IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_MENU_ACTIONS_DATA_SOURCE_H_
+#ifndef IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_TAB_CONTEXT_MENU_ACTIONS_DATA_SOURCE_H_
+#define IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_TAB_CONTEXT_MENU_ACTIONS_DATA_SOURCE_H_
 
 #import <Foundation/Foundation.h>
 
@@ -22,4 +22,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_MENU_ACTIONS_DATA_SOURCE_H_
+#endif  // IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_TAB_CONTEXT_MENU_ACTIONS_DATA_SOURCE_H_
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu_helper.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_helper.h
similarity index 87%
rename from ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu_helper.h
rename to ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_helper.h
index fdbd77f..4c5b0f3 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu_helper.h
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_helper.h
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_HELPER_H_
-#define IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_HELPER_H_
+#ifndef IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_TAB_CONTEXT_MENU_HELPER_H_
+#define IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_TAB_CONTEXT_MENU_HELPER_H_
 
 #import <UIKit/UIKit.h>
 
-#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu_provider.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_provider.h"
 
 class Browser;
 @protocol TabContextMenuDelegate;
@@ -25,4 +25,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_HELPER_H_
+#endif  // IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_TAB_CONTEXT_MENU_HELPER_H_
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu_helper.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_helper.mm
similarity index 95%
rename from ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu_helper.mm
rename to ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_helper.mm
index b2109eb..742b7687 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu_helper.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_helper.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.
 
-#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu_helper.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_helper.h"
 
 #import "base/metrics/histogram_functions.h"
 #import "components/bookmarks/common/bookmark_pref_names.h"
@@ -14,9 +14,10 @@
 #import "ios/chrome/browser/ui/menu/tab_context_menu_delegate.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_util.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/features.h"
-#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_cell.h"
-#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_item.h"
-#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_menu_actions_data_source.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_cell.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_actions_data_source.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_item.h"
+
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu_provider.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_provider.h
similarity index 87%
rename from ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu_provider.h
rename to ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_provider.h
index d8d55a5..0d0c47b 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu_provider.h
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_provider.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 IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_PROVIDER_H_
-#define IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_PROVIDER_H_
+#ifndef IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_TAB_CONTEXT_MENU_PROVIDER_H_
+#define IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_TAB_CONTEXT_MENU_PROVIDER_H_
 
 #import <UIKit/UIKit.h>
 
@@ -21,4 +21,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_PROVIDER_H_
+#endif  // IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_TAB_CONTEXT_MENU_PROVIDER_H_
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_item.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_item.h
similarity index 72%
rename from ios/chrome/browser/ui/tab_switcher/tab_grid/tab_item.h
rename to ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_item.h
index 9e884d7..1a20dfa 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_item.h
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_item.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 IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_ITEM_H_
-#define IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_ITEM_H_
+#ifndef IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_TAB_ITEM_H_
+#define IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_TAB_ITEM_H_
 
 #import <Foundation/Foundation.h>
 
@@ -26,4 +26,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_ITEM_H_
+#endif  // IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_CONTEXT_MENU_TAB_ITEM_H_
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_item.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_item.mm
similarity index 84%
rename from ios/chrome/browser/ui/tab_switcher/tab_grid/tab_item.mm
rename to ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_item.mm
index 9be01e9..fba0cfd 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_item.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_item.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.
 
-#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_item.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_item.h"
 
 #import "url/gurl.h"
 
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm
index 5feee7a6..a6216831 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm
@@ -56,13 +56,13 @@
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_commands.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/features.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_tabs_mediator.h"
-#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu_helper.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_helper.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_item.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator+private.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_delegate.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_paging.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.h"
-#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_item.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/transitions/tab_grid_transition_handler.h"
 #import "ios/chrome/browser/ui/thumb_strip/thumb_strip_coordinator.h"
 #import "ios/chrome/browser/ui/thumb_strip/thumb_strip_feature.h"
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.h
index 7eda402..396a1e0 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.h
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.h
@@ -11,7 +11,7 @@
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_commands.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_image_data_source.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_shareable_items_provider.h"
-#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_menu_actions_data_source.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_actions_data_source.h"
 
 class Browser;
 @protocol TabCollectionConsumer;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm
index e50339d..7fc62cf6 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm
@@ -48,7 +48,7 @@
 #import "ios/chrome/browser/ui/menu/action_factory.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_collection_consumer.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/features.h"
-#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_item.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_item.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_item.h"
 #import "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/url_with_title.h"
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm
index fe30fb46..7e3e1ce 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm
@@ -37,7 +37,7 @@
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_tabs_constants.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_tabs_view_controller.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/suggested_actions/suggested_actions_delegate.h"
-#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu_provider.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_provider.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_bottom_toolbar.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_constants.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_empty_state_view.h"
diff --git a/services/network/public/cpp/cross_origin_embedder_policy.cc b/services/network/public/cpp/cross_origin_embedder_policy.cc
index 4547fa91..ecd5195 100644
--- a/services/network/public/cpp/cross_origin_embedder_policy.cc
+++ b/services/network/public/cpp/cross_origin_embedder_policy.cc
@@ -13,6 +13,9 @@
 CrossOriginEmbedderPolicy::CrossOriginEmbedderPolicy(
     CrossOriginEmbedderPolicy&& src) = default;
 CrossOriginEmbedderPolicy::~CrossOriginEmbedderPolicy() = default;
+CrossOriginEmbedderPolicy::CrossOriginEmbedderPolicy(
+    mojom::CrossOriginEmbedderPolicyValue value)
+    : value(value) {}
 
 CrossOriginEmbedderPolicy& CrossOriginEmbedderPolicy::operator=(
     const CrossOriginEmbedderPolicy& src) = default;
diff --git a/services/network/public/cpp/cross_origin_embedder_policy.h b/services/network/public/cpp/cross_origin_embedder_policy.h
index e8ab47e..f78f4ed 100644
--- a/services/network/public/cpp/cross_origin_embedder_policy.h
+++ b/services/network/public/cpp/cross_origin_embedder_policy.h
@@ -21,6 +21,7 @@
   ~CrossOriginEmbedderPolicy();
   CrossOriginEmbedderPolicy(const CrossOriginEmbedderPolicy&);
   CrossOriginEmbedderPolicy(CrossOriginEmbedderPolicy&&);
+  explicit CrossOriginEmbedderPolicy(mojom::CrossOriginEmbedderPolicyValue);
   CrossOriginEmbedderPolicy& operator=(const CrossOriginEmbedderPolicy&);
   CrossOriginEmbedderPolicy& operator=(CrossOriginEmbedderPolicy&&);
   bool operator==(const CrossOriginEmbedderPolicy&) const;
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index 1148d6d..3b515163 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -5817,9 +5817,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5515.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5516.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 111.0.5515.0",
+        "description": "Run with ash-chrome version 111.0.5516.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -5831,8 +5831,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v111.0.5515.0",
-              "revision": "version:111.0.5515.0"
+              "location": "lacros_version_skew_tests_v111.0.5516.0",
+              "revision": "version:111.0.5516.0"
             }
           ],
           "dimension_sets": [
@@ -5988,9 +5988,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5515.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5516.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 111.0.5515.0",
+        "description": "Run with ash-chrome version 111.0.5516.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -6002,8 +6002,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v111.0.5515.0",
-              "revision": "version:111.0.5515.0"
+              "location": "lacros_version_skew_tests_v111.0.5516.0",
+              "revision": "version:111.0.5516.0"
             }
           ],
           "dimension_sets": [
@@ -6140,9 +6140,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5515.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5516.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 111.0.5515.0",
+        "description": "Run with ash-chrome version 111.0.5516.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -6154,8 +6154,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v111.0.5515.0",
-              "revision": "version:111.0.5515.0"
+              "location": "lacros_version_skew_tests_v111.0.5516.0",
+              "revision": "version:111.0.5516.0"
             }
           ],
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index d552365..ed1eb67 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -85435,9 +85435,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5515.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5516.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 111.0.5515.0",
+        "description": "Run with ash-chrome version 111.0.5516.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -85449,8 +85449,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v111.0.5515.0",
-              "revision": "version:111.0.5515.0"
+              "location": "lacros_version_skew_tests_v111.0.5516.0",
+              "revision": "version:111.0.5516.0"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -85576,9 +85576,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5515.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5516.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 111.0.5515.0",
+        "description": "Run with ash-chrome version 111.0.5516.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -85590,8 +85590,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v111.0.5515.0",
-              "revision": "version:111.0.5515.0"
+              "location": "lacros_version_skew_tests_v111.0.5516.0",
+              "revision": "version:111.0.5516.0"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -85703,9 +85703,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5515.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5516.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 111.0.5515.0",
+        "description": "Run with ash-chrome version 111.0.5516.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -85717,8 +85717,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v111.0.5515.0",
-              "revision": "version:111.0.5515.0"
+              "location": "lacros_version_skew_tests_v111.0.5516.0",
+              "revision": "version:111.0.5516.0"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -87051,9 +87051,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5515.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5516.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 111.0.5515.0",
+        "description": "Run with ash-chrome version 111.0.5516.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -87064,8 +87064,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v111.0.5515.0",
-              "revision": "version:111.0.5515.0"
+              "location": "lacros_version_skew_tests_v111.0.5516.0",
+              "revision": "version:111.0.5516.0"
             }
           ],
           "dimension_sets": [
@@ -87222,9 +87222,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5515.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5516.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 111.0.5515.0",
+        "description": "Run with ash-chrome version 111.0.5516.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -87235,8 +87235,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v111.0.5515.0",
-              "revision": "version:111.0.5515.0"
+              "location": "lacros_version_skew_tests_v111.0.5516.0",
+              "revision": "version:111.0.5516.0"
             }
           ],
           "dimension_sets": [
@@ -87374,9 +87374,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5515.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5516.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 111.0.5515.0",
+        "description": "Run with ash-chrome version 111.0.5516.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -87387,8 +87387,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v111.0.5515.0",
-              "revision": "version:111.0.5515.0"
+              "location": "lacros_version_skew_tests_v111.0.5516.0",
+              "revision": "version:111.0.5516.0"
             }
           ],
           "dimension_sets": [
@@ -88912,9 +88912,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5515.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5516.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 111.0.5515.0",
+        "description": "Run with ash-chrome version 111.0.5516.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -88925,8 +88925,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v111.0.5515.0",
-              "revision": "version:111.0.5515.0"
+              "location": "lacros_version_skew_tests_v111.0.5516.0",
+              "revision": "version:111.0.5516.0"
             }
           ],
           "dimension_sets": [
@@ -89083,9 +89083,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5515.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5516.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 111.0.5515.0",
+        "description": "Run with ash-chrome version 111.0.5516.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -89096,8 +89096,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v111.0.5515.0",
-              "revision": "version:111.0.5515.0"
+              "location": "lacros_version_skew_tests_v111.0.5516.0",
+              "revision": "version:111.0.5516.0"
             }
           ],
           "dimension_sets": [
@@ -89235,9 +89235,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5515.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5516.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 111.0.5515.0",
+        "description": "Run with ash-chrome version 111.0.5516.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -89248,8 +89248,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v111.0.5515.0",
-              "revision": "version:111.0.5515.0"
+              "location": "lacros_version_skew_tests_v111.0.5516.0",
+              "revision": "version:111.0.5516.0"
             }
           ],
           "dimension_sets": [
@@ -90021,9 +90021,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5515.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5516.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 111.0.5515.0",
+        "description": "Run with ash-chrome version 111.0.5516.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -90034,8 +90034,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v111.0.5515.0",
-              "revision": "version:111.0.5515.0"
+              "location": "lacros_version_skew_tests_v111.0.5516.0",
+              "revision": "version:111.0.5516.0"
             }
           ],
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index 5641436..3c7c604 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -18653,12 +18653,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5515.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5516.0/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 111.0.5515.0",
+        "description": "Run with ash-chrome version 111.0.5516.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -18670,8 +18670,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v111.0.5515.0",
-              "revision": "version:111.0.5515.0"
+              "location": "lacros_version_skew_tests_v111.0.5516.0",
+              "revision": "version:111.0.5516.0"
             }
           ],
           "dimension_sets": [
@@ -18844,12 +18844,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5515.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5516.0/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 111.0.5515.0",
+        "description": "Run with ash-chrome version 111.0.5516.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -18861,8 +18861,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v111.0.5515.0",
-              "revision": "version:111.0.5515.0"
+              "location": "lacros_version_skew_tests_v111.0.5516.0",
+              "revision": "version:111.0.5516.0"
             }
           ],
           "dimension_sets": [
@@ -19011,12 +19011,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5515.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5516.0/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 111.0.5515.0",
+        "description": "Run with ash-chrome version 111.0.5516.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -19028,8 +19028,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v111.0.5515.0",
-              "revision": "version:111.0.5515.0"
+              "location": "lacros_version_skew_tests_v111.0.5516.0",
+              "revision": "version:111.0.5516.0"
             }
           ],
           "dimension_sets": [
diff --git a/testing/buildbot/filters/mac.mac11-arm64-rel.browser_tests.filter b/testing/buildbot/filters/mac.mac11-arm64-rel.browser_tests.filter
index c7467d8..9b770a4 100644
--- a/testing/buildbot/filters/mac.mac11-arm64-rel.browser_tests.filter
+++ b/testing/buildbot/filters/mac.mac11-arm64-rel.browser_tests.filter
@@ -67,6 +67,7 @@
 -InlineLoginHelperBrowserTest.UntrustedSigninDialogCancel
 -InspectUIFencedFrameTest.FencedFrameInFrontEnd
 -InspectUITest.LaunchUIDevtools
+-LocationIconViewTest.HideOnSecondClick
 -ManagementUITest.ManagementStateChange
 -MediaEngagementBrowserTest.SessionMultipleTabsClosingParent
 -MediaInternalsUIBrowserTest.Integration
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index b51becc..0475aac4 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -22,16 +22,16 @@
   },
   'LACROS_VERSION_SKEW_CANARY': {
     'args': [
-      '--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5515.0/test_ash_chrome',
+      '--ash-chrome-path-override=../../lacros_version_skew_tests_v111.0.5516.0/test_ash_chrome',
     ],
-    'description': 'Run with ash-chrome version 111.0.5515.0',
+    'description': 'Run with ash-chrome version 111.0.5516.0',
     'identifier': 'Lacros version skew testing ash canary',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip',
-          'location': 'lacros_version_skew_tests_v111.0.5515.0',
-          'revision': 'version:111.0.5515.0',
+          'location': 'lacros_version_skew_tests_v111.0.5516.0',
+          'revision': 'version:111.0.5516.0',
         },
       ],
     },
diff --git a/testing/merge_scripts/code_coverage/merge_js_lib.py b/testing/merge_scripts/code_coverage/merge_js_lib.py
index b9bc9c9..ab2ca0b 100644
--- a/testing/merge_scripts/code_coverage/merge_js_lib.py
+++ b/testing/merge_scripts/code_coverage/merge_js_lib.py
@@ -370,6 +370,64 @@
     return output_dir
 
 
+def exclude_uninteresting_lines(coverage_file_path):
+    """Removes lines from Istanbul coverage reports that correspond to lines in
+  the source file that are empty. These lines provide no additional coverage
+  information and in fact inflate the coverage metrics.
+
+  Args:
+    coverage_file_path (str): The path to the merged coverage.json file.
+  """
+    with open(coverage_file_path, 'r+') as f:
+        coverage = json.load(f)
+
+        def exclude_line(coverage_map, key):
+            """Exclude an individual line from the coverage map. This relies on
+            the key 'statementMap' which maintains a map of statements to lines
+            as well as the key 's' which contains the invocation counts of each
+            line.
+            """
+            del coverage_map['statementMap'][key]
+            del coverage_map['s'][key]
+
+        for file_path in coverage:
+            istanbul_coverage = coverage[file_path]
+            lines = []
+            with open(file_path) as fd:
+                lines = fd.readlines()
+
+            # Force list of the keys to allow removal of items whilst iterating.
+            for key in list(istanbul_coverage['statementMap']):
+                statement_map = istanbul_coverage['statementMap'][key]
+                line_num = statement_map['start']['line']
+
+                assert statement_map['start']['line'] == statement_map['end'][
+                    'line']
+
+                line_contents = lines[line_num - 1].strip()
+
+                # Exclude empty lines
+                if line_contents == '':
+                    exclude_line(istanbul_coverage, key)
+                    continue
+
+                # Exclude lines that start with a full line comment.
+                # e.g. // comment.
+                if line_contents.startswith('//'):
+                    exclude_line(istanbul_coverage, key)
+                    continue
+
+                # Exclude any lines that start with an import statement.
+                if line_contents.startswith('import '):
+                    exclude_line(istanbul_coverage, key)
+                    continue
+
+        # Overwrite the current coverage file with new contents.
+        f.seek(0)
+        f.truncate()
+        json.dump(coverage, f)
+
+
 def get_raw_coverage_dirs(task_output_dir):
     """Returns a list of directories containing raw v8 coverage.
 
diff --git a/testing/merge_scripts/code_coverage/merge_js_lib_test.py b/testing/merge_scripts/code_coverage/merge_js_lib_test.py
index 1d4e2bc3..f028067e 100755
--- a/testing/merge_scripts/code_coverage/merge_js_lib_test.py
+++ b/testing/merge_scripts/code_coverage/merge_js_lib_test.py
@@ -565,6 +565,89 @@
         finally:
             shutil.rmtree(scripts_dir)
 
+    def test_uninteresting_lines_are_excluded(self):
+        """This contrived istanbul coverage file represents the coverage from
+        the following example file:
+        """
+        example_test_file = """// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './iframe.js';
+export const add = (a, b) => a + b;
+"""
+
+        test_istanbul_file = """{
+"%s":{
+  "path":"%s",
+  "all":false,
+  "statementMap":{
+    "1":{"start":{"line":1,"column":0},"end":{"line":1,"column":38}},
+    "2":{"start":{"line":2,"column":0},"end":{"line":2,"column":73}},
+    "3":{"start":{"line":3,"column":0},"end":{"line":3,"column":29}},
+    "4":{"start":{"line":4,"column":0},"end":{"line":4,"column":0}},
+    "5":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}},
+    "6":{"start":{"line":6,"column":0},"end":{"line":6,"column":35}}
+  },
+  "s":{
+    "1": 1,
+    "2": 1,
+    "3": 1,
+    "4": 1,
+    "5": 1,
+    "6": 1
+  }
+}
+        }"""
+
+        expected_output_file = """{
+            "%s": {
+                "path": "%s",
+                "all": false,
+                "statementMap": {
+                    "6": {
+                        "start": {
+                            "line": 6,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 35
+                        }
+                    }
+                },
+                "s": {
+                    "6": 1
+                }
+            }
+        }"""
+
+        try:
+            test_dir = tempfile.mkdtemp()
+            file_path = os.path.join(test_dir, 'coverage.json')
+            example_test_file_path = os.path.join(test_dir, 'fileA.js')
+            expected_output = json.loads(
+                expected_output_file %
+                (example_test_file_path, example_test_file_path))
+
+            # Set up the tests files so that exclusions can be performed.
+            with open(file_path, 'w') as f:
+                f.write(test_istanbul_file %
+                        (example_test_file_path, example_test_file_path))
+            with open(example_test_file_path, 'w') as f:
+                f.write(example_test_file)
+
+            # Perform the exclusion.
+            merger.exclude_uninteresting_lines(file_path)
+
+            # Assert the final `coverage.json` file matches the expected output.
+            with open(file_path, 'rb') as f:
+                coverage_json = json.load(f)
+                self.assertEqual(coverage_json, expected_output)
+
+        finally:
+            shutil.rmtree(test_dir)
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/testing/merge_scripts/code_coverage/merge_js_results.py b/testing/merge_scripts/code_coverage/merge_js_results.py
index 3bcad6d8..92acec5 100755
--- a/testing/merge_scripts/code_coverage/merge_js_results.py
+++ b/testing/merge_scripts/code_coverage/merge_js_results.py
@@ -62,6 +62,9 @@
                                                      parsed_scripts,
                                                      coverage_file_path)
 
+            logging.info('Excluding uninteresting lines from coverage')
+            javascript_merger.exclude_uninteresting_lines(coverage_file_path)
+
             report_dir = os.path.join(params.task_output_dir, 'js_report_dir')
             logging.info('Creating lcov report at %s', report_dir)
             javascript_merger.generate_coverage_reports(
diff --git a/third_party/blink/public/mojom/frame/policy_container.mojom b/third_party/blink/public/mojom/frame/policy_container.mojom
index 55784cd2..9a82bb1 100644
--- a/third_party/blink/public/mojom/frame/policy_container.mojom
+++ b/third_party/blink/public/mojom/frame/policy_container.mojom
@@ -15,8 +15,7 @@
 // except for referrer_policy and content_security_policies which might be
 // updated through meta tags (see PolicyContainerHost).
 struct PolicyContainerPolicies {
-  network.mojom.CrossOriginEmbedderPolicyValue cross_origin_embedder_policy =
-    network.mojom.CrossOriginEmbedderPolicyValue.kNone;
+  network.mojom.CrossOriginEmbedderPolicy cross_origin_embedder_policy;
   network.mojom.ReferrerPolicy referrer_policy =
     network.mojom.ReferrerPolicy.kDefault;
   array<network.mojom.ContentSecurityPolicy> content_security_policies;
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn
index c29495a..e38505d 100644
--- a/third_party/blink/renderer/core/BUILD.gn
+++ b/third_party/blink/renderer/core/BUILD.gn
@@ -97,6 +97,12 @@
   defines = [ "BLINK_CORE_IMPLEMENTATION=1" ]
 
   if (is_clang && clang_use_chrome_plugins) {
+    cflags += [
+      "-Xclang",
+      "-plugin-arg-find-bad-constructs",
+      "-Xclang",
+      "check-blink-data-member-type",
+    ]
     if (use_layout_plugin) {
       cflags += [
         "-Xclang",
diff --git a/third_party/blink/renderer/core/css/css_container_values.cc b/third_party/blink/renderer/core/css/css_container_values.cc
index 4cf441e9..a607fc1 100644
--- a/third_party/blink/renderer/core/css/css_container_values.cc
+++ b/third_party/blink/renderer/core/css/css_container_values.cc
@@ -23,7 +23,8 @@
           container.GetComputedStyle(),
           document.documentElement()->GetComputedStyle())),
       line_height_size_(CSSToLengthConversionData::LineHeightSize(
-          container.ComputedStyleRef())),
+          container.ComputedStyleRef(),
+          document.documentElement()->GetComputedStyle())),
       container_sizes_(container.ParentOrShadowHostElement()) {}
 
 void CSSContainerValues::Trace(Visitor* visitor) const {
@@ -68,6 +69,10 @@
   return line_height_size_.Lh(zoom);
 }
 
+float CSSContainerValues::RootLineHeight(float zoom) const {
+  return line_height_size_.Rlh(zoom);
+}
+
 double CSSContainerValues::ContainerWidth() const {
   return container_sizes_.Width().value_or(SmallViewportWidth());
 }
diff --git a/third_party/blink/renderer/core/css/css_container_values.h b/third_party/blink/renderer/core/css/css_container_values.h
index 8a5b5db..8db1cea 100644
--- a/third_party/blink/renderer/core/css/css_container_values.h
+++ b/third_party/blink/renderer/core/css/css_container_values.h
@@ -35,6 +35,7 @@
   float IcFontSize(float zoom) const override;
   float RicFontSize(float zoom) const override;
   float LineHeight(float zoom) const override;
+  float RootLineHeight(float zoom) const override;
   // Note that ContainerWidth/ContainerHeight are used to resolve
   // container *units*. See `container_sizes_`.
   Element* ContainerElement() const override { return element_; }
diff --git a/third_party/blink/renderer/core/css/css_length_resolver.cc b/third_party/blink/renderer/core/css/css_length_resolver.cc
index c0a0397..b8eb7fd 100644
--- a/third_party/blink/renderer/core/css/css_length_resolver.cc
+++ b/third_party/blink/renderer/core/css/css_length_resolver.cc
@@ -288,6 +288,9 @@
     case CSSPrimitiveValue::UnitType::kLhs:
       return value * LineHeight(Zoom());
 
+    case CSSPrimitiveValue::UnitType::kRlhs:
+      return value * RootLineHeight(Zoom());
+
     default:
       NOTREACHED();
       return 0;
diff --git a/third_party/blink/renderer/core/css/css_length_resolver.h b/third_party/blink/renderer/core/css/css_length_resolver.h
index fc179c2e..a2352f5 100644
--- a/third_party/blink/renderer/core/css/css_length_resolver.h
+++ b/third_party/blink/renderer/core/css/css_length_resolver.h
@@ -33,6 +33,7 @@
   virtual float IcFontSize(float zoom) const = 0;
   virtual float RicFontSize(float zoom) const = 0;
   virtual float LineHeight(float zoom) const = 0;
+  virtual float RootLineHeight(float zoom) const = 0;
 
   // Other sizes are not pre-zoomed.
   virtual double ViewportWidth() const = 0;
diff --git a/third_party/blink/renderer/core/css/css_math_expression_node.cc b/third_party/blink/renderer/core/css/css_math_expression_node.cc
index bdf2835..6fe4ec33 100644
--- a/third_party/blink/renderer/core/css/css_math_expression_node.cc
+++ b/third_party/blink/renderer/core/css/css_math_expression_node.cc
@@ -75,6 +75,7 @@
     case CSSPrimitiveValue::UnitType::kRexs:
     case CSSPrimitiveValue::UnitType::kRchs:
     case CSSPrimitiveValue::UnitType::kRics:
+    case CSSPrimitiveValue::UnitType::kRlhs:
       return RuntimeEnabledFeatures::CSSNewRootFontUnitsEnabled() ? kCalcLength
                                                                   : kCalcOther;
     case CSSPrimitiveValue::UnitType::kViewportInlineSize:
@@ -137,6 +138,7 @@
     case CSSPrimitiveValue::UnitType::kChs:
     case CSSPrimitiveValue::UnitType::kIcs:
     case CSSPrimitiveValue::UnitType::kLhs:
+    case CSSPrimitiveValue::UnitType::kRlhs:
     case CSSPrimitiveValue::UnitType::kRems:
     case CSSPrimitiveValue::UnitType::kRexs:
     case CSSPrimitiveValue::UnitType::kRchs:
diff --git a/third_party/blink/renderer/core/css/css_numeric_literal_value.cc b/third_party/blink/renderer/core/css/css_numeric_literal_value.cc
index b5806b4..bf1c625d 100644
--- a/third_party/blink/renderer/core/css/css_numeric_literal_value.cc
+++ b/third_party/blink/renderer/core/css/css_numeric_literal_value.cc
@@ -206,6 +206,7 @@
     case UnitType::kChs:
     case UnitType::kIcs:
     case UnitType::kLhs:
+    case UnitType::kRlhs:
     case UnitType::kPixels:
     case UnitType::kCentimeters:
     case UnitType::kDotsPerPixel:
diff --git a/third_party/blink/renderer/core/css/css_numeric_literal_value.h b/third_party/blink/renderer/core/css/css_numeric_literal_value.h
index f617f787..f62f53f 100644
--- a/third_party/blink/renderer/core/css/css_numeric_literal_value.h
+++ b/third_party/blink/renderer/core/css/css_numeric_literal_value.h
@@ -27,11 +27,22 @@
 
   bool IsAngle() const { return CSSPrimitiveValue::IsAngle(GetType()); }
   bool IsFontRelativeLength() const {
-    return GetType() == UnitType::kQuirkyEms || GetType() == UnitType::kEms ||
-           GetType() == UnitType::kExs || GetType() == UnitType::kRems ||
-           GetType() == UnitType::kChs || GetType() == UnitType::kIcs ||
-           GetType() == UnitType::kLhs || GetType() == UnitType::kRexs ||
-           GetType() == UnitType::kRchs || GetType() == UnitType::kRics;
+    switch (GetType()) {
+      case UnitType::kQuirkyEms:
+      case UnitType::kEms:
+      case UnitType::kExs:
+      case UnitType::kRems:
+      case UnitType::kChs:
+      case UnitType::kIcs:
+      case UnitType::kLhs:
+      case UnitType::kRexs:
+      case UnitType::kRchs:
+      case UnitType::kRics:
+      case UnitType::kRlhs:
+        return true;
+      default:
+        return false;
+    }
   }
   bool IsQuirkyEms() const { return GetType() == UnitType::kQuirkyEms; }
   bool IsViewportPercentageLength() const {
diff --git a/third_party/blink/renderer/core/css/css_primitive_value.cc b/third_party/blink/renderer/core/css/css_primitive_value.cc
index 2a23ae3..68e1d6be 100644
--- a/third_party/blink/renderer/core/css/css_primitive_value.cc
+++ b/third_party/blink/renderer/core/css/css_primitive_value.cc
@@ -560,6 +560,9 @@
     case CSSPrimitiveValue::UnitType::kLhs:
       length_type = kUnitTypeLineHeight;
       return true;
+    case CSSPrimitiveValue::UnitType::kRlhs:
+      length_type = kUnitTypeRootLineHeight;
+      return true;
     case CSSPrimitiveValue::UnitType::kPercentage:
       length_type = kUnitTypePercentage;
       return true;
@@ -681,6 +684,8 @@
       return CSSPrimitiveValue::UnitType::kIcs;
     case kUnitTypeLineHeight:
       return CSSPrimitiveValue::UnitType::kLhs;
+    case kUnitTypeRootLineHeight:
+      return CSSPrimitiveValue::UnitType::kRlhs;
     case kUnitTypePercentage:
       return CSSPrimitiveValue::UnitType::kPercentage;
     case kUnitTypeViewportWidth:
@@ -777,6 +782,8 @@
       return "ric";
     case UnitType::kLhs:
       return "lh";
+    case UnitType::kRlhs:
+      return "rlh";
     case UnitType::kPixels:
       return "px";
     case UnitType::kCentimeters:
diff --git a/third_party/blink/renderer/core/css/css_primitive_value.h b/third_party/blink/renderer/core/css/css_primitive_value.h
index 60626d9f..326ca28 100644
--- a/third_party/blink/renderer/core/css/css_primitive_value.h
+++ b/third_party/blink/renderer/core/css/css_primitive_value.h
@@ -128,6 +128,7 @@
     kChs,
     kIcs,
     kLhs,
+    kRlhs,
     kUserUnits,  // The SVG term for unitless lengths
     // Angle units
     kDegrees,
@@ -200,6 +201,7 @@
     kUnitTypeIdeographicFullWidth,
     kUnitTypeRootFontIdeographicFullWidth,
     kUnitTypeLineHeight,
+    kUnitTypeRootLineHeight,
 
     // This value must come after the last length unit type to enable iteration
     // over the length unit types.
@@ -300,7 +302,7 @@
            type == UnitType::kChs || type == UnitType::kIcs ||
            type == UnitType::kLhs || type == UnitType::kRexs ||
            type == UnitType::kRchs || type == UnitType::kRics ||
-           IsViewportPercentageLength(type) ||
+           type == UnitType::kRlhs || IsViewportPercentageLength(type) ||
            IsContainerPercentageLength(type);
   }
   bool IsLength() const;
diff --git a/third_party/blink/renderer/core/css/css_primitive_value_units.json5 b/third_party/blink/renderer/core/css/css_primitive_value_units.json5
index 7e78987..d7cef87 100644
--- a/third_party/blink/renderer/core/css/css_primitive_value_units.json5
+++ b/third_party/blink/renderer/core/css/css_primitive_value_units.json5
@@ -243,6 +243,10 @@
       unit_type: "kLhs",
     },
     {
+      name: "rlh",
+      unit_type: "kRlhs",
+    },
+    {
       name: "__qem",
       unit_type: "kQuirkyEms",
     },
diff --git a/third_party/blink/renderer/core/css/css_to_length_conversion_data.cc b/third_party/blink/renderer/core/css/css_to_length_conversion_data.cc
index c1e26ac..6b58ff9 100644
--- a/third_party/blink/renderer/core/css/css_to_length_conversion_data.cc
+++ b/third_party/blink/renderer/core/css/css_to_length_conversion_data.cc
@@ -175,10 +175,15 @@
 }
 
 CSSToLengthConversionData::LineHeightSize::LineHeightSize(
-    const ComputedStyle& style)
-    : LineHeightSize(style.LineHeight(),
-                     &style.GetFont(),
-                     style.EffectiveZoom()) {}
+    const ComputedStyle& style,
+    const ComputedStyle* root_style)
+    : LineHeightSize(
+          style.LineHeight(),
+          root_style ? root_style->LineHeight() : style.LineHeight(),
+          &style.GetFont(),
+          root_style ? &root_style->GetFont() : &style.GetFont(),
+          style.EffectiveZoom(),
+          root_style ? root_style->EffectiveZoom() : style.EffectiveZoom()) {}
 
 float CSSToLengthConversionData::LineHeightSize::Lh(float zoom) const {
   if (!font_) {
@@ -191,6 +196,17 @@
          zoom;
 }
 
+float CSSToLengthConversionData::LineHeightSize::Rlh(float zoom) const {
+  if (!root_font_) {
+    return 0;
+  }
+  // Like font-metrics-based units, rlh is also based on pre-zoomed font
+  // metrics. We therefore need to unzoom using the font zoom before applying
+  // the target zoom.
+  return ComputedStyle::ComputedLineHeight(root_line_height_, *root_font_) /
+         root_font_zoom_ * zoom;
+}
+
 CSSToLengthConversionData::ViewportSize::ViewportSize(
     const LayoutView* layout_view) {
   if (layout_view) {
@@ -280,7 +296,8 @@
     : CSSToLengthConversionData(
           element_style->GetWritingMode(),
           FontSizes(element_style, root_style),
-          LineHeightSize(parent_style ? *parent_style : *element_style),
+          LineHeightSize(parent_style ? *parent_style : *element_style,
+                         root_style),
           ViewportSize(layout_view),
           container_sizes,
           zoom,
@@ -353,6 +370,19 @@
   return line_height_size_.Lh(zoom);
 }
 
+float CSSToLengthConversionData::RootLineHeight(float zoom) const {
+  // Need to mark the current element's ComputedStyle as having glyph relative
+  // styles, even if it is not relative to the current element's font because
+  // the invalidation that happens when a web font finishes loading for the root
+  // element does not necessarily cause a style difference for the root element,
+  // hence will not cause an invalidation of root font relative dependent
+  // styles. See also Node::MarkSubtreeNeedsStyleRecalcForFontUpdates().
+  SetFlag(Flag::kGlyphRelative);
+  SetFlag(Flag::kRootFontRelative);
+  SetFlag(Flag::kLineHeightRelative);
+  return line_height_size_.Rlh(zoom);
+}
+
 double CSSToLengthConversionData::ViewportWidth() const {
   SetFlag(Flag::kStaticViewport);
   return viewport_size_.LargeWidth();
diff --git a/third_party/blink/renderer/core/css/css_to_length_conversion_data.h b/third_party/blink/renderer/core/css/css_to_length_conversion_data.h
index 6607c79..fc1fc5e3 100644
--- a/third_party/blink/renderer/core/css/css_to_length_conversion_data.h
+++ b/third_party/blink/renderer/core/css/css_to_length_conversion_data.h
@@ -92,18 +92,34 @@
     LineHeightSize() = default;
     LineHeightSize(const Length& line_height, const Font* font, float font_zoom)
         : line_height_(line_height), font_(font), font_zoom_(font_zoom) {}
-    explicit LineHeightSize(const ComputedStyle&);
+    LineHeightSize(const Length& line_height,
+                   const Length& root_line_height,
+                   const Font* font,
+                   const Font* root_font,
+                   float font_zoom,
+                   float root_font_zoom)
+        : line_height_(line_height),
+          root_line_height_(root_line_height),
+          font_(font),
+          root_font_(root_font),
+          font_zoom_(font_zoom),
+          root_font_zoom_(root_font_zoom) {}
+    LineHeightSize(const ComputedStyle& style, const ComputedStyle* root_style);
 
     float Lh(float zoom) const;
+    float Rlh(float zoom) const;
 
    private:
     Length line_height_;
+    Length root_line_height_;
     // Note that this Font may be different from the instance held
     // by FontSizes (for the same CSSToLengthConversionData object).
     const Font* font_ = nullptr;
+    const Font* root_font_ = nullptr;
     // Like ex/ch/ic, lh is also based on font-metrics and is pre-zoomed by
     // a factor of `font_zoom_`.
     float font_zoom_ = 1;
+    float root_font_zoom_ = 1;
   };
 
   class CORE_EXPORT ViewportSize {
@@ -235,6 +251,7 @@
   float IcFontSize(float zoom) const override;
   float RicFontSize(float zoom) const override;
   float LineHeight(float zoom) const override;
+  float RootLineHeight(float zoom) const override;
   double ViewportWidth() const override;
   double ViewportHeight() const override;
   double SmallViewportWidth() const override;
diff --git a/third_party/blink/renderer/core/css/css_to_length_conversion_data_test.cc b/third_party/blink/renderer/core/css/css_to_length_conversion_data_test.cc
index ecd9b64..b6cbf59 100644
--- a/third_party/blink/renderer/core/css/css_to_length_conversion_data_test.cc
+++ b/third_party/blink/renderer/core/css/css_to_length_conversion_data_test.cc
@@ -40,10 +40,13 @@
     }
     root->SetInlineStyleProperty(CSSPropertyID::kFontSize, "10px");
     root->SetInlineStyleProperty(CSSPropertyID::kFontFamily, "Ahem");
+    root->SetInlineStyleProperty(CSSPropertyID::kLineHeight, "5");
     auto* div = MakeGarbageCollected<HTMLDivElement>(GetDocument());
     div->SetInlineStyleProperty(CSSPropertyID::kFontSize, "20px");
     div->SetIdAttribute("div");
     GetDocument().body()->AppendChild(div);
+    GetDocument().body()->SetInlineStyleProperty(CSSPropertyID::kLineHeight,
+                                                 "10");
     UpdateAllLifecyclePhasesForTest();
 
     return CSSToLengthConversionData(
@@ -80,8 +83,9 @@
   }
 
   void SetLineHeightSize(Element& element, CSSToLengthConversionData& data) {
-    data.SetLineHeightSize(
-        CSSToLengthConversionData::LineHeightSize(element.ComputedStyleRef()));
+    data.SetLineHeightSize(CSSToLengthConversionData::LineHeightSize(
+        element.ComputedStyleRef(),
+        element.GetDocument().documentElement()->GetComputedStyle()));
   }
 
  private:
@@ -100,7 +104,8 @@
   EXPECT_FLOAT_EQ(20.0f, Convert(data, "1ic"));
   EXPECT_FLOAT_EQ(10.0f, Convert(data, "1ric"));
   EXPECT_FLOAT_EQ(36.0f, Convert(data, "calc(1em + 1ex)"));
-  EXPECT_FLOAT_EQ(10.0f, Convert(data, "1lh"));
+  EXPECT_FLOAT_EQ(100.0f, Convert(data, "1lh"));
+  EXPECT_FLOAT_EQ(50.0f, Convert(data, "1rlh"));
 }
 
 TEST_F(CSSToLengthConversionDataTest, Zoomed) {
@@ -115,7 +120,8 @@
   EXPECT_FLOAT_EQ(40.0f, Convert(data, "1ic"));
   EXPECT_FLOAT_EQ(20.0f, Convert(data, "1ric"));
   EXPECT_FLOAT_EQ(72.0f, Convert(data, "calc(1em + 1ex)"));
-  EXPECT_FLOAT_EQ(20.0f, Convert(data, "1lh"));
+  EXPECT_FLOAT_EQ(200.0f, Convert(data, "1lh"));
+  EXPECT_FLOAT_EQ(100.0f, Convert(data, "1rlh"));
 }
 
 TEST_F(CSSToLengthConversionDataTest, AdjustedZoom) {
@@ -130,7 +136,8 @@
   EXPECT_FLOAT_EQ(40.0f, Convert(data, "1ic"));
   EXPECT_FLOAT_EQ(20.0f, Convert(data, "1ric"));
   EXPECT_FLOAT_EQ(72.0f, Convert(data, "calc(1em + 1ex)"));
-  EXPECT_FLOAT_EQ(20.0f, Convert(data, "1lh"));
+  EXPECT_FLOAT_EQ(200.0f, Convert(data, "1lh"));
+  EXPECT_FLOAT_EQ(100.0f, Convert(data, "1rlh"));
 }
 
 TEST_F(CSSToLengthConversionDataTest, DifferentZoom) {
@@ -147,7 +154,8 @@
   EXPECT_FLOAT_EQ(40.0f, Convert(data, "1ic"));
   EXPECT_FLOAT_EQ(20.0f, Convert(data, "1ric"));
   EXPECT_FLOAT_EQ(72.0f, Convert(data, "calc(1em + 1ex)"));
-  EXPECT_FLOAT_EQ(20.0f, Convert(data, "1lh"));
+  EXPECT_FLOAT_EQ(200.0f, Convert(data, "1lh"));
+  EXPECT_FLOAT_EQ(100.0f, Convert(data, "1rlh"));
 }
 
 TEST_F(CSSToLengthConversionDataTest, Unzoomed) {
@@ -162,7 +170,8 @@
   EXPECT_FLOAT_EQ(20.0f, Convert(data, "1ic"));
   EXPECT_FLOAT_EQ(10.0f, Convert(data, "1ric"));
   EXPECT_FLOAT_EQ(36.0f, Convert(data, "calc(1em + 1ex)"));
-  EXPECT_FLOAT_EQ(10.0f, Convert(data, "1lh"));
+  EXPECT_FLOAT_EQ(100.0f, Convert(data, "1lh"));
+  EXPECT_FLOAT_EQ(50.0f, Convert(data, "1rlh"));
 }
 
 TEST_F(CSSToLengthConversionDataTest, StyleLessContainerUnitConversion) {
@@ -176,11 +185,11 @@
 
 TEST_F(CSSToLengthConversionDataTest, SetLineHeightSize) {
   CSSToLengthConversionData data = ConversionData();
-  EXPECT_FLOAT_EQ(10.0f, Convert(data, "1lh"));
+  EXPECT_FLOAT_EQ(100.0f, Convert(data, "1lh"));
   Element* div = GetDocument().getElementById("div");
   ASSERT_TRUE(div);
   SetLineHeightSize(*div, data);
-  EXPECT_FLOAT_EQ(20.0f, Convert(data, "1lh"));
+  EXPECT_FLOAT_EQ(200.0f, Convert(data, "1lh"));
 }
 
 TEST_F(CSSToLengthConversionDataTest, Flags) {
@@ -194,6 +203,7 @@
   Flags rch = rem | glyph;
   Flags ric = rem | glyph;
   Flags lh = static_cast<Flags>(Flag::kLineHeightRelative);
+  Flags rlh = glyph | rem | lh;
   Flags sv = static_cast<Flags>(Flag::kStaticViewport);
   Flags dv = static_cast<Flags>(Flag::kDynamicViewport);
   Flags cq = static_cast<Flags>(Flag::kContainerRelative);
@@ -212,6 +222,7 @@
   EXPECT_EQ(glyph, ConversionFlags("1ic"));
 
   EXPECT_EQ(glyph | lh, ConversionFlags("1lh"));
+  EXPECT_EQ(rlh, ConversionFlags("1rlh"));
 
   EXPECT_EQ(sv, ConversionFlags("1svw"));
   EXPECT_EQ(sv, ConversionFlags("1svh"));
diff --git a/third_party/blink/renderer/core/css/css_variable_data.cc b/third_party/blink/renderer/core/css/css_variable_data.cc
index ff58bdad..3fa261f 100644
--- a/third_party/blink/renderer/core/css/css_variable_data.cc
+++ b/third_party/blink/renderer/core/css/css_variable_data.cc
@@ -58,6 +58,7 @@
     case CSSPrimitiveValue::UnitType::kRexs:
     case CSSPrimitiveValue::UnitType::kRchs:
     case CSSPrimitiveValue::UnitType::kRics:
+    case CSSPrimitiveValue::UnitType::kRlhs:
       return true;
     default:
       return false;
diff --git a/third_party/blink/renderer/core/css/cssom/css_numeric_value_type.cc b/third_party/blink/renderer/core/css/cssom/css_numeric_value_type.cc
index ef1b7ba4..98aedf1b 100644
--- a/third_party/blink/renderer/core/css/cssom/css_numeric_value_type.cc
+++ b/third_party/blink/renderer/core/css/cssom/css_numeric_value_type.cc
@@ -66,6 +66,7 @@
     case UnitType::kChs:
     case UnitType::kIcs:
     case UnitType::kLhs:
+    case UnitType::kRlhs:
       return BaseType::kLength;
     case UnitType::kMilliseconds:
     case UnitType::kSeconds:
diff --git a/third_party/blink/renderer/core/css/cssom/css_unit_values.h b/third_party/blink/renderer/core/css/cssom/css_unit_values.h
index da2a49af..ad0b862e 100644
--- a/third_party/blink/renderer/core/css/cssom/css_unit_values.h
+++ b/third_party/blink/renderer/core/css/cssom/css_unit_values.h
@@ -43,6 +43,10 @@
     return CSSUnitValue::Create(value, CSSPrimitiveValue::UnitType::kLhs);
   }
 
+  static CSSUnitValue* rlh(double value) {
+    return CSSUnitValue::Create(value, CSSPrimitiveValue::UnitType::kRlhs);
+  }
+
   static CSSUnitValue* rem(double value) {
     return CSSUnitValue::Create(value, CSSPrimitiveValue::UnitType::kRems);
   }
diff --git a/third_party/blink/renderer/core/css/media_query_exp.cc b/third_party/blink/renderer/core/css/media_query_exp.cc
index 55763f70..4ba81b2 100644
--- a/third_party/blink/renderer/core/css/media_query_exp.cc
+++ b/third_party/blink/renderer/core/css/media_query_exp.cc
@@ -33,6 +33,7 @@
 #include "third_party/blink/renderer/core/css/css_math_expression_node.h"
 #include "third_party/blink/renderer/core/css/css_math_function_value.h"
 #include "third_party/blink/renderer/core/css/css_numeric_literal_value.h"
+#include "third_party/blink/renderer/core/css/css_primitive_value.h"
 #include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
 #include "third_party/blink/renderer/core/css/parser/css_parser_impl.h"
 #include "third_party/blink/renderer/core/css/parser/css_parser_token_range.h"
@@ -569,7 +570,8 @@
       length_type_flags.test(
           CSSPrimitiveValue::kUnitTypeRootFontZeroCharacterWidth) ||
       length_type_flags.test(
-          CSSPrimitiveValue::kUnitTypeRootFontIdeographicFullWidth)) {
+          CSSPrimitiveValue::kUnitTypeRootFontIdeographicFullWidth) ||
+      length_type_flags.test(CSSPrimitiveValue::kUnitTypeRootLineHeight)) {
     unit_flags |= UnitFlags::kRootFontRelative;
   }
 
diff --git a/third_party/blink/renderer/core/css/media_values_cached.cc b/third_party/blink/renderer/core/css/media_values_cached.cc
index 96688ce..9d778b5 100644
--- a/third_party/blink/renderer/core/css/media_values_cached.cc
+++ b/third_party/blink/renderer/core/css/media_values_cached.cc
@@ -143,6 +143,12 @@
   return data_.line_height;
 }
 
+float MediaValuesCached::RootLineHeight(float zoom) const {
+  DCHECK_EQ(1.0f, zoom);
+  // For media queries rlh and lh units are both based on the initial font.
+  return data_.line_height;
+}
+
 double MediaValuesCached::ViewportWidth() const {
   return data_.viewport_width;
 }
diff --git a/third_party/blink/renderer/core/css/media_values_cached.h b/third_party/blink/renderer/core/css/media_values_cached.h
index 2ec93917..b3ebfb4 100644
--- a/third_party/blink/renderer/core/css/media_values_cached.h
+++ b/third_party/blink/renderer/core/css/media_values_cached.h
@@ -161,6 +161,7 @@
   float IcFontSize(float zoom) const override;
   float RicFontSize(float zoom) const override;
   float LineHeight(float zoom) const override;
+  float RootLineHeight(float zoom) const override;
   double ViewportWidth() const override;
   double ViewportHeight() const override;
   double SmallViewportWidth() const override;
diff --git a/third_party/blink/renderer/core/css/media_values_dynamic.cc b/third_party/blink/renderer/core/css/media_values_dynamic.cc
index e41bd953..b6f0bc1 100644
--- a/third_party/blink/renderer/core/css/media_values_dynamic.cc
+++ b/third_party/blink/renderer/core/css/media_values_dynamic.cc
@@ -95,6 +95,12 @@
   return CalculateLineHeight(frame_);
 }
 
+float MediaValuesDynamic::RootLineHeight(float zoom) const {
+  DCHECK_EQ(1.0f, zoom);
+  // For media queries rlh and lh units are both based on the initial font.
+  return CalculateLineHeight(frame_);
+}
+
 double MediaValuesDynamic::ViewportWidth() const {
   if (viewport_dimensions_overridden_) {
     return viewport_width_override_;
diff --git a/third_party/blink/renderer/core/css/media_values_dynamic.h b/third_party/blink/renderer/core/css/media_values_dynamic.h
index ddb95df..6fbe7a69d 100644
--- a/third_party/blink/renderer/core/css/media_values_dynamic.h
+++ b/third_party/blink/renderer/core/css/media_values_dynamic.h
@@ -64,6 +64,7 @@
   float IcFontSize(float zoom) const override;
   float RicFontSize(float zoom) const override;
   float LineHeight(float zoom) const override;
+  float RootLineHeight(float zoom) const override;
   double ViewportWidth() const override;
   double ViewportHeight() const override;
   double SmallViewportWidth() const override;
diff --git a/third_party/blink/renderer/core/css/media_values_test.cc b/third_party/blink/renderer/core/css/media_values_test.cc
index bc1fa39fd..1706d5fe 100644
--- a/third_party/blink/renderer/core/css/media_values_test.cc
+++ b/third_party/blink/renderer/core/css/media_values_test.cc
@@ -40,6 +40,7 @@
       {40.0, CSSPrimitiveValue::UnitType::kIcs, 16, 300, 300, true, 640},
       {40.0, CSSPrimitiveValue::UnitType::kRics, 16, 300, 300, true, 640},
       {40.0, CSSPrimitiveValue::UnitType::kLhs, 16, 300, 300, true, 800},
+      {40.0, CSSPrimitiveValue::UnitType::kRlhs, 16, 300, 300, true, 800},
       {43.0, CSSPrimitiveValue::UnitType::kViewportWidth, 16, 848, 976, true,
        364.64},
       {100.0, CSSPrimitiveValue::UnitType::kViewportWidth, 16, 821, 976, true,
@@ -106,6 +107,7 @@
   double ic = 0;
   double ric = 0;
   double lh = 0;
+  double rlh = 0;
 
   using UnitType = CSSPrimitiveValue::UnitType;
 
@@ -118,6 +120,7 @@
   EXPECT_TRUE(media_values->ComputeLength(1.0, UnitType::kIcs, ic));
   EXPECT_TRUE(media_values->ComputeLength(1.0, UnitType::kRics, ric));
   EXPECT_TRUE(media_values->ComputeLength(1.0, UnitType::kLhs, lh));
+  EXPECT_TRUE(media_values->ComputeLength(1.0, UnitType::kRlhs, rlh));
 
   EXPECT_DOUBLE_EQ(10.0, em);
   EXPECT_DOUBLE_EQ(10.0, rem);
@@ -128,6 +131,7 @@
   EXPECT_DOUBLE_EQ(10.0, ic);
   EXPECT_DOUBLE_EQ(10.0, ric);
   EXPECT_DOUBLE_EQ(10.0, lh);
+  EXPECT_DOUBLE_EQ(10.0, rlh);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
index 7209168..6d05798e 100644
--- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
+++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
@@ -981,6 +981,7 @@
       case CSSPrimitiveValue::UnitType::kRexs:
       case CSSPrimitiveValue::UnitType::kRchs:
       case CSSPrimitiveValue::UnitType::kRics:
+      case CSSPrimitiveValue::UnitType::kRlhs:
         if (!RuntimeEnabledFeatures::CSSNewRootFontUnitsEnabled()) {
           return nullptr;
         }
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.cc b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
index 6207b72..1b48c04 100644
--- a/third_party/blink/renderer/core/css/resolver/style_resolver.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
@@ -1039,6 +1039,10 @@
     UseCounter::Count(GetDocument(), WebFeature::kHasGlyphRelativeUnits);
   }
 
+  if (state.Style()->HasLineHeightRelativeUnits()) {
+    GetDocument().GetStyleEngine().SetUsesLineHeightUnits(true);
+  }
+
   state.LoadPendingResources();
 
   // Now return the style.
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc b/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc
index c12f6f8..3fb06952 100644
--- a/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc
@@ -130,17 +130,9 @@
     const ComputedStyle* font_style) {
   DCHECK(font_style);
   const ComputedStyle* root_font_style = RootElementStyle();
-  float em = font_style->SpecifiedFontSize();
-  float rem = root_font_style ? root_font_style->SpecifiedFontSize() : 1.0f;
-  const Font* root_font =
-      root_font_style ? &root_font_style->GetFont() : &font_style->GetFont();
-  float root_zoom = root_font_style ? root_font_style->EffectiveZoom()
-                                    : font_style->EffectiveZoom();
-  CSSToLengthConversionData::FontSizes font_sizes(
-      em, rem, &font_style->GetFont(), root_font, font_style->EffectiveZoom(),
-      root_zoom);
+  CSSToLengthConversionData::FontSizes font_sizes(font_style, root_font_style);
   CSSToLengthConversionData::LineHeightSize line_height_size(
-      ParentStyle() ? *ParentStyle() : *Style());
+      ParentStyle() ? *ParentStyle() : *Style(), root_font_style);
   CSSToLengthConversionData::ViewportSize viewport_size(
       GetDocument().GetLayoutView());
   CSSToLengthConversionData::ContainerSizes container_sizes(
@@ -268,7 +260,8 @@
 
 void StyleResolverState::UpdateLineHeight() {
   css_to_length_conversion_data_.SetLineHeightSize(
-      CSSToLengthConversionData::LineHeightSize(*Style()));
+      CSSToLengthConversionData::LineHeightSize(
+          *Style(), GetDocument().documentElement()->GetComputedStyle()));
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/style_engine.cc b/third_party/blink/renderer/core/css/style_engine.cc
index 329630f..2e8b31f 100644
--- a/third_party/blink/renderer/core/css/style_engine.cc
+++ b/third_party/blink/renderer/core/css/style_engine.cc
@@ -2692,7 +2692,12 @@
       !old_root_style ||
       (UsesGlyphRelativeUnits() &&
        old_root_style->GetFont() != new_root_style->GetFont());
-  bool root_font_changed = rem_changed || root_font_glyphs_changed;
+  bool root_line_height_changed =
+      !old_root_style ||
+      (UsesLineHeightUnits() &&
+       old_root_style->LineHeight() != new_root_style->LineHeight());
+  bool root_font_changed =
+      rem_changed || root_font_glyphs_changed || root_line_height_changed;
   if (root_font_changed) {
     // Resolved root font relative units are stored in the matched properties
     // cache so we need to make sure to invalidate the cache if the
diff --git a/third_party/blink/renderer/core/css/style_engine.h b/third_party/blink/renderer/core/css/style_engine.h
index 9d1b286..9a4e6c1 100644
--- a/third_party/blink/renderer/core/css/style_engine.h
+++ b/third_party/blink/renderer/core/css/style_engine.h
@@ -308,6 +308,11 @@
   void IncrementSkippedContainerRecalc() { ++skipped_container_recalc_; }
   void DecrementSkippedContainerRecalc() { --skipped_container_recalc_; }
 
+  bool UsesLineHeightUnits() const { return uses_line_height_units_; }
+  void SetUsesLineHeightUnits(bool uses_line_height_units) {
+    uses_line_height_units_ = uses_line_height_units;
+  }
+
   bool UsesGlyphRelativeUnits() const { return uses_glyph_relative_units_; }
   void SetUsesGlyphRelativeUnits(bool uses_glyph_relative_units) {
     uses_glyph_relative_units_ = uses_glyph_relative_units;
@@ -845,6 +850,7 @@
 
   bool uses_root_font_relative_units_{false};
   bool uses_glyph_relative_units_{false};
+  bool uses_line_height_units_{false};
   // True if we have performed style recalc for at least one element that
   // depends on container queries.
   bool style_affected_by_layout_{false};
diff --git a/third_party/blink/renderer/core/execution_context/security_context.h b/third_party/blink/renderer/core/execution_context/security_context.h
index 1b93c055..d684ff3 100644
--- a/third_party/blink/renderer/core/execution_context/security_context.h
+++ b/third_party/blink/renderer/core/execution_context/security_context.h
@@ -50,9 +50,6 @@
 class PermissionsPolicy;
 class PolicyValue;
 class SecurityOrigin;
-struct ParsedPermissionsPolicyDeclaration;
-
-using ParsedPermissionsPolicy = std::vector<ParsedPermissionsPolicyDeclaration>;
 
 enum class SecureContextMode { kInsecureContext, kSecureContext };
 
diff --git a/third_party/blink/renderer/core/fetch/fetch_header_list.h b/third_party/blink/renderer/core/fetch/fetch_header_list.h
index bede7ee..87129596 100644
--- a/third_party/blink/renderer/core/fetch/fetch_header_list.h
+++ b/third_party/blink/renderer/core/fetch/fetch_header_list.h
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "third_party/blink/renderer/core/core_export.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
@@ -67,7 +68,8 @@
   // iterate through all keys and vectors in the HashMap. Similarly,
   // list() would require callers to manually iterate through the
   // HashMap's keys and value vector.
-  std::multimap<String, String, ByteCaseInsensitiveCompare> header_list_;
+  std::multimap<String, String, ByteCaseInsensitiveCompare> header_list_
+      ALLOW_DISCOURAGED_TYPE("No multimap equivalent in blink");
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/frame/policy_container.cc b/third_party/blink/renderer/core/frame/policy_container.cc
index 2aebaca2..5d8b7d2 100644
--- a/third_party/blink/renderer/core/frame/policy_container.cc
+++ b/third_party/blink/renderer/core/frame/policy_container.cc
@@ -33,10 +33,12 @@
     std::unique_ptr<WebPolicyContainer> container) {
   if (!container)
     return nullptr;
+  network::CrossOriginEmbedderPolicy cross_origin_embedder_policy;
+  cross_origin_embedder_policy.value =
+      container->policies.cross_origin_embedder_policy;
   mojom::blink::PolicyContainerPoliciesPtr policies =
       mojom::blink::PolicyContainerPolicies::New(
-          container->policies.cross_origin_embedder_policy,
-          container->policies.referrer_policy,
+          cross_origin_embedder_policy, container->policies.referrer_policy,
           ConvertToMojoBlink(
               std::move(container->policies.content_security_policies)),
           container->policies.is_credentialless,
diff --git a/third_party/blink/renderer/core/frame/policy_container_test.cc b/third_party/blink/renderer/core/frame/policy_container_test.cc
index 4119ec7d..feae2c1 100644
--- a/third_party/blink/renderer/core/frame/policy_container_test.cc
+++ b/third_party/blink/renderer/core/frame/policy_container_test.cc
@@ -16,7 +16,8 @@
 TEST(PolicyContainerTest, MembersAreSetDuringConstruction) {
   MockPolicyContainerHost host;
   auto policies = mojom::blink::PolicyContainerPolicies::New(
-      network::mojom::blink::CrossOriginEmbedderPolicyValue::kNone,
+      network::CrossOriginEmbedderPolicy(
+          network::mojom::blink::CrossOriginEmbedderPolicyValue::kNone),
       network::mojom::blink::ReferrerPolicy::kNever,
       Vector<network::mojom::blink::ContentSecurityPolicyPtr>(),
       /*anonymous=*/false, network::mojom::WebSandboxFlags::kNone,
@@ -32,7 +33,8 @@
 TEST(PolicyContainerTest, UpdateReferrerPolicyIsPropagated) {
   MockPolicyContainerHost host;
   auto policies = mojom::blink::PolicyContainerPolicies::New(
-      network::mojom::blink::CrossOriginEmbedderPolicyValue::kNone,
+      network::CrossOriginEmbedderPolicy(
+          network::mojom::blink::CrossOriginEmbedderPolicyValue::kNone),
       network::mojom::blink::ReferrerPolicy::kAlways,
       Vector<network::mojom::blink::ContentSecurityPolicyPtr>(),
       /*anonymous=*/false, network::mojom::WebSandboxFlags::kNone,
diff --git a/third_party/blink/renderer/core/frame/screen_metrics_emulator.h b/third_party/blink/renderer/core/frame/screen_metrics_emulator.h
index 708ac5f0..4114b3e6 100644
--- a/third_party/blink/renderer/core/frame/screen_metrics_emulator.h
+++ b/third_party/blink/renderer/core/frame/screen_metrics_emulator.h
@@ -6,9 +6,11 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_SCREEN_METRICS_EMULATOR_H_
 
 #include <memory>
+#include <vector>
 
 #include "third_party/blink/public/common/widget/device_emulation_params.h"
 #include "third_party/blink/public/mojom/widget/device_emulation_params.mojom-blink.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.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/heap/visitor.h"
@@ -95,7 +97,8 @@
   gfx::Size original_visible_viewport_size_;
   gfx::Rect original_view_screen_rect_;
   gfx::Rect original_window_screen_rect_;
-  std::vector<gfx::Rect> original_root_window_segments_;
+  std::vector<gfx::Rect> original_root_window_segments_ ALLOW_DISCOURAGED_TYPE(
+      "WebFrameWidgetImpl::SetWindowSegments() uses STL");
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/frame/window_or_worker_global_scope.cc b/third_party/blink/renderer/core/frame/window_or_worker_global_scope.cc
index 7d4760e..916e066 100644
--- a/third_party/blink/renderer/core/frame/window_or_worker_global_scope.cc
+++ b/third_party/blink/renderer/core/frame/window_or_worker_global_scope.cc
@@ -233,7 +233,7 @@
   const PolicyContainer* policy_container =
       execution_context.GetPolicyContainer();
   CHECK(policy_container);
-  switch (policy_container->GetPolicies().cross_origin_embedder_policy) {
+  switch (policy_container->GetPolicies().cross_origin_embedder_policy.value) {
     case network::mojom::CrossOriginEmbedderPolicyValue::kNone:
       return "unsafe-none";
     case network::mojom::CrossOriginEmbedderPolicyValue::kCredentialless:
diff --git a/third_party/blink/renderer/core/layout/layout_block.cc b/third_party/blink/renderer/core/layout/layout_block.cc
index 13ca971..48174b9 100644
--- a/third_party/blink/renderer/core/layout/layout_block.cc
+++ b/third_party/blink/renderer/core/layout/layout_block.cc
@@ -2125,7 +2125,7 @@
   if (!IsAnonymous())  // For anonymous blocks, the children add outline rects.
     rects.emplace_back(additional_offset, Size());
 
-  if (include_block_overflows == NGOutlineType::kIncludeBlockVisualOverflow &&
+  if (ShouldIncludeBlockVisualOverflow(include_block_overflows) &&
       !HasNonVisibleOverflow() && !HasControlClip()) {
     AddOutlineRectsForNormalChildren(rects, additional_offset,
                                      include_block_overflows);
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 03bd411..f7faff0 100644
--- a/third_party/blink/renderer/core/layout/layout_block_flow.cc
+++ b/third_party/blink/renderer/core/layout/layout_block_flow.cc
@@ -4702,7 +4702,7 @@
   LayoutBlock::AddOutlineRects(rects, info, additional_offset,
                                include_block_overflows);
 
-  if (include_block_overflows == NGOutlineType::kIncludeBlockVisualOverflow &&
+  if (ShouldIncludeBlockVisualOverflow(include_block_overflows) &&
       !HasNonVisibleOverflow() && !HasControlClip()) {
     for (RootInlineBox* curr = FirstRootBox(); curr;
          curr = curr->NextRootBox()) {
diff --git a/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h b/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h
index ef51bb8..a2cd4b9 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h
@@ -1676,6 +1676,9 @@
   }
 
   void DisableFurtherFragmentation() {
+    if (!HasBlockFragmentation()) {
+      return;
+    }
     DCHECK(rare_data_);
     rare_data_->block_direction_fragmentation_type = kFragmentNone;
     rare_data_->is_block_fragmentation_forced_off = true;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_outline_type.h b/third_party/blink/renderer/core/layout/ng/ng_outline_type.h
index bf2d59a..a4b82ad 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_outline_type.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_outline_type.h
@@ -9,10 +9,20 @@
 
 // Outline styles
 enum class NGOutlineType {
-  kDontIncludeBlockVisualOverflow,  // Standard outline
-  kIncludeBlockVisualOverflow,      // Focus outline
+  kDontIncludeBlockVisualOverflow,       // Standard outline
+  kIncludeBlockVisualOverflow,           // Focus outline
+  kIncludeBlockVisualOverflowForAnchor,  // Focus outline for anchor
 };
 
+inline bool ShouldIncludeBlockVisualOverflow(NGOutlineType type) {
+  return type == NGOutlineType::kIncludeBlockVisualOverflow ||
+         type == NGOutlineType::kIncludeBlockVisualOverflowForAnchor;
+}
+
+inline bool ShouldIncludeBlockVisualOverflowForAnchorOnly(NGOutlineType type) {
+  return type == NGOutlineType::kIncludeBlockVisualOverflowForAnchor;
+}
+
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_NG_OUTLINE_TYPE_H_
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 71f407d..6bb3b40 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
@@ -1320,6 +1320,11 @@
       *info = LayoutObject::OutlineInfo::GetFromStyle(Style());
   }
 
+  if (ShouldIncludeBlockVisualOverflow(outline_type) &&
+      IsA<HTMLAnchorElement>(GetNode())) {
+    outline_type = NGOutlineType::kIncludeBlockVisualOverflowForAnchor;
+  }
+
   AddOutlineRects(additional_offset, outline_type,
                   /* container_relative */ false, outline_rects);
 }
@@ -1358,7 +1363,7 @@
     }
   }
 
-  if (outline_type == NGOutlineType::kIncludeBlockVisualOverflow &&
+  if (ShouldIncludeBlockVisualOverflow(outline_type) &&
       !HasNonVisibleOverflow() && !HasControlClip(*this)) {
     // Tricky code ahead: we pass a 0,0 additional_offset to
     // AddOutlineRectsForNormalChildren, and add it in after the call.
@@ -1375,8 +1380,13 @@
            base::make_span(*outline_rects).subspan(size_before))
         rect.offset += additional_offset;
     }
-    for (const auto& child : PostLayoutChildren()) {
-      if (child->IsOutOfFlowPositioned()) {
+
+    if (ShouldIncludeBlockVisualOverflowForAnchorOnly(outline_type)) {
+      for (const auto& child : PostLayoutChildren()) {
+        if (!child->IsOutOfFlowPositioned()) {
+          continue;
+        }
+
         AddOutlineRectsForDescendant(
             child, outline_rects, additional_offset, outline_type,
             To<LayoutBoxModelObject>(GetLayoutObject()));
@@ -1448,11 +1458,35 @@
   // Adjust the rectangles using |additional_offset| and |container_relative|.
   if (!container_relative)
     additional_offset -= this_offset_in_container;
-  if (additional_offset.IsZero())
-    return;
-  for (PhysicalRect& rect :
-       base::make_span(rects->begin() + initial_rects_size, rects->end()))
-    rect.offset += additional_offset;
+  if (!additional_offset.IsZero()) {
+    for (PhysicalRect& rect :
+         base::make_span(rects->begin() + initial_rects_size, rects->end())) {
+      rect.offset += additional_offset;
+    }
+  }
+
+  if (ShouldIncludeBlockVisualOverflowForAnchorOnly(outline_type) &&
+      !HasNonVisibleOverflow() && !HasControlClip(*this)) {
+    if (container->IsAnonymousBlock()) {
+      // TODO(crbug.com/1380673): Just picking the first fragment isn't right.
+      container =
+          To<LayoutBox>(container->GetLayoutObject()->NonAnonymousAncestor())
+              ->GetPhysicalFragment(0);
+      DCHECK(container);
+    }
+
+    for (const auto& child : container->PostLayoutChildren()) {
+      if (!child->IsOutOfFlowPositioned() ||
+          child->GetLayoutObject()->ContainerForAbsolutePosition() !=
+              layout_object) {
+        continue;
+      }
+
+      AddOutlineRectsForDescendant(child, rects, additional_offset,
+                                   outline_type,
+                                   To<LayoutBoxModelObject>(layout_object));
+    }
+  }
 }
 
 PositionWithAffinity NGPhysicalBoxFragment::PositionForPoint(
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
index 6b3d8a52..e498883 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
@@ -853,8 +853,9 @@
       }
       case NGFragmentItem::kGeneratedText:
       case NGFragmentItem::kText: {
-        if (outline_type == NGOutlineType::kDontIncludeBlockVisualOverflow)
+        if (!ShouldIncludeBlockVisualOverflow(outline_type)) {
           break;
+        }
         PhysicalRect rect = item.RectInContainerFragment();
         if (UNLIKELY(text_combine))
           rect = text_combine->AdjustRectForBoundingBox(rect);
diff --git a/third_party/blink/renderer/core/layout/order_iterator.h b/third_party/blink/renderer/core/layout/order_iterator.h
index 4b9dc6b..b06142c 100644
--- a/third_party/blink/renderer/core/layout/order_iterator.h
+++ b/third_party/blink/renderer/core/layout/order_iterator.h
@@ -31,6 +31,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_ORDER_ITERATOR_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_ORDER_ITERATOR_H_
 
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/heap/member.h"
 #include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
@@ -77,7 +78,8 @@
 
   Member<LayoutBox> current_child_;
 
-  using OrderValues = std::set<int>;
+  using OrderValues ALLOW_DISCOURAGED_TYPE("TODO(crbug.com/1404327") =
+      std::set<int>;
   OrderValues order_values_;
   OrderValues::const_iterator order_values_iterator_;
   // Set by |Reset()|, triggers iteration to start from the beginning.
diff --git a/third_party/blink/renderer/core/loader/frame_loader_test.cc b/third_party/blink/renderer/core/loader/frame_loader_test.cc
index 2a7dbc83..d0f7c2d 100644
--- a/third_party/blink/renderer/core/loader/frame_loader_test.cc
+++ b/third_party/blink/renderer/core/loader/frame_loader_test.cc
@@ -164,7 +164,8 @@
   local_frame->Loader().CommitNavigation(std::move(params), nullptr);
 
   EXPECT_EQ(*mojom::blink::PolicyContainerPolicies::New(
-                network::mojom::CrossOriginEmbedderPolicyValue::kNone,
+                network::CrossOriginEmbedderPolicy(
+                    network::mojom::CrossOriginEmbedderPolicyValue::kNone),
                 network::mojom::ReferrerPolicy::kAlways,
                 Vector<network::mojom::blink::ContentSecurityPolicyPtr>(),
                 /*anonymous=*/false, network::mojom::WebSandboxFlags::kNone,
diff --git a/third_party/blink/renderer/core/paint/timing/image_paint_timing_detector.h b/third_party/blink/renderer/core/paint/timing/image_paint_timing_detector.h
index 2ec47f5a..413176e9 100644
--- a/third_party/blink/renderer/core/paint/timing/image_paint_timing_detector.h
+++ b/third_party/blink/renderer/core/paint/timing/image_paint_timing_detector.h
@@ -16,6 +16,7 @@
 #include "third_party/blink/renderer/core/dom/dom_node_ids.h"
 #include "third_party/blink/renderer/core/loader/resource/image_resource_content.h"
 #include "third_party/blink/renderer/core/paint/timing/paint_timing_detector.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/loader/fetch/media_timing.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
 #include "third_party/blink/renderer/platform/wtf/hash_set.h"
@@ -105,7 +106,7 @@
 
   using NodesQueueComparator = bool (*)(const base::WeakPtr<ImageRecord>&,
                                         const base::WeakPtr<ImageRecord>&);
-  using ImageRecordSet =
+  using ImageRecordSet ALLOW_DISCOURAGED_TYPE("TODO(crbug.com/1404327") =
       std::set<base::WeakPtr<ImageRecord>, NodesQueueComparator>;
 
  public:
diff --git a/third_party/blink/renderer/core/permissions_policy/permissions_policy_parser.cc b/third_party/blink/renderer/core/permissions_policy/permissions_policy_parser.cc
index 6c1bfdae..311a1ba9 100644
--- a/third_party/blink/renderer/core/permissions_policy/permissions_policy_parser.cc
+++ b/third_party/blink/renderer/core/permissions_policy/permissions_policy_parser.cc
@@ -17,6 +17,7 @@
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/frame/web_feature.h"
 #include "third_party/blink/renderer/core/origin_trials/origin_trial_context.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/json/json_values.h"
 #include "third_party/blink/renderer/platform/network/http_parsers.h"
@@ -115,7 +116,8 @@
       const OriginWithPossibleWildcards::NodeType type);
 
   struct ParsedAllowlist {
-    std::vector<blink::OriginWithPossibleWildcards> allowed_origins;
+    std::vector<blink::OriginWithPossibleWildcards> allowed_origins
+        ALLOW_DISCOURAGED_TYPE("Permission policy uses STL for code sharing");
     bool matches_all_origins{false};
     bool matches_opaque_src{false};
 
diff --git a/third_party/blink/renderer/core/svg/svg_length_context.cc b/third_party/blink/renderer/core/svg/svg_length_context.cc
index c157e47..f456d5d9 100644
--- a/third_party/blink/renderer/core/svg/svg_length_context.cc
+++ b/third_party/blink/renderer/core/svg/svg_length_context.cc
@@ -222,6 +222,17 @@
          style->EffectiveZoom();
 }
 
+float ConvertValueFromUserUnitsToLHS(const ComputedStyle* style, float value) {
+  return value / AdjustForAbsoluteZoom::AdjustFloat(style->ComputedLineHeight(),
+                                                    *style);
+}
+
+static float ConvertValueFromLHSToUserUnits(const ComputedStyle* style,
+                                            float value) {
+  return value * AdjustForAbsoluteZoom::AdjustFloat(style->ComputedLineHeight(),
+                                                    *style);
+}
+
 static inline float ViewportLengthPercent(const float width_or_height) {
   return width_or_height / 100;
 }
@@ -463,7 +474,12 @@
           ConvertValueFromICSToUserUnits(RootElementStyle(context_), value);
       break;
     case CSSPrimitiveValue::UnitType::kLhs:
-      user_units = ConvertValueFromLHSToUserUnits(value);
+      user_units = ConvertValueFromLHSToUserUnits(
+          ComputedStyleForLengthResolving(context_), value);
+      break;
+    case CSSPrimitiveValue::UnitType::kRlhs:
+      user_units =
+          ConvertValueFromLHSToUserUnits(RootElementStyle(context_), value);
       break;
     case CSSPrimitiveValue::UnitType::kViewportWidth:
     case CSSPrimitiveValue::UnitType::kViewportHeight:
@@ -534,7 +550,10 @@
     case CSSPrimitiveValue::UnitType::kRics:
       return ConvertValueFromUserUnitsToICS(RootElementStyle(context_), value);
     case CSSPrimitiveValue::UnitType::kLhs:
-      return ConvertValueFromUserUnitsToLHS(value);
+      return ConvertValueFromUserUnitsToLHS(
+          ComputedStyleForLengthResolving(context_), value);
+    case CSSPrimitiveValue::UnitType::kRlhs:
+      return ConvertValueFromUserUnitsToLHS(RootElementStyle(context_), value);
     case CSSPrimitiveValue::UnitType::kCentimeters:
       return value / kCssPixelsPerCentimeter;
     case CSSPrimitiveValue::UnitType::kMillimeters:
@@ -568,18 +587,6 @@
   return 0;
 }
 
-float SVGLengthContext::ConvertValueFromUserUnitsToLHS(float value) const {
-  const ComputedStyle* style = ComputedStyleForLengthResolving(context_);
-  return value / AdjustForAbsoluteZoom::AdjustFloat(style->ComputedLineHeight(),
-                                                    *style);
-}
-
-float SVGLengthContext::ConvertValueFromLHSToUserUnits(float value) const {
-  const ComputedStyle* style = ComputedStyleForLengthResolving(context_);
-  return value * AdjustForAbsoluteZoom::AdjustFloat(style->ComputedLineHeight(),
-                                                    *style);
-}
-
 bool SVGLengthContext::DetermineViewport(gfx::SizeF& viewport_size) const {
   if (!context_) {
     return false;
diff --git a/third_party/blink/renderer/core/svg/svg_length_context.h b/third_party/blink/renderer/core/svg/svg_length_context.h
index 105b5da..b37cc02 100644
--- a/third_party/blink/renderer/core/svg/svg_length_context.h
+++ b/third_party/blink/renderer/core/svg/svg_length_context.h
@@ -97,9 +97,6 @@
   float ValueForLength(const Length&, float zoom, SVGLengthMode) const;
   static float ValueForLength(const Length&, float zoom, float dimension);
 
-  float ConvertValueFromUserUnitsToLHS(float value) const;
-  float ConvertValueFromLHSToUserUnits(float value) const;
-
   const SVGElement* context_;
 };
 
diff --git a/third_party/blink/renderer/core/url_pattern/url_pattern_parser.h b/third_party/blink/renderer/core/url_pattern/url_pattern_parser.h
index 2afc1fb..a4ea7cad 100644
--- a/third_party/blink/renderer/core/url_pattern/url_pattern_parser.h
+++ b/third_party/blink/renderer/core/url_pattern/url_pattern_parser.h
@@ -8,6 +8,7 @@
 #include <vector>
 
 #include "base/types/strong_alias.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_utf8_adaptor.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
@@ -171,7 +172,8 @@
 
   // The list of Tokens produced by calling `liburlpattern::Tokenize()` on
   // `input_`.
-  std::vector<liburlpattern::Token> token_list_;
+  std::vector<liburlpattern::Token> token_list_
+      ALLOW_DISCOURAGED_TYPE("liburlpattern uses STL types");
 
   // The index of the first Token to include in the component string.
   size_t component_start_ = 0;
diff --git a/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.h b/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.h
index dda5ee0..0c7093b 100644
--- a/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.h
+++ b/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.h
@@ -11,6 +11,7 @@
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/layout/geometry/physical_rect.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/geometry/layout_size.h"
 #include "third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.h"
 #include "third_party/blink/renderer/platform/graphics/view_transition_shared_element_id.h"
@@ -304,7 +305,8 @@
 
   // This vector is passed as constructed to cc's view transition request,
   // so this uses the std::vector for that reason, instead of WTF::Vector.
-  std::vector<viz::ViewTransitionElementResourceId> capture_resource_ids_;
+  std::vector<viz::ViewTransitionElementResourceId> capture_resource_ids_
+      ALLOW_DISCOURAGED_TYPE("cc API uses STL types");
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/ml/ml_model_loader_test.cc b/third_party/blink/renderer/modules/ml/ml_model_loader_test.cc
index 9311ff9..e555401b 100644
--- a/third_party/blink/renderer/modules/ml/ml_model_loader_test.cc
+++ b/third_party/blink/renderer/modules/ml/ml_model_loader_test.cc
@@ -236,6 +236,16 @@
         ml_output);
   }
 
+  void SetComputeFailure(const blink_mojom::ComputeResult result) {
+    compute_ = WTF::BindOnce(
+        [](const blink_mojom::ComputeResult result,
+           const WTF::HashMap<WTF::String, WTF::Vector<uint8_t>>&,
+           blink_mojom::Model::ComputeCallback callback) {
+          std::move(callback).Run(result, {});
+        },
+        result);
+  }
+
  private:
   blink_mojom::ModelInfoPtr info_;
   ComputeFn compute_;
@@ -472,4 +482,109 @@
   }
 }
 
+TEST_F(MLModelLoaderTest, ComputeFailures) {
+  V8TestingScope scope;
+  ScopedSetMLServiceBinder scoped_setup_binder(&service_, scope);
+  service_.SetCreateModelLoader(loader_.CreateFromThis());
+  loader_.SetLoad(model_.CreateFromInfo(
+      {{"in",
+        TensorInfo{
+            .byte_size = 16,
+            .data_type = blink_mojom::DataType::kUint8,
+            .dimensions = WTF::Vector<uint32_t>{4, 4},
+        }}},
+      {{"out", TensorInfo{
+                   .byte_size = 4,
+                   .data_type = blink_mojom::DataType::kFloat32,
+                   .dimensions = WTF::Vector<uint32_t>{1},
+               }}}));
+
+  auto* ml_model_loader = CreateTestLoader(scope);
+  ASSERT_TRUE(ml_model_loader);
+
+  auto promise = ml_model_loader->load(scope.GetScriptState(),
+                                       DOMArrayBuffer::Create(1u, 1u),
+                                       scope.GetExceptionState());
+  EXPECT_FALSE(scope.GetExceptionState().HadException());
+
+  auto tester = ScriptPromiseTester(scope.GetScriptState(), promise);
+  tester.WaitUntilSettled();
+  EXPECT_TRUE(tester.IsFulfilled());
+
+  auto* ml_model = ScriptValueToMLModel(tester.Value());
+  EXPECT_TRUE(ml_model);
+
+  HeapVector<std::pair<String, Member<MLTensor>>> inputs;
+  inputs.emplace_back(WTF::String("in"),
+                      TensorInfo{.byte_size = 16,
+                                 .data_type = blink_mojom::DataType::kUint8,
+                                 .dimensions = WTF::Vector<uint32_t>{4, 4}}
+                          .ToMLTensor());
+
+  {
+    // No computation result (e.g. due to a backend failure).
+    model_.SetComputeFailure(blink_mojom::ComputeResult::kUnknownError);
+
+    auto compute_promise = ml_model->compute(scope.GetScriptState(), inputs,
+                                             scope.GetExceptionState());
+    EXPECT_FALSE(scope.GetExceptionState().HadException());
+
+    auto compute_tester =
+        ScriptPromiseTester(scope.GetScriptState(), compute_promise);
+    compute_tester.WaitUntilSettled();
+    EXPECT_TRUE(compute_tester.IsRejected());
+    EXPECT_EQ(ScriptValueToDOMExceptionName(compute_tester.Value()),
+              DOMException::GetErrorName(DOMExceptionCode::kOperationError));
+  }
+
+  {
+    // Output tensor count mismatch.
+    model_.SetComputeResult(
+        {{"out1", CreateByteVector(4)}, {"out2", CreateByteVector(4)}});
+
+    auto compute_promise = ml_model->compute(scope.GetScriptState(), inputs,
+                                             scope.GetExceptionState());
+    EXPECT_FALSE(scope.GetExceptionState().HadException());
+
+    auto compute_tester =
+        ScriptPromiseTester(scope.GetScriptState(), compute_promise);
+    compute_tester.WaitUntilSettled();
+    EXPECT_TRUE(compute_tester.IsRejected());
+    EXPECT_EQ(ScriptValueToDOMExceptionName(compute_tester.Value()),
+              DOMException::GetErrorName(DOMExceptionCode::kUnknownError));
+  }
+
+  {
+    // Output tensor name mismatch.
+    model_.SetComputeResult({{"a_different_out_name", CreateByteVector(4)}});
+
+    auto compute_promise = ml_model->compute(scope.GetScriptState(), inputs,
+                                             scope.GetExceptionState());
+    EXPECT_FALSE(scope.GetExceptionState().HadException());
+
+    auto compute_tester =
+        ScriptPromiseTester(scope.GetScriptState(), compute_promise);
+    compute_tester.WaitUntilSettled();
+    EXPECT_TRUE(compute_tester.IsRejected());
+    EXPECT_EQ(ScriptValueToDOMExceptionName(compute_tester.Value()),
+              DOMException::GetErrorName(DOMExceptionCode::kUnknownError));
+  }
+
+  {
+    // Output tensor byteLength mismatch.
+    model_.SetComputeResult({{"out", CreateByteVector(8)}});
+
+    auto compute_promise = ml_model->compute(scope.GetScriptState(), inputs,
+                                             scope.GetExceptionState());
+    EXPECT_FALSE(scope.GetExceptionState().HadException());
+
+    auto compute_tester =
+        ScriptPromiseTester(scope.GetScriptState(), compute_promise);
+    compute_tester.WaitUntilSettled();
+    EXPECT_TRUE(compute_tester.IsRejected());
+    EXPECT_EQ(ScriptValueToDOMExceptionName(compute_tester.Value()),
+              DOMException::GetErrorName(DOMExceptionCode::kUnknownError));
+  }
+}
+
 }  // namespace blink
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 478d52f8..754249519 100644
--- a/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc
+++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc
@@ -733,6 +733,7 @@
 void PeerConnectionTracker::Bind(
     mojo::PendingReceiver<blink::mojom::blink::PeerConnectionManager>
         receiver) {
+  DCHECK_CALLED_ON_VALID_THREAD(main_thread_);
   DCHECK(!receiver_.is_bound());
   receiver_.Bind(std::move(receiver), GetSupplementable()->GetTaskRunner(
                                           TaskType::kMiscPlatformAPI));
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn
index e7b1c1a..02e206c 100644
--- a/third_party/blink/renderer/platform/BUILD.gn
+++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -158,6 +158,15 @@
     "//third_party/blink/renderer:config",
     "//third_party/blink/renderer:inside_blink",
   ]
+  cflags = []
+  if (is_clang && clang_use_chrome_plugins) {
+    cflags += [
+      "-Xclang",
+      "-plugin-arg-find-bad-constructs",
+      "-Xclang",
+      "check-blink-data-member-type",
+    ]
+  }
 }
 
 # Deps and configs required to include platform headers. Applied to all
@@ -271,6 +280,13 @@
   ]
 }
 
+source_set("allow_discouraged_type") {
+  sources = [ "allow_discouraged_type.h" ]
+
+  visibility = []  # Allow re-assignment of list.
+  visibility = [ "//third_party/blink/renderer/platform/*" ]
+}
+
 component("platform") {
   visibility = []  # Allow re-assignment of list.
   visibility = [
@@ -1653,6 +1669,7 @@
   ]
 
   public_deps = [
+    ":allow_discouraged_type",
     ":blink_platform_public_deps",
     ":platform_export",
     "//gpu/command_buffer/client:raster_interface",
diff --git a/third_party/blink/renderer/platform/allow_discouraged_type.h b/third_party/blink/renderer/platform/allow_discouraged_type.h
new file mode 100644
index 0000000..f463eac
--- /dev/null
+++ b/third_party/blink/renderer/platform/allow_discouraged_type.h
@@ -0,0 +1,15 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_ALLOW_DISCOURAGED_TYPE_H_
+#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_ALLOW_DISCOURAGED_TYPE_H_
+
+#if defined(__clang__)
+#define ALLOW_DISCOURAGED_TYPE(reason) \
+  __attribute__((annotate("allow_discouraged_type")))
+#else  // !defined(__clang__)
+#define ALLOW_DISCOURAGED_TYPE(reason)
+#endif  // !defined(__clang__)
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_ALLOW_DISCOURAGED_TYPE_H_
diff --git a/third_party/blink/renderer/platform/disk_data_allocator.cc b/third_party/blink/renderer/platform/disk_data_allocator.cc
index 6d42902d..2b7ae87a 100644
--- a/third_party/blink/renderer/platform/disk_data_allocator.cc
+++ b/third_party/blink/renderer/platform/disk_data_allocator.cc
@@ -16,9 +16,7 @@
 
 namespace blink {
 
-DiskDataAllocator::DiskDataAllocator()
-    : free_chunks_size_(0), file_tail_(0), may_write_(false) {}
-
+DiskDataAllocator::DiskDataAllocator() = default;
 DiskDataAllocator::~DiskDataAllocator() = default;
 
 bool DiskDataAllocator::may_write() {
diff --git a/third_party/blink/renderer/platform/disk_data_allocator.h b/third_party/blink/renderer/platform/disk_data_allocator.h
index 26089f1..aeb331f 100644
--- a/third_party/blink/renderer/platform/disk_data_allocator.h
+++ b/third_party/blink/renderer/platform/disk_data_allocator.h
@@ -14,6 +14,7 @@
 #include "base/synchronization/lock.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "third_party/blink/public/mojom/disk_allocator.mojom-blink.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/blink/renderer/platform/wtf/threading.h"
 #include "third_party/blink/renderer/platform/wtf/threading_primitives.h"
@@ -95,19 +96,20 @@
 
  protected:  // For testing.
   base::Lock lock_;
-  // Using a std::map because we rely on |{lower,upper}_bound()|.
-  std::map<int64_t, size_t> free_chunks_ GUARDED_BY(lock_);
-  size_t free_chunks_size_ GUARDED_BY(lock_);
+  std::map<int64_t, size_t> free_chunks_ GUARDED_BY(lock_)
+      ALLOW_DISCOURAGED_TYPE("We rely on |{lower,upper}_bound()|");
+  size_t free_chunks_size_ GUARDED_BY(lock_) = 0;
 
  private:
-  int64_t file_tail_ GUARDED_BY(lock_);
+  int64_t file_tail_ GUARDED_BY(lock_) = 0;
   // Whether writing is possible now. This can be true if:
   // - |set_may_write_for_testing()| was called, or
   // - |file_.IsValid()| and no write error occurred (which would set
   //   |may_write_| to false).
-  bool may_write_ GUARDED_BY(lock_);
+  bool may_write_ GUARDED_BY(lock_) = false;
 #if DCHECK_IS_ON()
-  std::map<int64_t, size_t> allocated_chunks_ GUARDED_BY(lock_);
+  std::map<int64_t, size_t> allocated_chunks_ GUARDED_BY(lock_)
+      ALLOW_DISCOURAGED_TYPE("We rely on |{lower,upper}_bound()|");
 #endif
 
   FRIEND_TEST_ALL_PREFIXES(DiskDataAllocatorTest, ProvideInvalidFile);
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_controller.h b/third_party/blink/renderer/platform/graphics/paint/paint_controller.h
index 9e709041..6df8df25 100644
--- a/third_party/blink/renderer/platform/graphics/paint/paint_controller.h
+++ b/third_party/blink/renderer/platform/graphics/paint/paint_controller.h
@@ -396,8 +396,8 @@
   // CommitNewDisplayItems().
   scoped_refptr<PaintArtifact> new_paint_artifact_;
   PaintChunker paint_chunker_;
-  WeakPersistent<HeapVector<Member<const DisplayItemClient>>>
-      clients_to_validate_ = nullptr;
+  Persistent<HeapVector<Member<const DisplayItemClient>>> clients_to_validate_ =
+      nullptr;
 
   bool cache_is_all_invalid_ = true;
   bool committed_ = false;
diff --git a/third_party/blink/renderer/platform/image-decoders/DEPS b/third_party/blink/renderer/platform/image-decoders/DEPS
index acdf99dc..713eb8b4 100644
--- a/third_party/blink/renderer/platform/image-decoders/DEPS
+++ b/third_party/blink/renderer/platform/image-decoders/DEPS
@@ -10,6 +10,7 @@
     "+cc/base/math_util.h",
     "+cc/paint/image_animation_count.h",
     "+media",
+    "+third_party/blink/renderer/platform/allow_discouraged_type.h",
     "+third_party/blink/renderer/platform/geometry",
     "+third_party/blink/renderer/platform/graphics",
     "+third_party/blink/renderer/platform/instrumentation/histogram.h",
diff --git a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.h b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.h
index c846c800c..ef7ad34 100644
--- a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.h
+++ b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.h
@@ -7,7 +7,9 @@
 
 #include <memory>
 
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/image-decoders/image_decoder.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
 #include "third_party/libavif/src/include/avif/avif.h"
 #include "third_party/skia/include/core/SkImageInfo.h"
 #include "ui/gfx/color_space.h"
@@ -56,7 +58,7 @@
  private:
   struct AvifIOData {
     blink::SegmentReader* reader = nullptr;
-    std::vector<uint8_t> buffer;
+    std::vector<uint8_t> buffer ALLOW_DISCOURAGED_TYPE("Required by libavif");
     bool all_data_received = false;
   };
 
@@ -124,7 +126,7 @@
   const AnimationOption animation_option_;
 
   // Used temporarily during incremental decoding.
-  std::vector<uint32_t> previous_last_decoded_row_;
+  Vector<uint32_t> previous_last_decoded_row_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/BUILD.gn b/third_party/blink/renderer/platform/loader/BUILD.gn
index 2db049b8..5588f802 100644
--- a/third_party/blink/renderer/platform/loader/BUILD.gn
+++ b/third_party/blink/renderer/platform/loader/BUILD.gn
@@ -172,6 +172,7 @@
     "//third_party/blink/public/common:buildflags",
     "//third_party/blink/public/common:headers",
     "//third_party/blink/public/mojom:mojom_platform_blink",
+    "//third_party/blink/renderer/platform:allow_discouraged_type",
     "//third_party/blink/renderer/platform/blob:blob",
     "//third_party/blink/renderer/platform/instrumentation:instrumentation",
     "//third_party/blink/renderer/platform/network:network",
diff --git a/third_party/blink/renderer/platform/loader/DEPS b/third_party/blink/renderer/platform/loader/DEPS
index 4e75f7f..e75fc2b 100644
--- a/third_party/blink/renderer/platform/loader/DEPS
+++ b/third_party/blink/renderer/platform/loader/DEPS
@@ -15,6 +15,7 @@
     "+net/url_request/redirect_info.h",
     "+services/metrics/public", # for UKM API
     "+services/network/public",  # for Fetch API and CORS
+    "+third_party/blink/renderer/platform/allow_discouraged_type.h",
     "+third_party/blink/renderer/platform/back_forward_cache_buffer_limit_tracker.h",
     "+third_party/blink/renderer/platform/back_forward_cache_utils.h",
     "+third_party/blink/renderer/platform/bindings/dom_wrapper_world.h",
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource.h b/third_party/blink/renderer/platform/loader/fetch/resource.h
index 52c0d8fb..91ca810 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource.h
+++ b/third_party/blink/renderer/platform/loader/fetch/resource.h
@@ -34,6 +34,7 @@
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/blink/public/mojom/loader/code_cache.mojom-blink-forward.h"
 #include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/bindings/parkable_string.h"
 #include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_counted_set.h"
 #include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h"
@@ -581,7 +582,8 @@
   // current origin which it is already partitioned by).
   // TODO(crbug.com/1127971): Remove this once the decision is made to partition
   // the cache using either Network Isolation Key or scoped to per-document.
-  std::set<net::SchemefulSite> existing_top_frame_sites_in_cache_;
+  std::set<net::SchemefulSite> existing_top_frame_sites_in_cache_
+      ALLOW_DISCOURAGED_TYPE("TODO(crbug.com/1404327)");
 };
 
 class ResourceFactory {
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.h b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.h
index 914ae88..5d453a908 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.h
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.h
@@ -11,6 +11,7 @@
 #include "base/time/time.h"
 #include "base/types/strong_alias.h"
 #include "net/http/http_response_info.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_map.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource.h"
@@ -371,11 +372,12 @@
   // This tracks two sets of requests, throttleable and stoppable.
   std::map<ThrottleOption,
            std::set<ClientIdWithPriority, ClientIdWithPriority::Compare>>
-      pending_requests_;
+      pending_requests_ ALLOW_DISCOURAGED_TYPE("TODO(crbug.com/1404327)");
 
   // Remembers elapsed times in seconds when the top request in each queue is
   // processed.
-  std::map<ThrottleOption, base::Time> pending_queue_update_times_;
+  std::map<ThrottleOption, base::Time> pending_queue_update_times_
+      ALLOW_DISCOURAGED_TYPE("TODO(crbug.com/1404327)");
 
   // Handle to throttling observer.
   std::unique_ptr<FrameOrWorkerScheduler::LifecycleObserverHandle>
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.cc
index 331ed11..81b1cf2 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.cc
@@ -32,6 +32,7 @@
 #include "third_party/blink/renderer/platform/wtf/cross_thread_copier_std.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
 #include "third_party/blink/renderer/platform/wtf/wtf.h"
 #include "third_party/ced/src/compact_enc_det/compact_enc_det.h"
 
@@ -142,13 +143,13 @@
     DCHECK(reader_task_runner_->RunsTasksInCurrentSequence());
   }
 
-  std::vector<DataChunk> TakeData(size_t max_data_to_process) {
+  Vector<DataChunk> TakeData(size_t max_data_to_process) {
     DCHECK(IsMainThread());
     base::AutoLock lock(lock_);
     if (max_data_to_process == 0)
       return std::move(data_chunks_);
 
-    std::vector<DataChunk> data;
+    Vector<DataChunk> data;
     size_t data_processed = 0;
     while (!data_chunks_.empty() && data_processed < max_data_to_process) {
       data.emplace_back(std::move(data_chunks_.front()));
@@ -281,7 +282,7 @@
   bool background_callback_set_ = false;
   Client::ProcessBackgroundDataCallback process_background_data_callback_
       GUARDED_BY(lock_);
-  std::vector<DataChunk> data_chunks_ GUARDED_BY(lock_);
+  Vector<DataChunk> data_chunks_ GUARDED_BY(lock_);
 };
 
 void NavigationBodyLoader::OffThreadBodyReaderDeleter::operator()(
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_response.h b/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_response.h
index e9fa8608..92c1d3e 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_response.h
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_response.h
@@ -12,6 +12,7 @@
 #include "third_party/blink/public/mojom/blob/serialized_blob.mojom.h"
 #include "third_party/blink/public/platform/web_common.h"
 #include "third_party/blink/public/platform/web_data.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "url/gurl.h"
 
 namespace blink {
@@ -48,7 +49,7 @@
   // the case of a server redirect.
   // Use GURL to avoid extra conversion between KURL and GURL because non-blink
   // types are allowed for loader here.
-  GURL url;
+  GURL url ALLOW_DISCOURAGED_TYPE("Avoids conversion in loading code");
 
   // The response data.
   WebData data;
diff --git a/third_party/blink/renderer/platform/media/BUILD.gn b/third_party/blink/renderer/platform/media/BUILD.gn
index 71f2cb5..27bc5d5 100644
--- a/third_party/blink/renderer/platform/media/BUILD.gn
+++ b/third_party/blink/renderer/platform/media/BUILD.gn
@@ -78,6 +78,7 @@
     "//services/network/public/cpp",
     "//third_party/blink/public/common",
     "//third_party/blink/public/mojom:mojom_platform",
+    "//third_party/blink/renderer/platform:allow_discouraged_type",
   ]
 
   if (media_use_ffmpeg || !is_android) {
diff --git a/third_party/blink/renderer/platform/media/DEPS b/third_party/blink/renderer/platform/media/DEPS
index 4abb92c..722a110 100644
--- a/third_party/blink/renderer/platform/media/DEPS
+++ b/third_party/blink/renderer/platform/media/DEPS
@@ -33,6 +33,7 @@
   "+net/http/http_version.h",
   "+services/device/public/mojom",
   "+services/media_session/public/cpp",
+  "+third_party/blink/renderer/platform/allow_discouraged_type.h",
   "+third_party/blink/renderer/platform/platform_export.h",
   "+third_party/blink/renderer/platform/wtf",
 ]
diff --git a/third_party/blink/renderer/platform/media/multi_buffer_data_source.h b/third_party/blink/renderer/platform/media/multi_buffer_data_source.h
index 9258088..6830850 100644
--- a/third_party/blink/renderer/platform/media/multi_buffer_data_source.h
+++ b/third_party/blink/renderer/platform/media/multi_buffer_data_source.h
@@ -8,7 +8,6 @@
 #include <stdint.h>
 
 #include <memory>
-#include <vector>
 
 #include "base/callback.h"
 #include "base/memory/weak_ptr.h"
@@ -19,6 +18,7 @@
 #include "media/base/tuneable.h"
 #include "third_party/blink/public/platform/media/url_index.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
 #include "url/gurl.h"
 
 namespace base {
@@ -198,7 +198,7 @@
   // Places we might want to seek to. After each read we add another
   // location here, and when SeekTask() is called, it picks the best
   // position and then clears it out.
-  std::vector<int64_t> seek_positions_;
+  Vector<int64_t> seek_positions_;
 
   // This value will be true if this data source can only support streaming.
   // i.e. range request is not supported.
diff --git a/third_party/blink/renderer/platform/media/resource_multi_buffer_data_provider.h b/third_party/blink/renderer/platform/media/resource_multi_buffer_data_provider.h
index 4fd0033..39a79f09 100644
--- a/third_party/blink/renderer/platform/media/resource_multi_buffer_data_provider.h
+++ b/third_party/blink/renderer/platform/media/resource_multi_buffer_data_provider.h
@@ -18,6 +18,7 @@
 #include "third_party/blink/public/platform/web_url_request.h"
 #include "third_party/blink/public/web/web_associated_url_loader_client.h"
 #include "third_party/blink/public/web/web_frame.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "url/gurl.h"
 
@@ -109,14 +110,14 @@
 
   // The origin for the initial request.
   // const to make it obvious that redirects cannot change it.
-  const GURL origin_;
+  const GURL origin_ ALLOW_DISCOURAGED_TYPE("Avoids conversion in media code");
 
   // Keeps track of an active WebAssociatedURLLoader.
   // Only valid while loading resource.
   std::unique_ptr<WebAssociatedURLLoader> active_loader_;
 
   // When we encounter a redirect, this is the source of the redirect.
-  GURL redirects_to_;
+  GURL redirects_to_ ALLOW_DISCOURAGED_TYPE("Avoids conversion in media code");
 
   // If the server tries to gives us more bytes than we want, this how
   // many bytes we need to discard before we get to the right place.
diff --git a/third_party/blink/renderer/platform/media/web_media_player_impl.h b/third_party/blink/renderer/platform/media/web_media_player_impl.h
index 51eac1db..b54e661 100644
--- a/third_party/blink/renderer/platform/media/web_media_player_impl.h
+++ b/third_party/blink/renderer/platform/media/web_media_player_impl.h
@@ -52,6 +52,7 @@
 #include "third_party/blink/public/platform/web_media_player.h"
 #include "third_party/blink/public/platform/web_surface_layer_bridge.h"
 #include "third_party/blink/public/web/modules/media/webmediaplayer_util.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/media/learning_experiment_helper.h"
 #include "third_party/blink/renderer/platform/media/multi_buffer_data_source.h"
 #include "third_party/blink/renderer/platform/media/smoothness_helper.h"
@@ -928,7 +929,7 @@
   // used for, for example, data URLs.
   // Used for HLS playback and in certain fallback paths (e.g. on older devices
   // that can't support the unified media pipeline).
-  GURL loaded_url_;
+  GURL loaded_url_ ALLOW_DISCOURAGED_TYPE("Avoids conversion in media code");
 
   // NOTE: |using_media_player_renderer_| is set based on the usage of a
   // MediaResource::Type::URL in StartPipeline(). This works because
diff --git a/third_party/blink/renderer/platform/mediastream/transferred_media_stream_component.cc b/third_party/blink/renderer/platform/mediastream/transferred_media_stream_component.cc
index 7b8e9d2..7ef22969 100644
--- a/third_party/blink/renderer/platform/mediastream/transferred_media_stream_component.cc
+++ b/third_party/blink/renderer/platform/mediastream/transferred_media_stream_component.cc
@@ -248,6 +248,7 @@
 
 void TransferredMediaStreamComponent::Trace(Visitor* visitor) const {
   visitor->Trace(component_);
+  visitor->Trace(observers_);
   MediaStreamComponent::Trace(visitor);
 }
 
diff --git a/third_party/blink/renderer/platform/mediastream/transferred_media_stream_component.h b/third_party/blink/renderer/platform/mediastream/transferred_media_stream_component.h
index 0d82fcf..1ab5c3b 100644
--- a/third_party/blink/renderer/platform/mediastream/transferred_media_stream_component.h
+++ b/third_party/blink/renderer/platform/mediastream/transferred_media_stream_component.h
@@ -9,10 +9,12 @@
 
 #include "third_party/blink/public/platform/modules/mediastream/web_media_stream_track.h"
 #include "third_party/blink/renderer/platform/audio/audio_source_provider.h"
+#include "third_party/blink/renderer/platform/heap/collection_support/heap_vector.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_component.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_track_platform.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
 
 namespace blink {
 
@@ -85,7 +87,7 @@
   Member<MediaStreamComponent> component_;
   TransferredValues data_;
 
-  std::vector<MediaStreamSource::Observer*> observers_;
+  HeapVector<Member<MediaStreamSource::Observer>> observers_;
   Vector<AddSinkArgs> add_video_sink_calls_;
   Vector<WebMediaStreamAudioSink*> add_audio_sink_calls_;
 };
diff --git a/third_party/blink/renderer/platform/network/BUILD.gn b/third_party/blink/renderer/platform/network/BUILD.gn
index 8d5faaf5..9ea9032 100644
--- a/third_party/blink/renderer/platform/network/BUILD.gn
+++ b/third_party/blink/renderer/platform/network/BUILD.gn
@@ -67,6 +67,7 @@
 
   deps = [
     "//media",
+    "//third_party/blink/renderer/platform:allow_discouraged_type",
     "//third_party/blink/renderer/platform/blob:blob",
     "//third_party/blink/renderer/platform/scheduler:scheduler",
   ]
diff --git a/third_party/blink/renderer/platform/network/DEPS b/third_party/blink/renderer/platform/network/DEPS
index 2106727..7e19e62 100644
--- a/third_party/blink/renderer/platform/network/DEPS
+++ b/third_party/blink/renderer/platform/network/DEPS
@@ -15,6 +15,7 @@
     "+net/nqe",
 
     "+services/network/public/cpp/features.h",
+    "+third_party/blink/renderer/platform/allow_discouraged_type.h",
     "+third_party/blink/renderer/platform/blob/blob_data.h",
     "+third_party/blink/renderer/platform/crypto.h",
     "+third_party/blink/renderer/platform/file_metadata.h",
diff --git a/third_party/blink/renderer/platform/network/http_header_set.h b/third_party/blink/renderer/platform/network/http_header_set.h
index f9187b3..3e0109559 100644
--- a/third_party/blink/renderer/platform/network/http_header_set.h
+++ b/third_party/blink/renderer/platform/network/http_header_set.h
@@ -8,6 +8,7 @@
 #include <set>
 #include <string>
 #include "base/strings/string_util.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 
 namespace blink {
 
@@ -17,7 +18,8 @@
   }
 };
 
-using HTTPHeaderSet = std::set<std::string, CompareIgnoreCase>;
+using HTTPHeaderSet ALLOW_DISCOURAGED_TYPE("TODO(crbug.com/1404327") =
+    std::set<std::string, CompareIgnoreCase>;
 
 }  // namespace blink
 
diff --git a/third_party/blink/renderer/platform/p2p/ipc_socket_factory.cc b/third_party/blink/renderer/platform/p2p/ipc_socket_factory.cc
index e4fa69e..a84a471 100644
--- a/third_party/blink/renderer/platform/p2p/ipc_socket_factory.cc
+++ b/third_party/blink/renderer/platform/p2p/ipc_socket_factory.cc
@@ -222,8 +222,8 @@
 
   THREAD_CHECKER(thread_checker_);
 
-  rtc::SocketAddress addr_;                // Address to resolve.
-  std::vector<rtc::IPAddress> addresses_;  // Resolved addresses.
+  rtc::SocketAddress addr_;           // Address to resolve.
+  Vector<rtc::IPAddress> addresses_;  // Resolved addresses.
 
   base::WeakPtrFactory<AsyncAddressResolverImpl> weak_factory_{this};
 };
@@ -654,13 +654,10 @@
     rtc::SocketAddress* addr) const {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
-  if (addresses_.empty())
-    return false;
-
-  for (size_t i = 0; i < addresses_.size(); ++i) {
-    if (family == addresses_[i].family()) {
+  for (auto& address : addresses_) {
+    if (family == address.family()) {
       *addr = addr_;
-      addr->SetResolvedIP(addresses_[i]);
+      addr->SetResolvedIP(address);
       return true;
     }
   }
diff --git a/third_party/blink/renderer/platform/peerconnection/DEPS b/third_party/blink/renderer/platform/peerconnection/DEPS
index ef7b3bf..142a48b8 100644
--- a/third_party/blink/renderer/platform/peerconnection/DEPS
+++ b/third_party/blink/renderer/platform/peerconnection/DEPS
@@ -33,6 +33,7 @@
     "+media/video/video_decode_accelerator.h",
     "+media/video/h264_parser.h",
     "+media/video/video_encode_accelerator.h",
+    "+third_party/blink/renderer/platform/allow_discouraged_type.h",
     "+third_party/blink/renderer/platform/bindings/script_wrappable.h",
     "+third_party/blink/renderer/platform/heap",
     "+third_party/blink/renderer/platform/network/parsed_content_type.h",
diff --git a/third_party/blink/renderer/platform/peerconnection/linear_histogram.cc b/third_party/blink/renderer/platform/peerconnection/linear_histogram.cc
index 02dad79..52c355b 100644
--- a/third_party/blink/renderer/platform/peerconnection/linear_histogram.cc
+++ b/third_party/blink/renderer/platform/peerconnection/linear_histogram.cc
@@ -13,18 +13,16 @@
 
 LinearHistogram::LinearHistogram(float min_value,
                                  float max_value,
-                                 size_t number_of_buckets)
+                                 wtf_size_t number_of_buckets)
     : min_value_(min_value),
       resolution_((max_value - min_value) / number_of_buckets),
-      buckets_(number_of_buckets + 2),
-      count_(0),
-      max_observed_value_(0) {
+      buckets_(number_of_buckets + 2) {
   DCHECK_GT(number_of_buckets, 0u);
   DCHECK_GT(max_value, min_value);
 }
 
 void LinearHistogram::Add(float value) {
-  size_t ix = 0;
+  wtf_size_t ix = 0;
   if (value > min_value_) {
     ix = std::ceil((value - min_value_) / resolution_);
     ix = std::min(ix, buckets_.size() - 1);
@@ -45,7 +43,7 @@
   DCHECK_LE(probability, 1.f);
   DCHECK_GT(count_, 0ul);
 
-  size_t bucket = 0;
+  wtf_size_t bucket = 0;
   float accumulated_probability = 0;
   while (accumulated_probability < probability && bucket < buckets_.size()) {
     accumulated_probability += static_cast<float>(buckets_[bucket]) / count_;
@@ -60,7 +58,7 @@
   }
 }
 
-size_t LinearHistogram::NumValues() const {
+wtf_size_t LinearHistogram::NumValues() const {
   return count_;
 }
 
diff --git a/third_party/blink/renderer/platform/peerconnection/linear_histogram.h b/third_party/blink/renderer/platform/peerconnection/linear_histogram.h
index 9004b7f..30c9540 100644
--- a/third_party/blink/renderer/platform/peerconnection/linear_histogram.h
+++ b/third_party/blink/renderer/platform/peerconnection/linear_histogram.h
@@ -6,9 +6,9 @@
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_PEERCONNECTION_LINEAR_HISTOGRAM_H_
 
 #include <cstddef>
-#include <vector>
 
 #include "third_party/blink/renderer/platform/platform_export.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
 
 namespace blink {
 
@@ -18,7 +18,9 @@
   // The resolution/width of each bucket is (max_value - min_value) /
   // number_of_buckets. In addition to the specified number of buckets, there
   // will be two more buckets to track under- and overflow.
-  LinearHistogram(float min_value, float max_value, size_t number_of_buckets);
+  LinearHistogram(float min_value,
+                  float max_value,
+                  wtf_size_t number_of_buckets);
 
   // Add a value to the histogram.
   void Add(float value);
@@ -31,14 +33,14 @@
   float GetPercentile(float probability) const;
 
   // How many values that make up this histogram.
-  size_t NumValues() const;
+  wtf_size_t NumValues() const;
 
  private:
   const float min_value_;
   const float resolution_;
-  std::vector<size_t> buckets_;
-  size_t count_;
-  float max_observed_value_;
+  Vector<size_t> buckets_;
+  wtf_size_t count_ = 0;
+  float max_observed_value_ = 0;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/peerconnection/linear_histogram_test.cc b/third_party/blink/renderer/platform/peerconnection/linear_histogram_test.cc
index 36cf29b..1b1656f2 100644
--- a/third_party/blink/renderer/platform/peerconnection/linear_histogram_test.cc
+++ b/third_party/blink/renderer/platform/peerconnection/linear_histogram_test.cc
@@ -13,7 +13,7 @@
 
 constexpr float kMinValue = 0.0f;
 constexpr float kMaxValue = 10.0f;
-constexpr size_t kNumBuckets = 10;
+constexpr wtf_size_t kNumBuckets = 10;
 
 class LinearHistogramTest : public ::testing::Test {
  protected:
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_stats.h b/third_party/blink/renderer/platform/peerconnection/rtc_stats.h
index 8b727f2..be30d226 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_stats.h
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_stats.h
@@ -9,6 +9,7 @@
 #include "base/feature_list.h"
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/public/platform/web_vector.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/blink/renderer/platform/wtf/hash_map.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
@@ -91,7 +92,8 @@
   // Pointer to a stats object that is owned by |stats_owner_|.
   const webrtc::RTCStats* const stats_;
   // Members of the |stats_| object, equivalent to |stats_->Members()|.
-  const std::vector<const webrtc::RTCStatsMemberInterface*> stats_members_;
+  const std::vector<const webrtc::RTCStatsMemberInterface*> stats_members_
+      ALLOW_DISCOURAGED_TYPE("Matches webrtc::RTCStats::Members()");
 };
 
 class PLATFORM_EXPORT RTCStatsMember {
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 8f3f9683..76510c5 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc
@@ -41,6 +41,7 @@
 #include "media/video/video_encode_accelerator.h"
 #include "third_party/blink/public/common/buildflags.h"
 #include "third_party/blink/public/common/features.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
 #include "third_party/blink/renderer/platform/webrtc/convert_to_webrtc_video_frame_buffer.h"
 #include "third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter.h"
@@ -396,7 +397,8 @@
   const base::TimeDelta media_timestamp_;
   const int32_t rtp_timestamp_;
   const int64_t capture_time_ms_;
-  const std::vector<gfx::Size> resolutions_;
+  const std::vector<gfx::Size> resolutions_ ALLOW_DISCOURAGED_TYPE(
+      "Matches media::Vp9Metadata::spatial_layer_resolutions etc");
   size_t produced_frames_ = 0;
 };
 
@@ -655,7 +657,9 @@
   // The reslutions of active spatial layer, only used when |Vp9Metadata| is
   // contained in |BitstreamBufferMetadata|. it will be updated when key frame
   // is produced.
-  std::vector<gfx::Size> current_spatial_layer_resolutions_;
+  std::vector<gfx::Size> current_spatial_layer_resolutions_
+      ALLOW_DISCOURAGED_TYPE(
+          "Matches media::Vp9Metadata::spatial_layer_resolutions etc");
 
   // Index of the highest spatial layer with bandwidth allocated for it.
   size_t highest_active_spatial_index_{0};
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_factory.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_factory.cc
index 44ba8c59..222bb881 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_factory.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_factory.cc
@@ -13,6 +13,7 @@
 #include "media/media_buildflags.h"
 #include "media/video/gpu_video_accelerator_factories.h"
 #include "third_party/blink/public/common/features.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.h"
 #include "third_party/webrtc/api/video_codecs/h264_profile_level_id.h"
 #include "third_party/webrtc/api/video_codecs/sdp_video_format.h"
@@ -167,9 +168,12 @@
 
 struct SupportedFormats {
   bool unknown = true;
-  std::vector<media::VideoCodecProfile> profiles;
-  std::vector<std::vector<media::SVCScalabilityMode>> scalability_modes;
-  std::vector<webrtc::SdpVideoFormat> sdp_formats;
+  std::vector<media::VideoCodecProfile> profiles
+      ALLOW_DISCOURAGED_TYPE("Matches webrtc API");
+  std::vector<std::vector<media::SVCScalabilityMode>> scalability_modes
+      ALLOW_DISCOURAGED_TYPE("Matches webrtc API");
+  std::vector<webrtc::SdpVideoFormat> sdp_formats
+      ALLOW_DISCOURAGED_TYPE("Matches webrtc API");
 };
 
 SupportedFormats GetSupportedFormatsInternal(
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_factory.h b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_factory.h
index 691a65d..b577143f 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_factory.h
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_factory.h
@@ -7,6 +7,7 @@
 
 #include <vector>
 
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/peerconnection/gpu_codec_support_waiter.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/webrtc/api/video_codecs/video_encoder_factory.h"
@@ -50,7 +51,8 @@
 
   // List of profiles that RTCVideoEncoderFactory will refuse to create an
   // encoder for even if the underlying GPU factories has support.
-  std::vector<media::VideoCodecProfile> disabled_profiles_;
+  std::vector<media::VideoCodecProfile> disabled_profiles_
+      ALLOW_DISCOURAGED_TYPE("Matches webrtc API");
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/peerconnection/stats_collector.cc b/third_party/blink/renderer/platform/peerconnection/stats_collector.cc
index e9061b7..53b2b77 100644
--- a/third_party/blink/renderer/platform/peerconnection/stats_collector.cc
+++ b/third_party/blink/renderer/platform/peerconnection/stats_collector.cc
@@ -15,7 +15,7 @@
 // Histogram parameters.
 constexpr float kProcessingTimeHistogramMinValue_ms = 1.0;
 constexpr float kProcessingTimeHistogramMaxValue_ms = 35;
-constexpr size_t kProcessingTimeHistogramBuckets = 80;
+constexpr wtf_size_t kProcessingTimeHistogramBuckets = 80;
 constexpr float kProcessingTimePercentileToReport = 0.99;
 
 // Report intermediate results every 15 seconds.
diff --git a/third_party/blink/renderer/platform/peerconnection/webrtc_audio_sink.cc b/third_party/blink/renderer/platform/peerconnection/webrtc_audio_sink.cc
index f1ddab07..f5deb46 100644
--- a/third_party/blink/renderer/platform/peerconnection/webrtc_audio_sink.cc
+++ b/third_party/blink/renderer/platform/peerconnection/webrtc_audio_sink.cc
@@ -243,7 +243,7 @@
   SendLogMessage(
       base::StringPrintf("Adapter::RemoveSink([label=%s])", label_.c_str()));
   base::AutoLock auto_lock(lock_);
-  const auto it = base::ranges::find(sinks_, sink);
+  auto** it = base::ranges::find(sinks_, sink);
   if (it != sinks_.end())
     sinks_.erase(it);
 }
diff --git a/third_party/blink/renderer/platform/peerconnection/webrtc_audio_sink.h b/third_party/blink/renderer/platform/peerconnection/webrtc_audio_sink.h
index cd7f5c2..af66aceb 100644
--- a/third_party/blink/renderer/platform/peerconnection/webrtc_audio_sink.h
+++ b/third_party/blink/renderer/platform/peerconnection/webrtc_audio_sink.h
@@ -11,7 +11,6 @@
 #include <memory>
 #include <string>
 #include <utility>
-#include <vector>
 
 #include "base/memory/scoped_refptr.h"
 #include "base/synchronization/lock.h"
@@ -24,6 +23,7 @@
 #include "third_party/blink/renderer/platform/mediastream/media_stream_audio_level_calculator.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_copier.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
 #include "third_party/webrtc/api/media_stream_interface.h"
 #include "third_party/webrtc/api/media_stream_track.h"
 #include "third_party/webrtc/rtc_base/time_utils.h"
@@ -161,7 +161,7 @@
 
     // A vector of pointers to unowned WebRTC-internal objects which each
     // receive the audio data.
-    std::vector<webrtc::AudioTrackSinkInterface*> sinks_;
+    Vector<webrtc::AudioTrackSinkInterface*> sinks_;
 
     // Used for getting capture timestamps referenced on the rtc::TimeMicros()
     // clock. See the comment at the implementation of UpdateTimestampAligner()
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index f60f6396..cd1758c 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -877,8 +877,9 @@
     },
     {
       // https://drafts.csswg.org/css-contain-3/#style-container
+      // This flag is for querying custom properties only.
       name: "CSSStyleQueries",
-      status: "experimental"
+      status: "stable"
     },
     // Support for CSS Toggles, https://tabatkins.github.io/css-toggle/
     {
diff --git a/third_party/blink/renderer/platform/scheduler/BUILD.gn b/third_party/blink/renderer/platform/scheduler/BUILD.gn
index 86b0e3cc..24b34e4 100644
--- a/third_party/blink/renderer/platform/scheduler/BUILD.gn
+++ b/third_party/blink/renderer/platform/scheduler/BUILD.gn
@@ -185,6 +185,7 @@
     "//device/base/synchronization",
     "//services/metrics/public/cpp:ukm_builders",
     "//services/metrics/public/mojom",
+    "//third_party/blink/renderer/platform:allow_discouraged_type",
     "//third_party/blink/renderer/platform:make_platform_generated",
     "//third_party/blink/renderer/platform/heap:heap",
     "//third_party/blink/renderer/platform/instrumentation",
diff --git a/third_party/blink/renderer/platform/scheduler/DEPS b/third_party/blink/renderer/platform/scheduler/DEPS
index 4cdd605..208d0f2b 100644
--- a/third_party/blink/renderer/platform/scheduler/DEPS
+++ b/third_party/blink/renderer/platform/scheduler/DEPS
@@ -53,6 +53,7 @@
   "+components/scheduling_metrics",
   "+services/metrics",
 
+  "+third_party/blink/renderer/platform/allow_discouraged_type.h",
   "+third_party/blink/renderer/platform/back_forward_cache_utils.h",
   "+third_party/blink/renderer/platform/bindings/parkable_string_manager.h",
   "+third_party/blink/renderer/platform/heap/collection_support/clear_collection_scope.h",
diff --git a/third_party/blink/renderer/platform/scheduler/common/single_thread_idle_task_runner.h b/third_party/blink/renderer/platform/scheduler/common/single_thread_idle_task_runner.h
index 7bcd0c8f..e4b0465 100644
--- a/third_party/blink/renderer/platform/scheduler/common/single_thread_idle_task_runner.h
+++ b/third_party/blink/renderer/platform/scheduler/common/single_thread_idle_task_runner.h
@@ -14,6 +14,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/time.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 
 namespace blink {
@@ -105,7 +106,8 @@
 
   scoped_refptr<base::SingleThreadTaskRunner> idle_priority_task_runner_;
   scoped_refptr<base::SingleThreadTaskRunner> control_task_runner_;
-  std::multimap<base::TimeTicks, DelayedIdleTask> delayed_idle_tasks_;
+  std::multimap<base::TimeTicks, DelayedIdleTask> delayed_idle_tasks_
+      ALLOW_DISCOURAGED_TYPE("TODO(crbug.com/1404327)");
   Delegate* delegate_;  // NOT OWNED
   base::WeakPtr<SingleThreadIdleTaskRunner> weak_scheduler_ptr_;
   base::WeakPtrFactory<SingleThreadIdleTaskRunner> weak_factory_{this};
diff --git a/third_party/blink/renderer/platform/scheduler/common/tracing_helper.h b/third_party/blink/renderer/platform/scheduler/common/tracing_helper.h
index d12a209f..41de86cf 100644
--- a/third_party/blink/renderer/platform/scheduler/common/tracing_helper.h
+++ b/third_party/blink/renderer/platform/scheduler/common/tracing_helper.h
@@ -6,7 +6,6 @@
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_COMMON_TRACING_HELPER_H_
 
 #include <string>
-#include <unordered_set>
 
 #include "base/compiler_specific.h"
 #include "base/time/time.h"
@@ -15,6 +14,7 @@
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
+#include "third_party/blink/renderer/platform/wtf/hash_set.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 #include "third_party/perfetto/include/perfetto/tracing/event_context.h"
 #include "third_party/perfetto/include/perfetto/tracing/traced_value.h"
@@ -73,7 +73,7 @@
   void OnTraceLogEnabled();
 
  private:
-  std::unordered_set<TraceableVariable*> traceable_variables_;
+  HashSet<TraceableVariable*> traceable_variables_;
 };
 
 class TraceableVariable {
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
index a65e8d1..dec34d06 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
@@ -27,6 +27,7 @@
 #include "components/power_scheduler/power_mode_voter.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/blink/public/platform/scheduler/web_thread_scheduler.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/blink/renderer/platform/scheduler/common/features.h"
 #include "third_party/blink/renderer/platform/scheduler/common/idle_helper.h"
@@ -749,9 +750,10 @@
   scoped_refptr<MainThreadTaskQueue>
       back_forward_cache_ipc_tracking_task_queue_;
 
-  using TaskQueueVoterMap = std::map<
-      scoped_refptr<MainThreadTaskQueue>,
-      std::unique_ptr<base::sequence_manager::TaskQueue::QueueEnabledVoter>>;
+  using TaskQueueVoterMap ALLOW_DISCOURAGED_TYPE("TODO(crbug.com/1404327)") =
+      std::map<scoped_refptr<MainThreadTaskQueue>,
+               std::unique_ptr<
+                   base::sequence_manager::TaskQueue::QueueEnabledVoter>>;
 
   TaskQueueVoterMap task_runners_;
 
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_impl.h
index 970961b2..51ae56a8 100644
--- a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_impl.h
+++ b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_impl.h
@@ -11,6 +11,7 @@
 #include "base/task/sequence_manager/task_queue.h"
 #include "base/task/single_thread_task_runner.h"
 #include "third_party/blink/public/platform/task_type.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/scheduler/common/back_forward_cache_disabling_feature_tracker.h"
 #include "third_party/blink/renderer/platform/scheduler/common/tracing_helper.h"
 #include "third_party/blink/renderer/platform/scheduler/public/worker_scheduler.h"
@@ -104,9 +105,10 @@
   scoped_refptr<NonMainThreadTaskQueue> pausable_task_queue_;
   scoped_refptr<NonMainThreadTaskQueue> unpausable_task_queue_;
 
-  using TaskQueueVoterMap = std::map<
-      scoped_refptr<NonMainThreadTaskQueue>,
-      std::unique_ptr<base::sequence_manager::TaskQueue::QueueEnabledVoter>>;
+  using TaskQueueVoterMap ALLOW_DISCOURAGED_TYPE("TODO(crbug.com/1404327)") =
+      std::map<scoped_refptr<NonMainThreadTaskQueue>,
+               std::unique_ptr<
+                   base::sequence_manager::TaskQueue::QueueEnabledVoter>>;
 
   TaskQueueVoterMap task_runners_;
 
diff --git a/third_party/blink/renderer/platform/video_capture/DEPS b/third_party/blink/renderer/platform/video_capture/DEPS
index 326050e..f2e8cf8 100644
--- a/third_party/blink/renderer/platform/video_capture/DEPS
+++ b/third_party/blink/renderer/platform/video_capture/DEPS
@@ -10,6 +10,7 @@
     "+base/token.h",
     "+media/base",
     "+media/capture",
+    "+third_party/blink/renderer/platform/allow_discouraged_type.h",
     "+third_party/blink/renderer/platform/platform_export.h",
     "+third_party/blink/renderer/platform/wtf",
 
diff --git a/third_party/blink/renderer/platform/video_capture/video_capture_impl.h b/third_party/blink/renderer/platform/video_capture/video_capture_impl.h
index 5870b18..6c8fc64 100644
--- a/third_party/blink/renderer/platform/video_capture/video_capture_impl.h
+++ b/third_party/blink/renderer/platform/video_capture/video_capture_impl.h
@@ -24,6 +24,7 @@
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "third_party/blink/public/common/media/video_capture.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 
 namespace base {
@@ -181,7 +182,8 @@
   // Contains information about a video capture client, including capture
   // parameters callbacks to the client.
   struct ClientInfo;
-  using ClientInfoMap = std::map<int, ClientInfo>;
+  using ClientInfoMap ALLOW_DISCOURAGED_TYPE("TODO(crbug.com/1404327)") =
+      std::map<int, ClientInfo>;
 
   using BufferFinishedCallback = base::OnceClosure;
 
@@ -266,7 +268,8 @@
       this};
 
   // Buffers available for sending to the client.
-  using ClientBufferMap = std::map<int32_t, scoped_refptr<BufferContext>>;
+  using ClientBufferMap ALLOW_DISCOURAGED_TYPE("TODO(crbug.com/1404327)") =
+      std::map<int32_t, scoped_refptr<BufferContext>>;
   ClientBufferMap client_buffers_;
 
   ClientInfoMap clients_;
diff --git a/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter.cc b/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter.cc
index f4e669e..bd8dc49 100644
--- a/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter.cc
+++ b/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter.cc
@@ -128,12 +128,12 @@
     std::unique_ptr<std::vector<uint8_t>> buffer) {
   base::AutoLock autolock(buffer_lock_);
   const base::TimeTicks now = tick_clock_->NowTicks();
-  free_buffers_.push_back({now, std::move(buffer)});
+  free_buffers_.push_back(BufferEntry{now, std::move(buffer)});
 
   // After this loop, |stale_index| is pointing to the first non-stale buffer.
   // Such an index must exist because |buffer| is never stale.
   constexpr base::TimeDelta kStaleBufferLimit = base::Seconds(10);
-  for (size_t stale_index = 0; stale_index < free_buffers_.size();
+  for (wtf_size_t stale_index = 0; stale_index < free_buffers_.size();
        ++stale_index) {
     if (now - free_buffers_[stale_index].last_use_time < kStaleBufferLimit) {
       DCHECK_LT(stale_index, free_buffers_.size());
diff --git a/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter.h b/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter.h
index 4868ca5..6147f511 100644
--- a/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter.h
+++ b/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter.h
@@ -5,8 +5,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_WEBRTC_WEBRTC_VIDEO_FRAME_ADAPTER_H_
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WEBRTC_WEBRTC_VIDEO_FRAME_ADAPTER_H_
 
-#include <vector>
-
 #include "base/feature_list.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
@@ -21,6 +19,7 @@
 #include "media/video/gpu_video_accelerator_factories.h"
 #include "media/video/renderable_gpu_memory_buffer_video_frame_pool.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
 #include "third_party/webrtc/api/scoped_refptr.h"
 #include "third_party/webrtc/api/video/video_frame_buffer.h"
 #include "ui/gfx/geometry/rect.h"
@@ -65,7 +64,7 @@
       std::unique_ptr<std::vector<uint8_t>> buffer;
     };
     base::Lock buffer_lock_;
-    std::vector<BufferEntry> free_buffers_ GUARDED_BY(buffer_lock_);
+    Vector<BufferEntry> free_buffers_ GUARDED_BY(buffer_lock_);
     const base::TickClock* tick_clock_;
   };
 
@@ -263,11 +262,11 @@
 
   base::Lock adapted_frames_lock_;
   const scoped_refptr<media::VideoFrame> frame_;
-  const std::vector<scoped_refptr<media::VideoFrame>> scaled_frames_;
+  const Vector<scoped_refptr<media::VideoFrame>> scaled_frames_;
   const scoped_refptr<SharedResources> shared_resources_;
   const ScaledBufferSize full_size_;
   // Frames that have been adapted, i.e. that were "hard-applied" and mapped.
-  std::vector<AdaptedFrame> adapted_frames_ GUARDED_BY(adapted_frames_lock_);
+  Vector<AdaptedFrame> adapted_frames_ GUARDED_BY(adapted_frames_lock_);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/widget/compositing/categorized_worker_pool.cc b/third_party/blink/renderer/platform/widget/compositing/categorized_worker_pool.cc
index 525abe2..9bb81f47 100644
--- a/third_party/blink/renderer/platform/widget/compositing/categorized_worker_pool.cc
+++ b/third_party/blink/renderer/platform/widget/compositing/categorized_worker_pool.cc
@@ -6,7 +6,6 @@
 
 #include <string>
 #include <utility>
-#include <vector>
 
 #include "base/bind.h"
 #include "base/command_line.h"
@@ -28,6 +27,7 @@
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/renderer/platform/scheduler/public/main_thread.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
 
 namespace blink {
 namespace {
@@ -93,7 +93,7 @@
 
  private:
   CategorizedWorkerPoolImpl* const pool_;
-  const std::vector<cc::TaskCategory> categories_;
+  const Vector<cc::TaskCategory> categories_;
   base::ConditionVariable* const has_ready_to_run_tasks_cv_;
 
   base::OnceCallback<void(base::PlatformThreadId)> backgrounding_callback_;
@@ -207,7 +207,7 @@
 
   // |max_concurrency_foreground| normal threads and 1 background threads are
   // created.
-  const size_t num_threads = max_concurrency_foreground + 1;
+  const wtf_size_t num_threads = max_concurrency_foreground + 1;
   threads_.reserve(num_threads);
 
   // Start |max_concurrency_foreground| normal priority threads, which run
@@ -314,7 +314,7 @@
 }
 
 void CategorizedWorkerPoolImpl::Run(
-    const std::vector<cc::TaskCategory>& categories,
+    const Vector<cc::TaskCategory>& categories,
     base::ConditionVariable* has_ready_to_run_tasks_cv) {
   base::AutoLock lock(lock_);
 
@@ -373,7 +373,7 @@
 }
 
 bool CategorizedWorkerPoolImpl::RunTaskWithLockAcquired(
-    const std::vector<cc::TaskCategory>& categories) {
+    const Vector<cc::TaskCategory>& categories) {
   for (const auto& category : categories) {
     if (ShouldRunTaskForCategoryWithLockAcquired(category)) {
       RunTaskInCategoryWithLockAcquired(category);
diff --git a/third_party/blink/renderer/platform/widget/compositing/categorized_worker_pool.h b/third_party/blink/renderer/platform/widget/compositing/categorized_worker_pool.h
index 8757a5f..0fa8038 100644
--- a/third_party/blink/renderer/platform/widget/compositing/categorized_worker_pool.h
+++ b/third_party/blink/renderer/platform/widget/compositing/categorized_worker_pool.h
@@ -18,6 +18,7 @@
 #include "cc/raster/task_graph_work_queue.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
 
 namespace blink {
 
@@ -127,7 +128,7 @@
 
   // Runs a task from one of the provided categories. Categories listed first
   // have higher priority.
-  void Run(const std::vector<cc::TaskCategory>& categories,
+  void Run(const Vector<cc::TaskCategory>& categories,
            base::ConditionVariable* has_ready_to_run_tasks_cv);
 
   // Overridden from CategorizedWorkerPool:
@@ -141,7 +142,7 @@
       EXCLUSIVE_LOCKS_REQUIRED(lock_);
   // Runs a task from one of the provided categories. Categories listed first
   // have higher priority. Returns false if there were no tasks to run.
-  bool RunTaskWithLockAcquired(const std::vector<cc::TaskCategory>& categories)
+  bool RunTaskWithLockAcquired(const Vector<cc::TaskCategory>& categories)
       EXCLUSIVE_LOCKS_REQUIRED(lock_);
 
   // Run next task for the given category. Caller must acquire |lock_| prior to
@@ -154,7 +155,7 @@
       EXCLUSIVE_LOCKS_REQUIRED(lock_);
 
   // The actual threads where work is done.
-  std::vector<std::unique_ptr<base::SimpleThread>> threads_;
+  Vector<std::unique_ptr<base::SimpleThread>> threads_;
 
   // Condition variables for foreground and background threads.
   base::ConditionVariable has_task_for_normal_priority_thread_cv_;
diff --git a/third_party/blink/renderer/platform/widget/compositing/widget_swap_queue.h b/third_party/blink/renderer/platform/widget/compositing/widget_swap_queue.h
index 26497744..0effe4a 100644
--- a/third_party/blink/renderer/platform/widget/compositing/widget_swap_queue.h
+++ b/third_party/blink/renderer/platform/widget/compositing/widget_swap_queue.h
@@ -8,6 +8,7 @@
 #include <map>
 #include "base/synchronization/lock.h"
 #include "third_party/blink/public/mojom/widget/platform_widget.mojom-blink.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
 
 namespace blink {
@@ -52,7 +53,8 @@
 
  private:
   base::Lock lock_;
-  std::map<int, Vector<VisualStateRequestCallback>> queue_;
+  std::map<int, Vector<VisualStateRequestCallback>> queue_
+      ALLOW_DISCOURAGED_TYPE("TODO(crbug.com/1404327)");
   Vector<VisualStateRequestCallback> next_callbacks_;
 };
 
diff --git a/third_party/blink/renderer/platform/widget/input/input_event_prediction.h b/third_party/blink/renderer/platform/widget/input/input_event_prediction.h
index d460988f..995c0e2a 100644
--- a/third_party/blink/renderer/platform/widget/input/input_event_prediction.h
+++ b/third_party/blink/renderer/platform/widget/input/input_event_prediction.h
@@ -11,6 +11,7 @@
 #include "base/time/time.h"
 #include "third_party/blink/public/common/input/pointer_id.h"
 #include "third_party/blink/public/common/input/web_coalesced_input_event.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/blink/renderer/platform/widget/input/prediction/predictor_factory.h"
 #include "ui/base/prediction/input_predictor.h"
@@ -85,7 +86,8 @@
   void ResetSinglePredictor(const WebPointerProperties& event);
 
   std::unordered_map<PointerId, std::unique_ptr<ui::InputPredictor>>
-      pointer_id_predictor_map_;
+      pointer_id_predictor_map_
+          ALLOW_DISCOURAGED_TYPE("TODO(crbug.com/1404327)");
   std::unique_ptr<ui::InputPredictor> mouse_predictor_;
 
   // Store the field trial parameter used for choosing different types of
diff --git a/third_party/blink/renderer/platform/widget/input/prediction/filter_factory.h b/third_party/blink/renderer/platform/widget/input/prediction/filter_factory.h
index 39b9492..d75fcacb 100644
--- a/third_party/blink/renderer/platform/widget/input/prediction/filter_factory.h
+++ b/third_party/blink/renderer/platform/widget/input/prediction/filter_factory.h
@@ -8,6 +8,7 @@
 #include <unordered_map>
 
 #include "base/feature_list.h"
+#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/blink/renderer/platform/widget/input/prediction/predictor_factory.h"
 #include "ui/base/prediction/input_filter.h"
@@ -47,7 +48,7 @@
 };
 
 using FilterParams = std::unordered_map<std::string, double>;
-using FilterParamsMap =
+using FilterParamsMap ALLOW_DISCOURAGED_TYPE("TODO(crbug.com/1404327)") =
     std::unordered_map<FilterParamMapKey, FilterParams, FilterParamMapKeyHash>;
 
 // FilterFactory is a class containing methods to create filters.
diff --git a/third_party/blink/renderer/platform/widget/input/widget_base_input_handler.cc b/third_party/blink/renderer/platform/widget/input/widget_base_input_handler.cc
index 50467e7..89ae9b11 100644
--- a/third_party/blink/renderer/platform/widget/input/widget_base_input_handler.cc
+++ b/third_party/blink/renderer/platform/widget/input/widget_base_input_handler.cc
@@ -29,6 +29,7 @@
 #include "third_party/blink/renderer/platform/widget/input/ime_event_guard.h"
 #include "third_party/blink/renderer/platform/widget/widget_base.h"
 #include "third_party/blink/renderer/platform/widget/widget_base_client.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
 #include "ui/latency/latency_info.h"
 
 #if BUILDFLAG(IS_ANDROID)
@@ -230,7 +231,7 @@
 
   absl::optional<WebTouchAction>& touch_action() { return touch_action_; }
 
-  std::vector<WidgetBaseInputHandler::InjectScrollGestureParams>&
+  Vector<WidgetBaseInputHandler::InjectScrollGestureParams>&
   injected_scroll_params() {
     return injected_scroll_params_;
   }
@@ -249,7 +250,7 @@
   // Used to hold a sequence of parameters corresponding to scroll gesture
   // events that should be injected once the current input event is done
   // being processed.
-  std::vector<WidgetBaseInputHandler::InjectScrollGestureParams>
+  Vector<WidgetBaseInputHandler::InjectScrollGestureParams>
       injected_scroll_params_;
 
   // Whether the event we are handling is a touch start or move.
@@ -598,7 +599,7 @@
 }
 
 void WidgetBaseInputHandler::HandleInjectedScrollGestures(
-    std::vector<InjectScrollGestureParams> injected_scroll_params,
+    Vector<InjectScrollGestureParams> injected_scroll_params,
     const WebInputEvent& input_event,
     const ui::LatencyInfo& original_latency_info,
     const cc::EventMetrics* original_metrics) {
diff --git a/third_party/blink/renderer/platform/widget/input/widget_base_input_handler.h b/third_party/blink/renderer/platform/widget/input/widget_base_input_handler.h
index 4d47c029..ec9b0d2 100644
--- a/third_party/blink/renderer/platform/widget/input/widget_base_input_handler.h
+++ b/third_party/blink/renderer/platform/widget/input/widget_base_input_handler.h
@@ -109,7 +109,7 @@
   // latency info, and its metrics, respectively, used in generating new
   // gestures along with their latency info and metrics.
   void HandleInjectedScrollGestures(
-      std::vector<InjectScrollGestureParams> injected_scroll_params,
+      Vector<InjectScrollGestureParams> injected_scroll_params,
       const WebInputEvent& input_event,
       const ui::LatencyInfo& original_latency_info,
       const cc::EventMetrics* original_metrics);
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
index f2454aa..b35d372e 100755
--- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
+++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -1750,6 +1750,12 @@
     },
     {
         'paths': [
+            'third_party/blink/renderer/core/view_transition/view_transition_style_tracker.h'
+        ],
+        'allowed': ['viz::ViewTransitionElementResourceId'],
+    },
+    {
+        'paths': [
             'third_party/blink/renderer/core/',
         ],
         'allowed': ['ui::k200Percent'],
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
index 9caf90b..4210308 100644
--- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
+++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -13,6 +13,7 @@
 # Tests that fail in legacy but pass in NG
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 virtual/idna-2008/external/wpt/url/url-setters-a-area.window.html?include=mailto [ Crash Failure ]
 crbug.com/626703 external/wpt/webcodecs/videoFrame-serialization.crossAgentCluster.html [ Timeout ]
 crbug.com/626703 virtual/idna-2008/external/wpt/url/a-element-xhtml.xhtml?exclude=(file|javascript|mailto) [ Crash Failure ]
 crbug.com/626703 external/wpt/css/css-text/bidi/bidi-tab-001.html [ Failure ]
@@ -1561,10 +1562,12 @@
 crbug.com/1035582 paint/invalidation/outline/focus-continuations.html [ Failure ]
 crbug.com/1035582 paint/invalidation/outline/focus-enable-continuations.html [ Failure ]
 crbug.com/1035582 paint/invalidation/outline/focus-ring-on-continuation-move.html [ Failure ]
+crbug.com/1035582 paint/invalidation/outline/focus-ring-on-child-move.html [ Failure ]
 crbug.com/1035582 paint/invalidation/outline/focus-ring-on-inline-continuation-move.html [ Failure ]
+crbug.com/1035582 paint/invalidation/outline/focus-ring-for-anchor.html [ Failure ]
+crbug.com/1035582 paint/invalidation/outline/focus-ring-for-anchor1.html [ Failure ]
 crbug.com/1035582 paint/invalidation/outline/outline-become-affected-by-descendant.html [ Failure ]
 crbug.com/1035582 paint/invalidation/outline/outline-become-not-affected-by-descendant.html [ Failure ]
-crbug.com/1035582 paint/invalidation/outline/transform-focus-ring-repaint.html [ Failure ]
 crbug.com/1035582 paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container.html [ Failure ]
 crbug.com/1035582 paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container.html [ Failure ]
 crbug.com/1035582 paint/invalidation/svg/scrolling-embedded-svg-file-image-repaint-problem.html [ Failure ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 2c51ba66..aeed44b 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1165,6 +1165,7 @@
 crbug.com/1315275 external/wpt/css/css-contain/content-visibility/content-visibility-canvas.html [ Failure ]
 crbug.com/1315275 external/wpt/css/css-contain/content-visibility/content-visibility-video.html [ Failure ]
 crbug.com/1400979 external/wpt/css/css-contain/container-queries/nested-query-containers.html [ Crash Failure Timeout ]
+crbug.com/1404424 external/wpt/css/css-contain/container-queries/pseudo-elements-006.html [ Crash Failure Pass Timeout ]
 
 # [css-align]
 
@@ -1569,7 +1570,6 @@
 # Tests failing only on certain platforms.
 crbug.com/6606 [ Win ] external/wpt/mathml/presentation-markup/operators/mo-axis-height-1.html [ Failure ]
 crbug.com/6606 [ Mac ] external/wpt/mathml/relations/text-and-math/use-typo-metrics-1.html [ Failure ]
-crbug.com/1395443 [ Win ] external/wpt/mathml/presentation-markup/mrow/inferred-mrow-stretchy.html [ Crash Pass ]
 
 # Additonal presentation-markup failures
 crbug.com/6606 external/wpt/mathml/presentation-markup/operators/mo-lspace-rspace-2.html [ Failure ]
@@ -1812,6 +1812,7 @@
 crbug.com/1191547 external/wpt/html/semantics/forms/the-label-element/proxy-modifier-click-to-associated-element.tentative.html [ Timeout ]
 crbug.com/1401590 [ Mac12 ] external/wpt/html/semantics/links/hyperlink-auditing/headers.optional.html [ Timeout ]
 crbug.com/1401590 [ Mac11 ] external/wpt/html/semantics/links/hyperlink-auditing/headers.optional.html [ Timeout ]
+crbug.com/1404463 external/wpt/html/semantics/embedded-content/the-img-element/responsive-image-select-print.html [ Failure ]
 
 # XML nodes aren't match by .class selectors:
 crbug.com/649444 external/wpt/css/selectors/xml-class-selector.xml [ Failure ]
@@ -2066,6 +2067,25 @@
 crbug.com/1091631 external/wpt/css/css-text/line-break/line-break-normal-015a.xht [ Failure ]
 crbug.com/1091631 external/wpt/css/css-text/line-break/line-break-strict-015a.xht [ Failure ]
 
+# Not yet investigated
+crbug.com/1404464 external/wpt/css/css-text/bidi/bidi-lines-002.html [ Failure ]
+crbug.com/1404467 external/wpt/css/css-text/letter-spacing/letter-spacing-ligatures-001.html [ Failure ]
+crbug.com/1404467 external/wpt/css/css-text/letter-spacing/letter-spacing-ligatures-002.html [ Failure ]
+crbug.com/1404467 external/wpt/css/css-text/letter-spacing/letter-spacing-ligatures-003.html [ Failure ]
+crbug.com/1404466 external/wpt/css/css-text/line-breaking/line-breaking-022.html [ Failure ]
+crbug.com/1404466 external/wpt/css/css-text/line-breaking/line-breaking-023.html [ Failure ]
+crbug.com/1404468 external/wpt/css/css-text/word-break/word-break-break-all-ethiopic.html [ Failure ]
+crbug.com/1361453 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-auto-001.html [ Failure ]
+crbug.com/1361453 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-auto-002.html [ Failure ]
+crbug.com/1361453 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-auto-003.html [ Failure ]
+crbug.com/1361453 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-auto-004.html [ Failure ]
+crbug.com/1361453 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-auto-005.html [ Failure ]
+crbug.com/1361453 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-manual-001.html [ Failure ]
+crbug.com/1361453 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-manual-002.html [ Failure ]
+crbug.com/1361453 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-manual-003.html [ Failure ]
+crbug.com/1361453 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-manual-004.html [ Failure ]
+crbug.com/1361453 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-manual-005.html [ Failure ]
+
 # Link event firing
 crbug.com/922618 external/wpt/html/semantics/document-metadata/the-link-element/link-multiple-error-events.html [ Timeout ]
 crbug.com/922618 external/wpt/html/semantics/document-metadata/the-link-element/link-multiple-load-events.html [ Timeout ]
@@ -2980,37 +3000,23 @@
 crbug.com/626703 [ Win ] virtual/partitioned-cookies/http/tests/inspector-protocol/network/disabled-cache-navigation.js [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 external/wpt/css/selectors/nth-child-of-attribute.html [ Failure ]
+crbug.com/626703 external/wpt/css/selectors/nth-child-of-classname-002.html [ Failure ]
+crbug.com/626703 external/wpt/css/selectors/nth-child-of-has.html [ Failure ]
+crbug.com/626703 external/wpt/css/selectors/nth-child-of-not.html [ Failure ]
+crbug.com/626703 external/wpt/css/selectors/nth-child-of-nth-child.html [ Failure ]
+crbug.com/626703 external/wpt/css/selectors/nth-child-of-universal-selector.html [ Failure ]
 crbug.com/626703 external/wpt/webcodecs/videoFrame-serialization.crossAgentCluster.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/resource-timing/response-status-code.html [ Skip Timeout ]
 crbug.com/626703 [ Win ] external/wpt/resource-timing/response-status-code.html [ Skip Timeout ]
 crbug.com/626703 [ Mac12 ] external/wpt/url/a-element.html?exclude=(file|javascript|mailto) [ Crash Failure ]
 crbug.com/626703 virtual/plz-dedicated-worker/external/wpt/resource-timing/response-status-code.html [ Skip Timeout ]
-crbug.com/626703 external/wpt/css/css-text/letter-spacing/letter-spacing-ligatures-001.html [ Failure ]
-crbug.com/626703 [ Win ] external/wpt/css/css-text/letter-spacing/letter-spacing-ligatures-002.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/letter-spacing/letter-spacing-ligatures-003.html [ Failure ]
 crbug.com/626703 [ Mac11 ] external/wpt/resource-timing/response-status-code.html [ Skip Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/compute-pressure/external/wpt/compute-pressure/compute_pressure_disconnect_immediately.tentative.https.window.html [ Crash ]
-crbug.com/626703 external/wpt/css/css-text/bidi/bidi-lines-002.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/line-breaking/line-breaking-023.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/text-align/text-align-match-parent-05.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/line-breaking/line-breaking-022.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/word-break/word-break-break-all-ethiopic.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-auto-001.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-auto-002.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-auto-003.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-auto-004.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-auto-005.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-manual-001.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-manual-002.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-manual-003.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-manual-004.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-manual-005.html [ Failure ]
-crbug.com/626703 external/wpt/html/semantics/embedded-content/the-img-element/responsive-image-select-print.html [ Failure ]
 crbug.com/626703 [ Win11 ] wpt_internal/geolocation-api/watchPosition-page-visibility.https.html [ Timeout ]
 crbug.com/626703 [ Win10.20h2 ] external/wpt/web-animations/idlharness.window.html [ Crash Failure ]
 crbug.com/626703 [ Mac11 ] external/wpt/performance-timeline/tentative/include-frames-from-child-cross-origin-grandchild.sub.html [ Timeout ]
 crbug.com/626703 [ Mac ] external/wpt/url/a-element-xhtml.xhtml?exclude=(file|javascript|mailto) [ Crash Failure ]
-crbug.com/626703 [ Mac12 ] external/wpt/url/url-setters-a-area.window.html?exclude=(file|javascript|mailto) [ Crash Failure ]
 crbug.com/626703 [ Mac12-arm64 ] virtual/pending-beacon/external/wpt/pending-beacon/pending_post_beacon-cors.tentative.https.window.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] external/wpt/url/a-element-origin.html [ Crash Failure ]
 crbug.com/626703 [ Win10.20h2 ] wpt_internal/geolocation-api/watchPosition-page-visibility.https.html [ Timeout ]
@@ -3054,7 +3060,6 @@
 crbug.com/626703 [ Linux ] external/wpt/webxr/xrSession_requestReferenceSpace_features.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/xrSession_sameObject.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/xrSession_visibilityState.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/xrViewerPose_views_sameObject.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/xr_viewport_scale.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] virtual/abort-signal-remove/external/wpt/web-nfc/NDEFReader_make-read-only.https.window.html [ Timeout ]
@@ -3291,7 +3296,6 @@
 crbug.com/626703 external/wpt/css/css-will-change/will-change-abspos-cb-001.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/url/a-element.html [ Failure ]
 crbug.com/892337 external/wpt/resource-timing/content-type-parsing.html [ Failure Timeout ]
-crbug.com/626703 external/wpt/css/css-contain/container-queries/pseudo-elements-006.html [ Crash Failure Pass Timeout ]
 
 crbug.com/1147998 external/wpt/pointerevents/pointerevent_after_target_removed.html?mouse [ Failure ]
 crbug.com/1147674 external/wpt/pointerevents/pointerevent_after_target_removed.html?pen [ Failure ]
@@ -3418,6 +3422,7 @@
 crbug.com/1223979 external/wpt/css/css-text/text-align/text-align-match-parent-02.html [ Failure ]
 crbug.com/1223979 external/wpt/css/css-text/text-align/text-align-match-parent-03.html [ Failure ]
 crbug.com/1223979 external/wpt/css/css-text/text-align/text-align-match-parent-04.html [ Failure ]
+crbug.com/1223979 external/wpt/css/css-text/text-align/text-align-match-parent-05.html [ Failure ]
 crbug.com/1223979 external/wpt/css/css-text/word-spacing/word-spacing-001.html [ Failure ]
 
 crbug.com/481431 external/wpt/css/css-break/box-decoration-break-clone-001.html [ Failure ]
@@ -3878,7 +3883,6 @@
 crbug.com/783154 [ Mac ] media/controls/doubletap-to-jump-backwards.html [ Crash Failure Pass Timeout ]
 crbug.com/783154 [ Mac ] media/controls/doubletap-to-jump-forwards.html [ Crash Failure Pass Timeout ]
 crbug.com/783154 [ Mac ] media/controls/doubletap-to-jump-forwards-too-short.html [ Crash Failure Pass Timeout ]
-crbug.com/783154 [ Mac ] media/controls/doubletap-on-play-button.html [ Crash Failure Pass Timeout ]
 crbug.com/783154 [ Mac ] media/controls/doubletap-to-toggle-fullscreen.html [ Crash Failure Pass Timeout ]
 crbug.com/783154 [ Mac ] media/controls/click-anywhere-to-play-pause.html [ Crash Failure Pass Timeout ]
 
@@ -6806,3 +6810,6 @@
 
 # TODO(crbug.com/1403877): Deflake this test.
 virtual/portals/http/tests/devtools/portals/portals-elements-nesting.js [ Failure Pass ]
+
+# TODO(crbug.com/1404614): Fix this test on MacOS (sheriff 2023-01-03).
+crbug.com/1404614 [ Mac ] external/wpt/url/url-setters-a-area.window.html?exclude=(file|javascript|mailto) [ Failure Pass ]
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 0625cef0..5129981 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
@@ -1804,6 +1804,13 @@
      }
     },
     "css-images": {
+     "empty-radial-gradient-crash.html": [
+      "be1fb120cc86527b4f1c65f09499d01dcbed9eca",
+      [
+       null,
+       {}
+      ]
+     ],
      "gradient-nan-crash.html": [
       "8c4b647042531c50ec4fd441c9c26c302c75cae5",
       [
@@ -2158,6 +2165,13 @@
         {}
        ]
       ],
+      "monolithic-oof-in-clipped-container.html": [
+       "7a3506290228a080313a077e6dc040ae3519ac3d",
+       [
+        null,
+        {}
+       ]
+      ],
       "move-linebreak-to-different-column.html": [
        "abe83ca19489dcbbdccc379c295fb391ca5b24fb",
        [
@@ -121163,6 +121177,19 @@
        {}
       ]
      ],
+     "font-variant-alternates-layers.html": [
+      "2cd60985da3876eebfdac16fb1fe1f819f267b8b",
+      [
+       null,
+       [
+        [
+         "/css/css-fonts/font-variant-alternates-layers-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "font-variant-caps-01.html": [
       "9e96486e33f8ae964e1de2118218ecc88f1bff29",
       [
@@ -238827,6 +238854,32 @@
        {}
       ]
      ],
+     "nth-child-of-attribute.html": [
+      "0afd46893a3c348810df6ada110a20d4594e4110",
+      [
+       null,
+       [
+        [
+         "/css/reference/ref-filled-green-100px-square.xht",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "nth-child-of-classname-002.html": [
+      "8aea79193c6c38db20b241e2333d46b74a3d2f71",
+      [
+       null,
+       [
+        [
+         "/css/reference/ref-filled-green-100px-square.xht",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "nth-child-of-classname.html": [
       "8ec3f43f7f481e4f3c65d03f6dfd2e12f6f59961",
       [
@@ -238866,6 +238919,45 @@
        {}
       ]
      ],
+     "nth-child-of-has.html": [
+      "efead020ab1dc1ff108b3ee4f9a0fbbdae47d64a",
+      [
+       null,
+       [
+        [
+         "/css/reference/ref-filled-green-100px-square.xht",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "nth-child-of-not.html": [
+      "863274fc8bac2caab7e71dd1c3a6237f1508e1b6",
+      [
+       null,
+       [
+        [
+         "/css/reference/ref-filled-green-100px-square.xht",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "nth-child-of-nth-child.html": [
+      "bb212a57f7fb68c517bed3d9c8a40134ce0ff022",
+      [
+       null,
+       [
+        [
+         "/css/reference/ref-filled-green-100px-square.xht",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "nth-child-of-tagname.html": [
       "107e834296f7b457afda9394fdbb7838e3591594",
       [
@@ -238879,6 +238971,19 @@
        {}
       ]
      ],
+     "nth-child-of-universal-selector.html": [
+      "1f77cba0bc2577fe6420459c0c892124c427097b",
+      [
+       null,
+       [
+        [
+         "/css/reference/ref-filled-green-100px-square.xht",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "nth-child-specificity-1.html": [
       "d0b084a719daf95d8a94ad34e6d1c58c557a089f",
       [
@@ -239061,6 +239166,19 @@
        {}
       ]
      ],
+     "nth-of-invalid.html": [
+      "89c3026d71ce81db25be45fe20a49841f8218bbf",
+      [
+       null,
+       [
+        [
+         "/css/reference/ref-filled-green-100px-square.xht",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "of-type-selectors.xhtml": [
       "73ec208b8f219d8d3b74984d65c8e72a997c8470",
       [
@@ -240467,13 +240585,13 @@
        {}
       ]
      ],
-     "root-siblings.htm": [
-      "99c0cb4c26294d1d8b655ed0a35d1f0eeb4a9ccb",
+     "root-siblings.html": [
+      "c2f897ab28d748ac4d677004a29180f60f14d38e",
       [
        null,
        [
         [
-         "/css/CSS2/reference/ref-this-text-should-be-green.xht",
+         "/css/reference/ref-filled-green-100px-square.xht",
          "=="
         ]
        ],
@@ -260941,16 +261059,6 @@
    }
   },
   "support": {
-   ".cache": {
-    "gitignore2.json": [
-     "7a998129147264ee83dee6a4e3852d6b23053563",
-     []
-    ],
-    "mtime.json": [
-     "3c3da0f60cf44a0f4c3c63c927371ac45f77a02f",
-     []
-    ]
-   },
    ".gitignore": [
     "d93e645d547894b50149d3726de2654957b6e06f",
     []
@@ -261229,7 +261337,7 @@
      []
     ],
     "idbobjectstore_batchGetAll_largeValue.tentative.any.js.ini": [
-     "c654be5297c4d0462f6b6a5a6c9d0047c1f4d8ac",
+     "22f07a5012ddc006c42083445d7e63e7971191c5",
      []
     ],
     "resources": {
@@ -261287,7 +261395,7 @@
      []
     ],
     "structured-clone.any.js.ini": [
-     "48c8ee6d1f15b592aa7f6476110a9b92df895df2",
+     "e58382d32f9f4db4fc23570cb34e814d37f41f76",
      []
     ],
     "transaction-abort-generator-revert.html.ini": [
@@ -262094,7 +262202,7 @@
       []
      ],
      "test.html.ini": [
-      "4cb35b9b730cf71f8d8b4fae76427cd1e4019682",
+      "03a526e82733e3322dd6d793ca8193824d8bf661",
       []
      ],
      "xhtml.1": [
@@ -264133,7 +264241,7 @@
      []
     ],
     "sec-ch-ua.https.html.ini": [
-     "dd79379a65be40dc808ec0e7bbec40edff80d635",
+     "2f034c11891abd359883080db8ae06686daa1ac2",
      []
     ],
     "service-workers": {
@@ -266408,7 +266516,7 @@
       []
      ],
      "history-iframe.sub.html.ini": [
-      "3d47c07320d23e9f61a5faf20eee5119d20d0b8a",
+      "62a339ed8844f47faea4a78250a149c0c61f9a80",
       []
      ],
      "iframe-all-local-schemes.sub.html.ini": [
@@ -266706,7 +266814,7 @@
       []
      ],
      "prefetch-header-allowed.html.ini": [
-      "6537e953c3318e1adf86b38290bc940ee074057c",
+      "1aa1e894994ce74a612daa45fa27aaf85c8efcdf",
       []
      ],
      "prefetch-header-blocked-by-default.html.headers": [
@@ -267651,11 +267759,11 @@
      []
     ],
     "cookieStore_set_arguments.https.any.js.ini": [
-     "a12a87964d6613709df2f0edbf8d7c8990dcda98",
+     "a1ab72a598b5d4f7d3f104d2fa2ab4d3264a86eb",
      []
     ],
     "cookieStore_subscribe_arguments.https.any.js.ini": [
-     "bb046fff2fa26f523fdc81909649220f9c2c8d1e",
+     "03cbe5413680d85643fc9110f1757ca00a9fbe21",
      []
     ],
     "resources": {
@@ -268127,7 +268235,7 @@
      ]
     },
     "fedcm-network-requests.https.html.ini": [
-     "d03446a56b8a517a7ef12479977b63ee94706d74",
+     "14f5926ca2a04ae196d5790b037cc2bf662c9b2a",
      []
     ],
     "federatedcredential-framed-get.sub.https-expected.txt": [
@@ -271017,7 +271125,7 @@
        []
       ],
       "float-nowrap-4.html.ini": [
-       "5b5e8dbb4ca2103520f29ee0352a8a413b00b51c",
+       "118137923cf41d279118a91dc1e6d3caca8e1ef7",
        []
       ],
       "float-nowrap-5-ref.html": [
@@ -276926,7 +277034,7 @@
       []
      ],
      "Element-getAnimations-dynamic-changes.tentative.html.ini": [
-      "cd79bce0007ca0a053223c57c0ae0e86b094c20e",
+      "42b61d6f41cfdf580f6218af564a8fd3b594a116",
       []
      ],
      "KeyframeEffect-getKeyframes.tentative-expected.txt": [
@@ -283001,7 +283109,7 @@
        []
       ],
       "font-relative-units.html.ini": [
-       "3d0437bcbd92c393d9e0854ad3092cc242dad093",
+       "e760d717b2fc4cf6775c0ba0d86daaf6783f5c50",
        []
       ],
       "idlharness-expected.txt": [
@@ -283021,7 +283129,7 @@
        []
       ],
       "nested-query-containers.html.ini": [
-       "e92a5bb1a4fa7e9a60bb42f506d455adf8c71d9a",
+       "076a237cb6ed39fb8a51cd6b9ce67f6cbdab5f88",
        []
       ],
       "percentage-padding-orthogonal-expected.txt": [
@@ -287652,7 +287760,7 @@
       []
      ],
      "image-as-flexitem-size-001v.html.ini": [
-      "d36b001dc153fa844a40387c50f7a7629d5e23e5",
+      "f494a6ea72274dfc29197c74e0097270f190361e",
       []
      ],
      "image-as-flexitem-size-002.html.ini": [
@@ -288646,7 +288754,7 @@
       []
      ],
      "crash-large-grapheme-cluster.html.ini": [
-      "be7498aefa7b7a79c9e35b3adcd39511020adb24",
+      "9bb81c4f45a1b33fca62c407f63b0cb8352d50d8",
       []
      ],
      "downloadable-font-in-iframe-print-ref.html": [
@@ -289391,6 +289499,10 @@
       "22c178c64f22d558d9cd725f75ae06e0f01ccfd8",
       []
      ],
+     "font-variant-alternates-layers-ref.html": [
+      "fc6ea2bc95cea4aabdd8a839316fd105c7fc0d04",
+      []
+     ],
      "font-variant-caps-01-ref.html": [
       "68f9ef0c002b36172d07f7357dceeb95851c241e",
       []
@@ -298999,7 +299111,7 @@
        []
       ],
       "subgrid-baseline-002.html.ini": [
-       "4300e380326adc7f4c7a700306fde72b33e7eb1b",
+       "c8f5d5e48be8ad5beb292de4b0b9e096c087a92d",
        []
       ],
       "subgrid-baseline-003-ref.html": [
@@ -300957,7 +301069,7 @@
        []
       ],
       "Initial-letter-breaking-rtl.html.ini": [
-       "46ebc05b8e015794e21ad5efbbb278c2a1c4a978",
+       "9451204c3f8e54260349e0a2b1aaf03911bce7bd",
        []
       ],
       "Initial-letter-breaking-vlr-ref.html": [
@@ -300973,7 +301085,7 @@
        []
       ],
       "Initial-letter-breaking-vrl.html.ini": [
-       "5e2b2a74cc4d9e4f8705bcd7b03560faf6b02136",
+       "e5040afd3078b86080090466669e3b0db6411fad",
        []
       ],
       "Initial-letter-breaking.html.ini": [
@@ -301005,7 +301117,7 @@
        []
       ],
       "initial-letter-block-position-drop-under-ruby-tall.html.ini": [
-       "8a8fc7e35d6c2844ddcb99c6fb2a940718703711",
+       "38527a1d13f5fb3341c71066d7067a196d846034",
        []
       ],
       "initial-letter-block-position-drop-under-ruby.html.ini": [
@@ -301053,7 +301165,7 @@
        []
       ],
       "initial-letter-block-position-raise-over-ruby-tall.html.ini": [
-       "50a3c7cc6b0b2246a3ca302ebfc002b293f5513b",
+       "f8543f21bc1e5f47b18bd12a63abf7940954c6b7",
        []
       ],
       "initial-letter-block-position-raise-over-ruby.html.ini": [
@@ -301073,7 +301185,7 @@
        []
       ],
       "initial-letter-block-position-raise-under-ruby.html.ini": [
-       "1136475e22104014fed3be82b9c07d8e27771af5",
+       "eede05d174440899bdc8f37125124321ef974f11",
        []
       ],
       "initial-letter-computed.html.ini": [
@@ -301097,7 +301209,7 @@
        []
       ],
       "initial-letter-drop-initial-vlr.html.ini": [
-       "984123ce1ba95aaa082597019805d29f51c77e3b",
+       "1e3e90322b20750c45315a4553d727d330e621e8",
        []
       ],
       "initial-letter-drop-initial-vrl-ref.html": [
@@ -301105,7 +301217,7 @@
        []
       ],
       "initial-letter-drop-initial-vrl.html.ini": [
-       "9324bd347f71f55e49cd491d089e1145363f6d95",
+       "90a6105fa6ab976c667bf33c9665a8656edadd75",
        []
       ],
       "initial-letter-drop-initial.html.ini": [
@@ -301141,7 +301253,7 @@
        []
       ],
       "initial-letter-float-001.html.ini": [
-       "ae13c19797a134284cfe0ffd2c225b9e7bbc0b3e",
+       "4b45bbf55e041276119bcbd59878946c3a181b5b",
        []
       ],
       "initial-letter-float-002-ref.html": [
@@ -301229,7 +301341,7 @@
        []
       ],
       "initial-letter-raise-initial.html.ini": [
-       "73516018f2e071792ef7eefb28d0fecd73b34972",
+       "e37e026a1f13a8aa9ae6d202ea3592aa01932f60",
        []
       ],
       "initial-letter-raised-sunken-caps-raise-ref.html": [
@@ -301245,7 +301357,7 @@
        []
       ],
       "initial-letter-raised-sunken-caps-sunken.html.ini": [
-       "b0631f923a6cf89fe35ed7628a5a15b4d75443bf",
+       "0c64a2fddcfde3da4a10a9ed49a4be090dade4ea",
        []
       ],
       "initial-letter-short-para-initial-letter-clears-ref.html": [
@@ -301289,7 +301401,7 @@
        []
       ],
       "initial-letter-sunk-initial-vrl.html.ini": [
-       "145423c11791d55ae88c994d027a2d62c7a4c7e1",
+       "77a501b58596bd661170dd5bd74ceaac0d7c228d",
        []
       ],
       "initial-letter-sunk-initial.html.ini": [
@@ -301514,6 +301626,10 @@
       }
      },
      "fallback-intrinsic-sizes": {
+      "constructor-error.https.html.ini": [
+       "ec85dd01b511a3edf5a7c7531259a15aabb2a158",
+       []
+      ],
       "fallback-ref.html": [
        "6808e14eb683fde8c30a2c89318c6cccba12ca1a",
        []
@@ -302692,6 +302808,10 @@
        "c87eb82357b0de46119bbf273892ce08cf2eac89",
        []
       ],
+      "clip-path-inline-002.html.ini": [
+       "84724ceb17adbb81abbf45520c33b82b13c67f36",
+       []
+      ],
       "clip-path-inline-003.html.ini": [
        "c82680ed500655231bcf7aa326d434b9cacd2d2c",
        []
@@ -306350,7 +306470,7 @@
       []
      ],
      "parse-input-arguments-005.https.html.ini": [
-      "36c0ab3e68731e07a6559a78e35e6f3c344f864a",
+      "e61017dc10441e2e5a2f080b81b896164fc084f9",
       []
      ],
      "parse-input-arguments-010.https.html.ini": [
@@ -309133,6 +309253,10 @@
       "0df837fbb07d756aa4f778765d6ce08a5f296275",
       []
      ],
+     "ruby-text-combine-upright-001b.html.ini": [
+      "654ce463d1c2e4eac1fc8aad024ad0e5ce2313f9",
+      []
+     ],
      "ruby-text-combine-upright-002-ref.html": [
       "1bb4386e7abfb468de92edcb9a2633d5ceb96174",
       []
@@ -316418,12 +316542,12 @@
         []
        ]
       },
-      "text-transform-capitalize-003.html.ini": [
-       "38e66a2dc4a6c69a3dd79df3f84abe55bd072294",
+      "text-transform-capitalize-001.html.ini": [
+       "83483d77631ebaa0a77a19d292f9ff840793b675",
        []
       ],
-      "text-transform-capitalize-005.html.ini": [
-       "c06d2b0fcf72d84e5512352f5f74279544c73498",
+      "text-transform-capitalize-003.html.ini": [
+       "38e66a2dc4a6c69a3dd79df3f84abe55bd072294",
        []
       ],
       "text-transform-capitalize-007.html.ini": [
@@ -329609,10 +329733,6 @@
       "c56fb9d034e325071b1f65c9c520e13c154974c6",
       []
      ],
-     "text-combine-upright-shadow.html.ini": [
-      "cd761a1ebe8244957775035db47ee9043497911a",
-      []
-     ],
      "text-combine-upright-value-all-001.html.ini": [
       "fa41ee88b2d9403acd0cb54cd1d52bf1e52c87ef",
       []
@@ -330468,7 +330588,7 @@
       []
      ],
      "scroll-behavior-main-frame-root.html.ini": [
-      "d5fe958db40f7f781b73cd31f82757a981f171da",
+      "7cbc5c3f06ede4c0bbf9ce529d97f187c32547b4",
       []
      ],
      "scroll-behavior-main-frame-window.html.ini": [
@@ -331941,6 +332061,10 @@
       "fb5255eddb1cdbdc1b9b610a7813b977d822b7b9",
       []
      ],
+     "input-file-print.html.ini": [
+      "1ec656fb80df94164ab32ab2de9b14c353823195",
+      []
+     ],
      "page-overflow-crash-print.html.ini": [
       "99ba67507cfa6b4973f308bb22f7ff0a6efe12de",
       []
@@ -332261,6 +332385,14 @@
       "fb1a38c67c91418068e1b494291c8b927ff4229c",
       []
      ],
+     "nth-child-of-attribute.html.ini": [
+      "c5e022404398c62128a97fb74f980b60ced9c066",
+      []
+     ],
+     "nth-child-of-classname-002.html.ini": [
+      "618d0d20ac12fc8d0f5d32bbfc132d7df3a75484",
+      []
+     ],
      "nth-child-of-classname-ref.html": [
       "b424e73b4508f255cbdbdcaf88446961e7814727",
       []
@@ -332285,6 +332417,18 @@
       "ad0be69748d286b5de5b2cf3e863ea0c5ccb9b56",
       []
      ],
+     "nth-child-of-has.html.ini": [
+      "f9ae9a26de4f9dcc6a4f6ed0d722d2f5751eadfe",
+      []
+     ],
+     "nth-child-of-not.html.ini": [
+      "85379cd3514513168ee50cc7f6df9279ba3dcf2a",
+      []
+     ],
+     "nth-child-of-nth-child.html.ini": [
+      "e98ea78c8dbc72bcd817211d18f8d7637ae63205",
+      []
+     ],
      "nth-child-of-tagname-ref.html": [
       "99c8262b4f36dd60e9bf6ee1afa5229579eb22a1",
       []
@@ -332293,6 +332437,10 @@
       "00f52e3f5f2252db2577c6f74346b75846264827",
       []
      ],
+     "nth-child-of-universal-selector.html.ini": [
+      "ab158554b19b30a86527a078af7dc9e7bea46cf7",
+      []
+     ],
      "nth-child-specificity-1-ref.html": [
       "df70316c8d1b79a79a6077529145e116709e9fc8",
       []
@@ -332948,7 +333096,7 @@
       []
      ],
      "ElementInternals-target-element-is-held-strongly.html.ini": [
-      "63d58fb3f93cf79a8656be307a6b3f3544365331",
+      "64240c7da3675b2e19a60595557e1f8dc3938b1b",
       []
      ],
      "ElementInternals-validation-expected.txt": [
@@ -334572,7 +334720,7 @@
       []
      ],
      "Range-mutations-dataChange.html.ini": [
-      "c1f1d46ce54df403fe78ec637233281dbb7e2fef",
+      "7158a50a34d3428f41cd3a6672018936c2c3c088",
       []
      ],
      "Range-mutations-deleteData.html.ini": [
@@ -334856,10 +335004,6 @@
       []
      ]
     },
-    "xml_xpath_runner.html.ini": [
-     "d9cf144f7622c2b5a420f302ccc913566c09b89d",
-     []
-    ],
     "xml_xpath_tests.xml": [
      "91d6428f48a15056fb6d7f4a3d567dcfe580511d",
      []
@@ -336464,12 +336608,8 @@
      "8a0128f170825d019960d561cf2e50936da4d380",
      []
     ],
-    "image-carousel.html.ini": [
-     "a0d1c2a68ac09c65f7dc7192477a6571d9897687",
-     []
-    ],
     "image-src-change.html.ini": [
-     "8a259054e48a446cf976cdea64e773a01bb53338",
+     "23803ef3a129782dacf4440beb982386608de5ac",
      []
     ],
     "images-repeated-resource.html.ini": [
@@ -336481,7 +336621,7 @@
      []
     ],
     "observe-multiple-images.html.ini": [
-     "0be2f864b0cdc44ca48f71c340911afecb310b40",
+     "798b1558db005d9aceb329ba59eb813ded1461cb",
      []
     ],
     "resources": {
@@ -336627,7 +336767,7 @@
        []
       ],
       "eucjp-encode-form-cseucpkdfmtjapanese.html.ini": [
-       "e839ecd24cb8c98457093f86396478ab941f9eb7",
+       "2c9f8abcfef9cf2ec6478777dff2b633efa33cd0",
        []
       ],
       "eucjp-encode-form-errors-han.html.headers": [
@@ -336659,7 +336799,7 @@
        []
       ],
       "eucjp-encode-href-errors-han.html.ini": [
-       "41f5d57242cdc331e0af5704d4aa6454aa9f8cdb",
+       "5aa7112eecb4672185416a08f41ddafc68804125",
        []
       ],
       "eucjp-encode-href-errors-hangul.html.headers": [
@@ -336971,7 +337111,7 @@
     "legacy-mb-korean": {
      "euc-kr": {
       "euckr-decode-iso-ir-149.html.ini": [
-       "56a36e4682528cb76fe46bf7749a29edbc02dec6",
+       "50f8f02df430975536ed137acfde4224c3041ec1",
        []
       ],
       "euckr-decode-ksc5601.html.ini": [
@@ -337493,7 +337633,7 @@
      []
     ],
     "unsupported-labels.window.js.ini": [
-     "450e960b98d0e4b0d49c321f740d312acdb15b08",
+     "090aad902bb808bc6fbc4246301ded69a3fc9083",
      []
     ]
    },
@@ -339274,10 +339414,6 @@
        "dad8083eda643cfbf24e7fca2fcd0d947029cc96",
        []
       ],
-      "keepalive.html.ini": [
-       "d7c7aa213529cc70685e51c1ffdcc3ba5254f1ad",
-       []
-      ],
       "response-null-body.any-expected.txt": [
        "fa818f443d303b3903069f46bc8824dd2bf8bb27",
        []
@@ -339334,10 +339470,6 @@
       ]
      },
      "cors": {
-      "cors-cookies-redirect.any.js.ini": [
-       "c876095870f60714f2125f25fe2c1ab014bb59d1",
-       []
-      ],
       "cors-cookies.any.js.ini": [
        "25463cf3ec256911e62621e37ad60edeada1f2ea",
        []
@@ -341292,7 +341424,7 @@
       []
      ],
      "iframe.tentative.https.window.js.ini": [
-      "feb271922656ded4d6f595bf5ea223ece84cec25",
+      "890cec5a04fae4f1a3c4aabf1ed44c87437bd099",
       []
      ],
      "iframe.tentative.window-expected.txt": [
@@ -341402,7 +341534,7 @@
       ]
      },
      "service-worker-background-fetch.https.window.js.ini": [
-      "fcf7be672437092cc71da87303b3209e4bccb8de",
+      "3814b1ca441cfbcbedb4fc4d09443cc05aca0bb1",
       []
      ],
      "shared-worker.window.js.ini": [
@@ -341739,7 +341871,7 @@
      []
     ],
     "focus-already-focused-iframe-same-site.html.ini": [
-     "c8cb0f97f7b02f70990a80ee9fe25f1d9b8db7a2",
+     "4f0bb0ce512506e160d3de8c8bdf6bbc231d11df",
      []
     ],
     "focus-event-after-focusing-iframes-expected.txt": [
@@ -341834,10 +341966,6 @@
      "e440e9e575b966161c07c08962db749da7dd18f0",
      []
     ],
-    "iframe-focuses-parent-different-site.html.ini": [
-     "3b3149b7628f1741781e0c2c6b8084dfd9d94ab5",
-     []
-    ],
     "iframe-focuses-parent-same-site.html.ini": [
      "d1216e1d8a23a7492fa8a842c6618e0bea2b22cb",
      []
@@ -343270,6 +343398,10 @@
      "5f74d8ebc6ef94e16b7e2dbe24ee4d2345293d4d",
      []
     ],
+    "FileSystemFileHandle-create-sync-access-handle.https.tentative.window.js.ini": [
+     "c3348a5c9aef335e28df011c41c92883beabaef3",
+     []
+    ],
     "META.yml": [
      "23d7765cdfa39689ef72ae6a0beb15b8b4292ecd",
      []
@@ -344174,7 +344306,7 @@
       []
      ],
      "embedding.tentative.https.window.js.ini": [
-      "b0a79cea3442c69f8f46909c4331869e0743bb7f",
+      "0df41291829049cdae35d0c5c10c38d5454e70b3",
       []
      ],
      "fenced-frame-bypass.tentative.https.window-expected.txt": [
@@ -344340,7 +344472,7 @@
         []
        ],
        "service-worker-controlled-after-restore.https.html.ini": [
-        "947eebb79e872c0b41bbc874374501b302b00766",
+        "33ae6cd3b8e4ec3c488be40135c9595cf611c14e",
         []
        ],
        "service-worker-unregister.https-expected.txt": [
@@ -345060,7 +345192,7 @@
         []
        ],
        "same-document-traversal-cross-document-traversal.html.ini": [
-        "dcb750585df15799d66d64f38c40bf5550388f3d",
+        "dfb85789086b335a472830d405460b0e959e4527",
         []
        ],
        "same-document-traversal-same-document-traversal-hashchange.html.ini": [
@@ -345493,6 +345625,10 @@
         "2a8989f27252570aa49ada5a1e6eefbddfd9b207",
         []
        ],
+       "combination_history_006.html.ini": [
+        "a339e37fb2dee62a70403a338ee10df1a684f356",
+        []
+       ],
        "history-state-after-bfcache.window.js.ini": [
         "3ff7eb10abd8ea6e78075c57bb4326858481877d",
         []
@@ -345738,7 +345874,7 @@
         []
        ],
        "location-protocol-setter-non-broken.html.ini": [
-        "264d685c8ed95c01f6e75a969ba08478dc0b6ad9",
+        "ac462d6e03f5c33c1a9ca6bee3a40b5b116bbe48",
         []
        ],
        "location-prototype-setting-cross-origin-domain.sub-expected.txt": [
@@ -346019,7 +346155,7 @@
          []
         ],
         "parent-no-child-yeswithparams-subdomain.sub.https.html.ini": [
-         "b8908297e24c4d3e50da801af46e51367b87b640",
+         "d15b316888e55b5f40bc7bde5cd2b1e68642e10e",
          []
         ],
         "parent-yes-child-no-port.sub.https.html.headers": [
@@ -346043,7 +346179,7 @@
          []
         ],
         "parent-yes-child-no-subdomain.sub.https.html.ini": [
-         "93a8eb62979356b226897242f3066277314477ba",
+         "61e0306ed4771662e0ee52578eb4fd2e6021fae3",
          []
         ],
         "parent-yes-child-yes-port.sub.https.html.headers": [
@@ -346059,7 +346195,7 @@
          []
         ],
         "parent-yes-child-yes-same.sub.https.html.ini": [
-         "2b7fa4f27546ce75c088fb484df17a380bfb685f",
+         "21a226635de11b863215c756aee7b0791a7e43bb",
          []
         ],
         "parent-yes-child-yes-subdomain.sub.https.html.headers": [
@@ -346077,7 +346213,7 @@
          []
         ],
         "parent-no-child1-no-subdomain-child2-yes-subdomainport.sub.https.html.ini": [
-         "0683058aa8593b6e30db1cdc6eb373b40d530f0d",
+         "f003cfe350ffcf7e73a77bb9be01b03a9d5ceab2",
          []
         ],
         "parent-no-child1-no-subdomain1-child2-yes-subdomain2.sub.https.html.ini": [
@@ -346097,7 +346233,7 @@
          []
         ],
         "parent-yes-child1-no-subdomain-child2-no-subdomain.sub.https.html.ini": [
-         "cab93f6bf86938db656efb5719ca85199e00a98d",
+         "c6fbd89df5b44a3a8ecefc65e4c694ceff947001",
          []
         ],
         "parent-yes-child1-no-subdomain-child2-no-subdomain2.sub.https.html.headers": [
@@ -346105,7 +346241,7 @@
          []
         ],
         "parent-yes-child1-no-subdomain-child2-no-subdomain2.sub.https.html.ini": [
-         "88e01c23c05e0b1cf276e1b77dbdae6a15f4eb3f",
+         "0ac9250ffd71604ebaff886dd6e2dce32749f37a",
          []
         ],
         "parent-yes-child1-no-subdomain-child2-yes-subdomain.sub.https.html.headers": [
@@ -346121,7 +346257,7 @@
          []
         ],
         "parent-yes-child1-no-subdomain-child2-yes-subdomain2.sub.https.html.ini": [
-         "9bcd06566805156e9c14fabd814b7d34a3a803aa",
+         "ba2d6b65f1a39453e0538ad93d21f648db1c614b",
          []
         ],
         "parent-yes-child1-no-subdomain-child2-yes-subdomainport.sub.https.html.headers": [
@@ -346129,7 +346265,7 @@
          []
         ],
         "parent-yes-child1-no-subdomain-child2-yes-subdomainport.sub.https.html.ini": [
-         "83497785eecbb458d7175b44068eded801e7149d",
+         "7ba4e734b61e2c82f12f4dbf60462f5c2ae1ad9d",
          []
         ],
         "parent-yes-child1-yes-subdomain-child2-no-port.sub.https.html.headers": [
@@ -346137,7 +346273,7 @@
          []
         ],
         "parent-yes-child1-yes-subdomain-child2-no-port.sub.https.html.ini": [
-         "c238adfaadae7c4c7124d771fef8a9d5b858c496",
+         "a3efc43445f1e3cccf221af3c9c8d998933718d1",
          []
         ],
         "parent-yes-child1-yes-subdomain-child2-no-subdomain.sub.https.html.headers": [
@@ -346145,7 +346281,7 @@
          []
         ],
         "parent-yes-child1-yes-subdomain-child2-no-subdomain.sub.https.html.ini": [
-         "6ede574cc72edecd72afbc2d5170c18e72b73e07",
+         "bb8a3cbbad45f294edb5ba2e60bdee1f32acd5ea",
          []
         ],
         "parent-yes-child1-yes-subdomain-child2-yes-subdomain.sub.https.html.headers": [
@@ -346153,7 +346289,7 @@
          []
         ],
         "parent-yes-child1-yes-subdomain-child2-yes-subdomain.sub.https.html.ini": [
-         "3be8b66c60fbd9a158e332ffde611ae30634ba03",
+         "3735ac72c3449fd8f75119de464ed3f0c7ac7b2d",
          []
         ],
         "parent-yes-child1-yes-subdomain-child2-yes-subdomain2.sub.https.html.headers": [
@@ -346169,7 +346305,7 @@
          []
         ],
         "parent-yes-child1-yes-subdomain-child2-yes-subdomainport.sub.https.html.ini": [
-         "5d32ec5292fe848a54d90077ed51e6a7dbba3c9e",
+         "753d9e5b271252aac128a0096a212584a2a0c801",
          []
         ]
        },
@@ -346198,7 +346334,7 @@
         []
        ],
        "document-domain.sub.https.html.ini": [
-        "39fb46a8bb87617808a3900ee27cf2423ac3fba4",
+        "869ca53974fc5512b3d77d40bb6af87fc5dd3c95",
         []
        ],
        "getter-special-cases": {
@@ -346242,6 +346378,10 @@
          "79a20f30fc0f486014c8b93edef7483605101504",
          []
         ],
+        "removed-iframe.sub.https.html.ini": [
+         "55f11aaf08ab4b06ada0ae665685c483a7805dd2",
+         []
+        ],
         "resources": {
          "data-to-javascript-test.mjs": [
           "3a88253ee3053465472ef7d6ecba74b92fab79ce",
@@ -346281,7 +346421,7 @@
          []
         ],
         "sandboxed-same-origin-iframe-yes.https.html.ini": [
-         "3b19d0f6a64e2c2aa8938f39531dd585f1d146c1",
+         "e6f5815e73121d3e298955c5849616fd2807cf2f",
          []
         ]
        },
@@ -346290,7 +346430,7 @@
         []
        ],
        "going-back.sub.https.html.ini": [
-        "9f1f582920d6579cb959b2e532f081cb5c381068",
+        "b8b3d6a7c0bfac2f3b71e6593f59743f498cbc95",
         []
        ],
        "iframe-navigation": {
@@ -346299,11 +346439,11 @@
          []
         ],
         "parent-no-1-no-same-2-yes-subdomain.sub.https.html.ini": [
-         "20a6fc5c946789e32a60929cb0a56c0537a6711c",
+         "8cdf9fa61dd7eeee83b1787df8f2f09ab779f3a8",
          []
         ],
         "parent-no-1-no-subdomain-2-yes-subdomain.sub.https.html.ini": [
-         "27358051e1ca47c2ddf73b601b5babaa5c4c7a4c",
+         "5a2bf369185e39e6555b97cf11ca022bf431b003",
          []
         ],
         "parent-no-1-no-subdomain-2-yes-subdomain2.sub.https.html.ini": [
@@ -346311,11 +346451,11 @@
          []
         ],
         "parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html.ini": [
-         "cb3c21c0dc796ccb17dbe3ebf218bb5857e1cca1",
+         "ca40622a9c484ecd0b670f34e185695e3a37b0d3",
          []
         ],
         "parent-no-1-yes-subdomain-2-no-subdomain.sub.https.html.ini": [
-         "cf2645dc4d01b9cb598bbbbddb5609508a8fc2ad",
+         "6e7ddbd400fd09d59fcb7a84cd81c88fc63c91f5",
          []
         ],
         "parent-yes-1-no-same-2-no-port.sub.https.html.headers": [
@@ -346323,7 +346463,7 @@
          []
         ],
         "parent-yes-1-no-same-2-no-port.sub.https.html.ini": [
-         "cb86ed171952ddad4f48d8833923242fd7526eb6",
+         "9f3db00e5426b1f6da684a1e25a80791f9f94af0",
          []
         ],
         "parent-yes-1-no-same-2-no-subdomain.sub.https.html.headers": [
@@ -346331,7 +346471,7 @@
          []
         ],
         "parent-yes-1-no-same-2-no-subdomain.sub.https.html.ini": [
-         "07f864d7e3b035e56c8145d79ccfed64f3cb0cd0",
+         "70e77cb089b7c0bff843cd45dde4d795e359e3ff",
          []
         ]
        },
@@ -346345,11 +346485,11 @@
        ],
        "popups": {
         "opener-no-openee-yes-same.sub.https.html.ini": [
-         "0f5a12ba37764c13f8bfd46519f5106dfae1f2da",
+         "a9c874997282efab826ddbfe46535ce0930ebef0",
          []
         ],
         "opener-no-openee-yes-subdomain.sub.https.html.ini": [
-         "53f643b2ab400284b04206829d9e9e277fee6d02",
+         "575ec913b83267f45fd77d5c5f8dd9290ad2bfb1",
          []
         ],
         "opener-yes-openee-no-port.sub.https.html.headers": [
@@ -346373,7 +346513,7 @@
          []
         ],
         "opener-yes-openee-no-subdomain.sub.https.html.ini": [
-         "83fcc1fe1ce693d1b36c9ca3daef9ab38cb52aa6",
+         "c3ea49453cb248dafb7cbbee1b8e11fd0cfa6ad2",
          []
         ],
         "opener-yes-openee-yes-port.sub.https.html.headers": [
@@ -346397,7 +346537,7 @@
          []
         ],
         "opener-yes-openee-yes-subdomain.sub.https.html.ini": [
-         "37cb728002347d5f191f4e817cfb7cc7c531574c",
+         "5ec40809a53c4531066a5390fc579f9179351a42",
          []
         ]
        },
@@ -346820,7 +346960,7 @@
         []
        ],
        "open-features-tokenization-noreferrer.html.ini": [
-        "05abd9e3a9de2ce891593d9fefa2cbb23f2256c7",
+        "725998e292a937237519284d10ef0d38ee935376",
         []
        ],
        "open-features-tokenization-screenx-screeny-expected.txt": [
@@ -346839,6 +346979,10 @@
         "e05e8a3bcbab57f52352fb305219cb1af318369a",
         []
        ],
+       "open-features-tokenization-width-height.html.ini": [
+        "25200b9fcdb4c04d9579be0768e9efcbb236abbc",
+        []
+       ],
        "resources": {
         "close-self.html": [
          "0c0cf9fc4911de2404a6b9247c862297c22038f1",
@@ -346908,10 +347052,6 @@
        "ba9df39fbb40986537c7a4688da7dd7ea82e32f2",
        []
       ],
-      "window-open-noopener.html.ini": [
-       "d1fa6d11c2037beb1fcd86d03d6cf33cae5c772d",
-       []
-      ],
       "window-open-windowfeatures-values.html.ini": [
        "ef909a9fbff128dcd041f2de23ab974043d2a261",
        []
@@ -347009,10 +347149,6 @@
        }
       },
       "browsing-context-names": {
-       "choose-_blank-002.html.ini": [
-        "9038f75313fb646954d192d94240d99c52dac53c",
-        []
-       ],
        "choose-_top-001.html.ini": [
         "32ae56a123bf75f51fdd6c2937085ed6f23ee367",
         []
@@ -349037,7 +349173,7 @@
          []
         ],
         "offscreencanvas.resize.html.ini": [
-         "8640bb99063891357afcc9bbbd97670c823f6062",
+         "8b403278624c8259f64ff38cc1105d9fef0bcd87",
          []
         ],
         "offscreencanvas.transferrable-expected.txt": [
@@ -349588,10 +349724,6 @@
        "617fdcced505b4716e26dd11d57d4b6b97afb498",
        []
       ],
-      "link.https.window.js.ini": [
-       "1a3ff5b3de8f317a915fe5ffe347d319418c2639",
-       []
-      ],
       "reporting-subresource-corp.https.window.js.ini": [
        "6b202862d8f8070e74803bff00f78b8fe0d7aae1",
        []
@@ -349628,7 +349760,7 @@
       []
      ],
      "cross-origin-isolated-permission-worker.https.window.js.ini": [
-      "1cda697821f262d6ecbc160bfecc3bb8adceeec1",
+      "6e7bbd4c2a84c882cbbda69b8c029d1be6adbaa2",
       []
      ],
      "data.https.html.headers": [
@@ -349758,7 +349890,7 @@
       []
      ],
      "reporting-subresource-corp.https.html.ini": [
-      "87f642fbfcca4f592c2b5a3db09d67eefebb7c22",
+      "9560d8d6541b56b4f89b1c765fd870b6832d5131",
       []
      ],
      "reporting-to-document-reporting-endpoint.https.window.js.ini": [
@@ -350094,7 +350226,7 @@
       []
      ],
      "coop-sandbox-redirects-cuts-opener.https.html.ini": [
-      "4e04abec847ef90249bb0269c12f396588ccb318",
+      "72e5db08e7f4792d835e66099654e542337ae254",
       []
      ],
      "coop-sandbox.https.html.headers": [
@@ -350113,10 +350245,6 @@
       "54e44a7113def0babd42f726c878fc90db2e99f9",
       []
      ],
-     "header-parsing-non-ascii.https.html.ini": [
-      "fd3dc939f703306fd43690b7fd9745adbf9ab462",
-      []
-     ],
      "header-parsing-repeated.https.html.headers": [
       "85c58be8a1c60ed64b2efaed8a155fc5e087537e",
       []
@@ -350142,10 +350270,6 @@
        "a19f4400cea33a60c99807330704a23ee363b146",
        []
       ],
-      "popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html.ini": [
-       "8eb49f5a212bff324d3cda1f2fdce6305ecef148",
-       []
-      ],
       "popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html.headers": [
        "ab7b28948150ff64101ef080b0d9c7cc9a6a34d2",
        []
@@ -350158,6 +350282,10 @@
        "ab7b28948150ff64101ef080b0d9c7cc9a6a34d2",
        []
       ],
+      "popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.ini": [
+       "0ece312708b561da25f350af89dc0abe0c211465",
+       []
+      ],
       "popup-same-site-unsafe-allow-outgoing-with-same-site.https.html.headers": [
        "ab7b28948150ff64101ef080b0d9c7cc9a6a34d2",
        []
@@ -350184,7 +350312,7 @@
       []
      ],
      "iframe-popup-same-origin-allow-popups-to-same-origin-allow-popups.https.html.ini": [
-      "c563da96ae7db292b99ebc70c87b9edccad35854",
+      "9813f106a943082c0ada51f0901e211e4976fda1",
       []
      ],
      "iframe-popup-same-origin-allow-popups-to-same-origin.https.html.headers": [
@@ -350216,7 +350344,7 @@
       []
      ],
      "iframe-popup-same-origin-to-unsafe-none.https.html.ini": [
-      "8eec1633c1b737c49a14249cda902fca3a7199de",
+      "59c33be4dc23119fc1364f47d317e10cb1c0e694",
       []
      ],
      "iframe-popup-unsafe-none-to-same-origin.https.html.headers": [
@@ -350236,7 +350364,7 @@
       []
      ],
      "javascript-url.https.html.ini": [
-      "e3e0f9d7beee8b0cccbb3ff460301dfaa41d7af3",
+      "b8259e3c03d830289a8317907222a0b6984cf96c",
       []
      ],
      "navigate-to-aboutblank.https.html.ini": [
@@ -350244,7 +350372,7 @@
       []
      ],
      "navigate-top-to-aboutblank.https.html.ini": [
-      "9a870f326761ec39f19400ba17730a2b1b0e0d3f",
+      "d5c6b7629520bbf8969208c96e72707a0ef0454e",
       []
      ],
      "no-https.html.headers": [
@@ -350260,7 +350388,7 @@
       []
      ],
      "popup-redirect-cache.https.html.ini": [
-      "116d941d428fbfa26f872f871a093845f4d50997",
+      "9c8fdd8eaea28070402a7e7d7d330a03eae331dd",
       []
      ],
      "popup-same-origin-allow-popups-with-cross-origin.https.html.headers": [
@@ -350291,10 +350419,6 @@
       "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
       []
      ],
-     "popup-same-origin-with-cross-origin.https.html.ini": [
-      "21a59714180eda6dc32740cb17bb5ba12d8b47bc",
-      []
-     ],
      "popup-same-origin-with-same-origin.https.html.headers": [
       "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
       []
@@ -350324,7 +350448,7 @@
       []
      ],
      "popup-unsafe-none-with-same-site.https.html.ini": [
-      "604de218d0bb79bd663522c70ec31d106a271e02",
+      "c087e20995b049d95a5478c10ced52f7f2ee2b68",
       []
      ],
      "popup-unspecified-with-cross-origin.https.html.ini": [
@@ -350342,7 +350466,7 @@
       ],
       "access-reporting": {
        "access-from-coop-page-to-openee_coop-ro.https.html.ini": [
-        "4ca363c7fe04cdbcceba5b8f932f804456ded41c",
+        "59258e97f4655d24edc749db900a792e73a39960",
         []
        ],
        "access-from-coop-page-to-openee_coop-ro_cross-origin.https.html.ini": [
@@ -350354,15 +350478,15 @@
         []
        ],
        "access-from-coop-page-to-opener_coop-ro_cross-origin.https.html.ini": [
-        "175280c7794d5b00b32df3f0956391597d1a57c8",
+        "7e47b2b087718e36e4eb39f8f05e9e258cacf00e",
         []
        ],
        "access-from-coop-page-to-other_coop-ro.https.html.ini": [
-        "999c88e225df21421bac3afd627d251aa9efbe3d",
+        "ad1f3046344665f83be193b63ccc46c1a691c671",
         []
        ],
        "access-from-coop-page-to-other_coop-ro_cross-origin.https.html.ini": [
-        "dd5c96b2e6d713af4e5402595b2b6e459a64352e",
+        "56b8e031cc1caaee836abb34f380ea522c92155c",
         []
        ],
        "access-to-coop-page-from-openee_coop-ro.https.html.ini": [
@@ -350370,7 +350494,7 @@
         []
        ],
        "access-to-coop-page-from-openee_coop-ro_cross-origin.https.html.ini": [
-        "a07396ec29b90d8998c0949887aa263615f8ad36",
+        "c12963c37c283f6c853bb9f9ef36b7cf83c9d0df",
         []
        ],
        "access-to-coop-page-from-opener_coop-ro.https.html.ini": [
@@ -350382,11 +350506,11 @@
         []
        ],
        "access-to-coop-page-from-other_coop-ro.https.html.ini": [
-        "22693c3d4521115956429a962468b7b769327914",
+        "12463d2a477294446d1b508952f81fdfcfd6296e",
         []
        ],
        "access-to-coop-page-from-other_coop-ro_cross-origin.https.html.ini": [
-        "9d900f4ef49f137c4a203c800383fa3e42adb161",
+        "987140811a565d21b6c4340dff8edb655ddbdfc8",
         []
        ],
        "property-blur.https.html.ini": [
@@ -350394,11 +350518,11 @@
         []
        ],
        "property-close.https.html.ini": [
-        "d060d8a9a82f184a955fafb94ee2e1d4c9cd3835",
+        "1abd8a1dede334d349e7c131b3181b1017a49492",
         []
        ],
        "property-closed.https.html.ini": [
-        "ad0e9b09c8038704d41611c2b79cea264d3166a5",
+        "99d03e52c48257ee3f09f39d33bd132d1b50431e",
         []
        ],
        "property-focus.https.html.ini": [
@@ -350422,11 +350546,11 @@
         []
        ],
        "property-location-get.https.html.ini": [
-        "dcfc817f31fcf4a341eb76091e727fe7c65216a4",
+        "0523467e2f58e3f3eb288109d8dde786596545ff",
         []
        ],
        "property-location-set.https.html.ini": [
-        "1ee952d5aa7319c3919b0f9ccbe3df106c9bd3e5",
+        "175abd50466fb400cd12a2037fe8c45562610689",
         []
        ],
        "property-named-getter.https.html.headers": [
@@ -350484,7 +350608,7 @@
         []
        ],
        "report-to-both_coop-ro.https.html.ini": [
-        "290a3066beaf69f8410f6aad0e6425704774639a",
+        "a842eff9ac98cb00647a6efcc5b1ccf5ebfa0ae5",
         []
        ],
        "reporting-redirect-with-same-origin-allow-popups.https.html.ini": [
@@ -350492,7 +350616,7 @@
         []
        ],
        "reporting-redirect-with-unsafe-none.https.html.ini": [
-        "7b11492b982a5f967e17720d55c7e546173d1e25",
+        "f6002819e54c01078fa964d9f2565d8801071f6b",
         []
        ]
       },
@@ -350686,7 +350810,7 @@
         []
        ],
        "iframe-popup-to-so.https.html.ini": [
-        "da58f27fb7b8428ecc21b1243aa4cbb033cee871",
+        "2451a4e76d7be93cdd583e20dac264d5707d4b4a",
         []
        ],
        "iframe-popup-to-soap.https.html.headers": [
@@ -350694,7 +350818,7 @@
         []
        ],
        "iframe-popup-to-soap.https.html.ini": [
-        "dd70f03b2e8d09c23ac6f0ee6e91bb37edf4b0e9",
+        "29c6cc0dd3522ee4cb6e00b8dbb65caeb095415d",
         []
        ],
        "iframe-popup-to-un.https.html.headers": [
@@ -350730,7 +350854,7 @@
         []
        ],
        "iframe-popup.https.html.ini": [
-        "4f6dc509504b25a91462730fcac2315ccc823f69",
+        "f3681f22e7aaacd0c447883a6d4c2e4b530cfde0",
         []
        ],
        "iframe-popup.https_1-2-expected.txt": [
@@ -350778,7 +350902,7 @@
         []
        ],
        "popup-soap.https.html.ini": [
-        "edddc8edd0f3e2c3805bcc449f605bf7d4c52b86",
+        "75e0479d6d2166149de81f39c592b534987d71e9",
         []
        ],
        "popup-u.https-expected.txt": [
@@ -350798,7 +350922,7 @@
         []
        ],
        "popup-un.https.html.ini": [
-        "245d44f04bd04c497a587d0b1f23c067a3808476",
+        "1fa6809af65f62531cd6f9859c421595da663651",
         []
        ],
        "popup-with-cross-origin.https-expected.txt": [
@@ -350822,7 +350946,7 @@
         []
        ],
        "popup-with-same-origin.https.html.ini": [
-        "a2bc292d5496bafa25dc8d092a25dc18e19e6747",
+        "ed48901eceb081bfedf157f9b69b0d079b190504",
         []
        ],
        "popup-with-same-site.https-expected.txt": [
@@ -350902,7 +351026,7 @@
         []
        ],
        "document-cookie.html.ini": [
-        "b9b8e1df1df72eda3ae73786de4a36e371feb0b8",
+        "87ed3754a09930097225b085f7f8528dd5256968",
         []
        ],
        "document-lastModified.html.headers": [
@@ -351394,10 +351518,6 @@
       []
      ],
      "render-blocking": {
-      "parser-inserted-async-script.tentative.html.ini": [
-       "632b0b9d9583e1f5040e25fd4ff40981355387d4",
-       []
-      ],
       "script-inserted-script.html.ini": [
        "e11044cfb6253752396bd957d05295fc1d8c2c07",
        []
@@ -354730,7 +354850,7 @@
         []
        ],
        "nested-sharedworker-success.https.html.ini": [
-        "5a66574c42bf7a931d1aaf76e732d9392d30545c",
+        "84f2fbede9fb26113e2a7bdfe14a72929d558325",
         []
        ],
        "nested-worker-success-sharedworker-expected.txt": [
@@ -357123,11 +357243,11 @@
          []
         ],
         "resource-selection-invoke-insert-source-not-in-document.html.ini": [
-         "98a26c7758bc186dcb366e39958d7abbc649c309",
+         "ebefe86fc2c8480af3be6ce162825dc94d92ea92",
          []
         ],
         "resource-selection-invoke-insert-source.html.ini": [
-         "b9e47853f8f672609ae70204e6051675a51d8f81",
+         "90bfb401de4601bdb01e22caa517ec61f3a10f98",
          []
         ],
         "resource-selection-invoke-load.html.ini": [
@@ -357135,7 +357255,7 @@
          []
         ],
         "resource-selection-invoke-pause-networkState.html.ini": [
-         "625313ce7ce214f1638efb76cae7b83166a7e0b5",
+         "e889ab762e3f0df906ff3f35139c60e0c4a89904",
          []
         ],
         "resource-selection-invoke-pause.html.ini": [
@@ -357159,7 +357279,7 @@
          []
         ],
         "resource-selection-invoke-set-src.html.ini": [
-         "5ae5fd03f7cc9c647b2824ad73c06f9122056d3f",
+         "c0581652ef344bf42e125cffdd9d6761b9b91d4b",
          []
         ],
         "resource-selection-pointer-control-expected.txt": [
@@ -357650,7 +357770,7 @@
           []
          ],
          "track-cue-rendering-after-controls-removed.html.ini": [
-          "d59d9c455aeeed468fac2437754c458a0d451b2a",
+          "b8c518756115d3539b607029e542f0518beb6eef",
           []
          ],
          "track-cue-rendering-line-doesnt-fit-ref.html": [
@@ -358132,7 +358252,7 @@
         []
        ],
        "sandbox-top-navigation-grandchild.tentative.sub.window.js.ini": [
-        "3df57b35f2160059c115f0b8604e5d5fbffadc43",
+        "a28e10d1b54c3ae2e4e7420525752d6be185c9ce",
         []
        ],
        "stash.py": [
@@ -358534,7 +358654,7 @@
         []
        ],
        "relevant-mutations.html.ini": [
-        "b94e288abf8d232b67d67d3c2a1318a85c6b1d74",
+        "a2a70943012a5da848712dbfad045586284055df",
         []
        ],
        "resources": {
@@ -358858,7 +358978,7 @@
         ]
        },
        "text-plain.window.js.ini": [
-        "b00bae787f3c1b007382495adf5eb79134fd6c2a",
+        "cb83d32cb8ccfb32df71e75f9de873374613e46a",
         []
        ],
        "urlencoded2.window.js.ini": [
@@ -358875,6 +358995,10 @@
         "bbc3b71e9423b6a17b07c065e20b8435e4c492f4",
         []
        ],
+       "rel-base-target.html.ini": [
+        "790eba9e3b58b3a4bd400cd41bb618f8975f6765",
+        []
+       ],
        "rel-button-target.html.ini": [
         "12a80ad04dadb978f7708cf81d7932098afc3487",
         []
@@ -359212,7 +359336,7 @@
         []
        ],
        "selectmenu-form-state-restore.tentative.html.ini": [
-        "6da635881ddbcb0c883003e7088fa09934250230",
+        "977886abd19c277c5b4f96d1565ee53ee630341b",
         []
        ],
        "selectmenu-keyboard.tentative.html.ini": [
@@ -359620,7 +359744,7 @@
         []
        ],
        "activation-behavior.window.js.ini": [
-        "e49c667e4a0782a75a5de71bdb9d438f5e9b9310",
+        "ecf50d43fb2374c3282b88318c1ccb692e69fcf2",
         []
        ]
       },
@@ -363538,7 +363662,7 @@
         []
        ],
        "fully_active_document.window.js.ini": [
-        "d1bc92fb874c2ac02c5420802e4f5d80078c5c61",
+        "d2551570d63c0dc02604591ced25f84e3dbc8ef8",
         []
        ],
        "resources": {
@@ -363851,12 +363975,6 @@
        ]
       }
      },
-     "timers": {
-      "negative-settimeout.any.js.ini": [
-       "702bf536db201452cb7eefe3dfd0643a0c2b6a00",
-       []
-      ]
-     },
      "update-rendering": {
       "child-document-raf-order-expected.txt": [
        "f9ba495c5a66c946d32656087abe29b6b7e83097",
@@ -363963,7 +364081,7 @@
      []
     ],
     "idle-detection-allowed-by-permissions-policy.https.sub.html.ini": [
-     "2e5bbacb24c3289077d6bfd1b274b58fc382521f",
+     "6f363c189c39ce8e2921eb7be18b2a9a306423f7",
      []
     ],
     "idle-detection-default-permissions-policy.https.sub.html.ini": [
@@ -365064,7 +365182,7 @@
       []
      ],
      "webtransport-h3.https.sub.any.js.ini": [
-      "6b6492c0bd4ee4d00726ecc5c0ef85f225a11e27",
+      "667aadcf01418289fbe5842a37335b9cdddd9b56",
       []
      ],
      "wpt-server-wpt-flags.sub.html.ini": [
@@ -366455,7 +366573,7 @@
      []
     ],
     "cross-origin-iframe.sub.html.ini": [
-     "d1a46ba93bc6119e47e3849eaae14f44b33606c3",
+     "9d717d180321bcda14871a26f2dc3d1ca1183115",
      []
     ],
     "idlharness.window-expected.txt": [
@@ -366466,6 +366584,10 @@
      "a943671178997c89e4fb0751439a1efd490d7b9c",
      []
     ],
+    "iframe-no-root-with-wrapping-scroller.html.ini": [
+     "23c24a7451f085a31701cd72191d1931df4901ef",
+     []
+    ],
     "nested-cross-origin-iframe.sub.html.ini": [
      "eb080a976f546ede7d1c83d667442ed093024923",
      []
@@ -366755,7 +366877,7 @@
      ]
     },
     "first-paint-equals-lcp-text.html.ini": [
-     "8f534d54d7d8cb2973b5cd63be4feacb570cd5a8",
+     "414fac12328cb7673e09b335e5c0523920b513d0",
      []
     ],
     "image-upscaling-expected.txt": [
@@ -366934,7 +367056,7 @@
     ]
    },
    "lint.ignore": [
-    "0fb0c4c32a7f0b8071df7734d127eccb8f4c2a18",
+    "ac1d870c7aeb16e0351fcdfd0f6daf242fd4d548",
     []
    ],
    "loading": {
@@ -366948,7 +367070,7 @@
       []
      ],
      "coep-early-hints-none-final-require-corp.h2.window.js.ini": [
-      "ada632ca490344f65ce17e1842228340f25e5687",
+      "2e5ceac3a3a489c12beeeb14c2a3e2564b68411e",
       []
      ],
      "coep-early-hints-require-corp-final-none.h2.window.js.ini": [
@@ -366960,7 +367082,7 @@
       []
      ],
      "csp-early-hints-absent-final-allowed.h2.window.js.ini": [
-      "7de5e40c9322d93afab4bb2b45955846fbedf998",
+      "ffaf1c01d594063468d5fe5675988f8d7476cacb",
       []
      ],
      "csp-early-hints-absent-final-disallowed.h2.window.js.ini": [
@@ -366968,7 +367090,7 @@
       []
      ],
      "csp-early-hints-allowed-final-absent.h2.window.js.ini": [
-      "e5500a13a51e7ebbb6348084753f7ba9c6f3d5ad",
+      "989e58ba306126ae8d3f59f6b35d13ff2eed8f5f",
       []
      ],
      "csp-early-hints-allowed-final-allowed.h2.window.js.ini": [
@@ -366980,7 +367102,7 @@
       []
      ],
      "csp-early-hints-disallowed-final-absent.h2.window.js.ini": [
-      "3623b15ba197ed03804ac1755a8dc8fbca24d083",
+      "fd87f8922ffe578ca7a890ad9474292eb4e13ae2",
       []
      ],
      "csp-early-hints-disallowed-final-allowed.h2.window.js.ini": [
@@ -367004,7 +367126,7 @@
       []
      ],
      "preconnect-in-early-hints.h2.window.js.ini": [
-      "44bab0130afdb54b1150b07992afbb422005c142",
+      "7f528f05a3aedf26ee2cf33efb5adba153f8f06a",
       []
      ],
      "preload-finished-before-final-response.h2.window.js.ini": [
@@ -367036,7 +367158,7 @@
       []
      ],
      "preload-without-csp-document-disallow.h2.window.js.ini": [
-      "f3dd853fe394264145f6bc8b0b30470456446d0a",
+      "acb504f3ae440f2da85cfab12df322fbc141632f",
       []
      ],
      "redirect-cross-origin-between-early-hints.h2.window.js.ini": [
@@ -367647,7 +367769,7 @@
        []
       ],
       "legacy-mstyle-attributes.html.ini": [
-       "826bfe445bbe5c2a1ebb3b4395a6d0559d277726",
+       "be13767bc72bc889393b43bcd0a1a7d1b2c7856d",
        []
       ],
       "mrow-painting-order-ref.html": [
@@ -369050,7 +369172,7 @@
       []
      ],
      "mediasource-worker-play-terminate-worker.html.ini": [
-      "e4d323fb9c485e56942d51b20dac5dd030970f4e",
+      "933d86d6b29dc5d4ad92bcf7eef7eb882d1ff65f",
       []
      ],
      "mediasource-worker-play-terminate-worker.js": [
@@ -369103,7 +369225,7 @@
      []
     ],
     "mediasource-avtracks.html.ini": [
-     "e9e2a3279d52ddd25c754a1491392944a87b1337",
+     "96f7c14b2022b390197f0a210d80112d38b380ac",
      []
     ],
     "mediasource-buffered-expected.txt": [
@@ -369175,7 +369297,7 @@
      []
     ],
     "mediasource-duration.html.ini": [
-     "362786749a60ce8a682ac18c2bf511d3ee0044d3",
+     "80b5872ce666b1c4525a3027562fe82ea581b4c9",
      []
     ],
     "mediasource-endofstream-expected.txt": [
@@ -370821,7 +370943,7 @@
        []
       ],
       "navigate-initial-about-blank.html.ini": [
-       "b34e07a702ad587d2322cea8e0e3e449cd34fe0c",
+       "0adc9d25d34e98f89c4e1f5c0d4fc93353f67e81",
        []
       ],
       "navigate-intercept-interrupted.html.ini": [
@@ -371099,7 +371221,7 @@
      ]
     },
     "test-performance-attributes.sub.html.ini": [
-     "47d75920efa4ff2749eb551ff212abe5adec6984",
+     "a805bf5b9ad6dc7e516f2e9a170a435a803260fe",
      []
     ]
    },
@@ -371871,7 +371993,7 @@
      []
     ],
     "pending_beacon-sendondiscard.tentative.https.window.js.ini": [
-     "e40c36d935abe575b767fabee2130e5fe142f474",
+     "3150981433d33d4b9bab5c633af4455521a39d6a",
      []
     ],
     "pending_beacon-sendonhidden.tentative.https.window.js.ini": [
@@ -371883,7 +372005,11 @@
      []
     ],
     "pending_post_beacon-cors.tentative.https.window.js.ini": [
-     "bec5019ad846c33f82ce713acd9677c1d1cb53ab",
+     "b881b0f1c70e9546966361b3c489ef277029ee57",
+     []
+    ],
+    "pending_post_beacon-sendwithdata.tentative.https.window.js.ini": [
+     "7eb5ca584a60632e582b0839c6cd04da65bdc5a2",
      []
     ],
     "resources": {
@@ -371964,7 +372090,7 @@
       []
      ],
      "performance-navigation-timing-same-origin-bfcache.tentative.window.js.ini": [
-      "9d137351f5cc93dc66ca41b8db92923bb3b88d06",
+      "b54282c87d27e61eeef740199fbd9808dfea7775",
       []
      ],
      "performance-navigation-timing-same-origin-replace.tentative.window.js.ini": [
@@ -372125,7 +372251,7 @@
      []
     ],
     "bluetooth-allowed-by-permissions-policy.https.sub.html.ini": [
-     "99d782c218737ad081fbb8d7af991cdac8bffbd9",
+     "75a7b4b3c1bc3d3197b5f3e8631c1c6b45e8f36b",
      []
     ],
     "bluetooth-default-permissions-policy.https.sub.html.ini": [
@@ -372207,6 +372333,10 @@
       "a54ad04c8585af431bd123c07479959332908ee2",
       []
      ],
+     "unload-allowed-by-default.tentative.window.js.ini": [
+      "041aee22275f57b2ff32f9481e29fe1d43f9fa63",
+      []
+     ],
      "vertical-scroll-main-frame-manual.tentative.html.headers": [
       "8d9c01e14835acbc0af74b5b9157a4a8b95243f8",
       []
@@ -375575,7 +375705,7 @@
      []
     ],
     "reporting-isolated-across-navigations.https.sub.html.ini": [
-     "a20d66455b19b74ac1f8e1f917dd2bc5e21dec8a",
+     "2e790806d3c53de11d90330caa785419b314766f",
      []
     ],
     "resources": {
@@ -375715,11 +375845,11 @@
      []
     ],
     "deadline-max-rAF-dynamic.html.ini": [
-     "765815f1eee131d9ef45461f83becc63e5ac9e15",
+     "2c4667b17d5da143d16dc247ea61cdd37ffa4652",
      []
     ],
     "deadline-max-rAF.html.ini": [
-     "ff1add8eb5eddf272807a4a0078afbb6ae0a2ece",
+     "b79130fbda79534804c6f6ceba418570414f0677",
      []
     ],
     "deadline-max-timeout-dynamic.html.ini": [
@@ -375867,7 +375997,7 @@
      []
     ],
     "nested-context-navigations-iframe.html.ini": [
-     "d39ca2794ef6243886bea3c56d4d0fb464f317dd",
+     "99d8addf0105c7efab836200dbdee93ae0000ed3",
      []
     ],
     "nextHopProtocol-is-tao-protected.https.html.ini": [
@@ -375879,15 +376009,7 @@
      []
     ],
     "no-entries-for-cross-origin-css-fetched-memory-cache.sub.html.ini": [
-     "74539cf66d870dd2e6bcd91dfda36bba5bdc158b",
-     []
-    ],
-    "object-not-found-adds-entry.html.ini": [
-     "67ead0f212858416a930addfed49313e1b40bab2",
-     []
-    ],
-    "object-not-found-after-cross-origin-redirect.html.ini": [
-     "b666ec44251f453d2d2ebb93fa9d46c77ef39a72",
+     "e3208a2e825887d2974275c71f0204865dee39d6",
      []
     ],
     "ping-rt-entries-expected.txt": [
@@ -376040,7 +376162,7 @@
       []
      ],
      "entry-invariants.js": [
-      "4bef9496103ca61475f8041a7d2c57b2b5d9fc4e",
+      "e35ea289ce875e818544c4eb046a5cf72e10e9d1",
       []
      ],
      "eventsource.py": [
@@ -376212,7 +376334,7 @@
       []
      ],
      "resource-loaders.js": [
-      "102b7cc3a0b84e7b5ae273e89d06a73596d90775",
+      "5a859eb02de7850eff53d3b2c75256fc87892835",
       []
      ],
      "resource-timing-content-length.py": [
@@ -376285,7 +376407,7 @@
      ]
     },
     "response-status-code.html.ini": [
-     "28fcc51cd25b61a192ac3ba40f125915516918c1",
+     "b06a0aca565487ae30f8451e6e4b0f0fd54be721",
      []
     ],
     "sleep.py": [
@@ -378240,7 +378362,7 @@
       []
      ],
      "cache-add.https.any.js.ini": [
-      "d767838f6f4d36faf078102d06af84f1dd8df003",
+      "6e8112910d931e29fd8b86654e19cdd363ddc1d0",
       []
      ],
      "cache-add.https.any.serviceworker-expected.txt": [
@@ -378498,7 +378620,11 @@
       []
      ],
      "about-blank-replacement.https.html.ini": [
-      "b2a61d9c24fb4e80b97cb4747249e50855d8dddb",
+      "c59a16f3f05b2c5ffde6c477c227fb8ad9b3cf6a",
+      []
+     ],
+     "client-navigate.https.html.ini": [
+      "ed96e18bfc432651cc62c5b31786bd7fbde3f820",
       []
      ],
      "client-url-of-blob-url-worker.https-expected.txt": [
@@ -380394,7 +380520,7 @@
       []
      ],
      "unregister-immediately-during-extendable-events.https.html.ini": [
-      "481bcd7e47d21c05db4ca40a9de01c83015b14dc",
+      "acf3dea87b93fb7e85940d9a0b96f098f0efc1ab",
       []
      ],
      "unregister-then-register-new-script.https-expected.txt": [
@@ -381320,7 +381446,7 @@
       []
      ],
      "csp-script-src-self.html.ini": [
-      "74869a8f49c78f147115123ab464b842403e2660",
+      "a3b998acf566b79b35251c8f5bf334ed5927d393",
       []
      ],
      "csp-script-src-unsafe-inline.html.ini": [
@@ -381364,7 +381490,7 @@
       []
      ],
      "navigator-subapp.https.tentative.html.ini": [
-      "6a8f25d5c2a9b9a7d9c866a0fda375dcbdebf012",
+      "f08bb85533220d12dff83fe09f7471b129c34104",
       []
      ],
      "referrer-policy-from-rules.html.ini": [
@@ -381805,12 +381931,8 @@
        []
       ]
      },
-     "response-code-non-successful.html.ini": [
-      "29ab07e4877efdb9b14514e44c2d53d854a555cf",
-      []
-     ],
      "response-code-successful.html.ini": [
-      "2cbbf867b69b6b9cb88de86a4a378ffb9fa106b4",
+      "89a1086721a87066120b7eacd12af1479643e860",
       []
      ],
      "restriction-audio-setSinkId-with-invalid-sinkId.https.tentative.html.ini": [
@@ -381842,11 +381964,11 @@
       []
      ],
      "restriction-dedicated-worker.https.html.ini": [
-      "9362fa3dfd23e482e1bc3618d11486040fcb6064",
+      "4c890c0c2d50ca4fb5a4d1c20937fd13019d14f9",
       []
      ],
      "restriction-encrypted-media-unsupported-config.https.html.ini": [
-      "ac509131109042c158274df161ba214b7d1b8d4e",
+      "a6597b57e39191e52fa5af97b803ec5445912e9a",
       []
      ],
      "restriction-encrypted-media.https.html.ini": [
@@ -381858,7 +381980,7 @@
       []
      ],
      "restriction-idle-detection.https.html.ini": [
-      "d76b8a30f6210faa7fd84d1eeff78dc5a20e4986",
+      "ff11792f5358b3ebc78916b9c385ca8909406397",
       []
      ],
      "restriction-local-file-system-access.https.html.ini": [
@@ -381866,7 +381988,7 @@
       []
      ],
      "restriction-media-auto-play-attribute.html.ini": [
-      "163886691748f1816ef13538f5ddc7a19a4e1873",
+      "8abf5802b335c8d5bbfdb1c5d75db484fa20ce1c",
       []
      ],
      "restriction-media-camera.https.html.ini": [
@@ -381886,7 +382008,7 @@
       []
      ],
      "restriction-message-boxes.html.ini": [
-      "8bd97880f870a2162a3f55e3fd75921935149f95",
+      "a19061396a8e8780f34563f70ec2627d23d9f65a",
       []
      ],
      "restriction-midi-sysex.https.html.ini": [
@@ -381954,7 +382076,7 @@
       []
      ],
      "restriction-service-worker-update.https.html.ini": [
-      "f959936dc9c6c1a5b6c7043e506be3b5b2f89a5b",
+      "fb6c6b0ed6665fbfd6a343a00bbd1bb2c0bc17ac",
       []
      ],
      "restriction-speech-synthesis.html.ini": [
@@ -381974,7 +382096,7 @@
       []
      ],
      "restriction-web-locks.https.html.ini": [
-      "eb9f2ef76f3bb3a5a3e5124c258c2ba9d0bb3076",
+      "fee948408ed9489a5b2ce822478e4fe45c917103",
       []
      ],
      "restriction-web-nfc.https.html.ini": [
@@ -381986,7 +382108,7 @@
       []
      ],
      "restriction-web-share.https.html.ini": [
-      "6a5f19de3f558db0115949b8889e905aa1e511cb",
+      "f0101a566f68838984b93135e83d7b5434335db8",
       []
      ],
      "restriction-web-usb.https.html.ini": [
@@ -381998,7 +382120,7 @@
       []
      ],
      "restriction-web-xr-inline-session.https.html.ini": [
-      "6942089df4db415f51e4425c844b75a400e27e99",
+      "de3f51bc683e82fce24e6f41365797507fce9256",
       []
      ],
      "restriction-window-move.html.ini": [
@@ -382006,7 +382128,7 @@
       []
      ],
      "restriction-window-open.html.ini": [
-      "019af152c326faa960dda546c7abd4b4e0373aa9",
+      "73abde50066e763dcde1b4e9fcccacfb79df6b53",
       []
      ],
      "restriction-window-resize.html.ini": [
@@ -382018,7 +382140,7 @@
       []
      ],
      "sandbox-iframe.html.ini": [
-      "927719e21eb18e6cbc9bcc126862b6dd37c5d464",
+      "a287cc35ac55e5846e28a9a93f05e3c31f9b97fb",
       []
      ],
      "service-workers.https.html.ini": [
@@ -382034,7 +382156,7 @@
       []
      ],
      "session-history-navigation.https.html.ini": [
-      "af371ee09a55eb780e0120004213a1bedf7b4c2f",
+      "415a3a12191d7a34eaf77563cfefe781cb30152e",
       []
      ],
      "session-history-pushstate.https.html.ini": [
@@ -382078,7 +382200,7 @@
       []
      ],
      "windowclient-navigate.https.html.ini": [
-      "1ea18b66ef38498d1a9a053e0d365cdabc7308d3",
+      "f209d85eb5b81c6ed51464cd365c37a5a5377f02",
       []
      ],
      "workers.html.ini": [
@@ -382193,7 +382315,7 @@
      []
     ],
     "partitioned-estimate-usage-details-caches.tentative.https.sub.html.ini": [
-     "322ad2157ae639cae314cec8f16bcd57106ea03a",
+     "2cd29ff7971eb16cc9f1d82b79bff2fc258afeac",
      []
     ],
     "resources": {
@@ -385895,7 +386017,7 @@
      []
     ],
     "a-element-xhtml.xhtml.ini": [
-     "adfd7d0caab89c40351d00add7ff62524412ab73",
+     "e03a00de7bfaeba2d8535e73c48c1da007902843",
      []
     ],
     "a-element-xhtml_include=javascript-expected.txt": [
@@ -385907,7 +386029,7 @@
      []
     ],
     "a-element.html.ini": [
-     "769ff5e7dd807c42a63cd65f98d9b94d53e051ea",
+     "58ed526a67856df7c22a5b02136687d144b18efd",
      []
     ],
     "a-element_include=javascript-expected.txt": [
@@ -385919,7 +386041,7 @@
      []
     ],
     "failure.html.ini": [
-     "4364c892cde3d29b38bf7cace0017c9e9c5da053",
+     "97ce9874698c763da51039b3e9d709d2bb581aff",
      []
     ],
     "idlharness-shadowrealm.window-expected.txt": [
@@ -385930,10 +386052,6 @@
      "27b57a31bb5da2c0dcfdaffd9629930d71b3dbf3",
      []
     ],
-    "percent-encoding.window.js.ini": [
-     "36d57023fae6a0fbf2d834ab075a368470e527de",
-     []
-    ],
     "resources": {
      "a-element-origin.js": [
       "cb7d4a895c40c456c3f4c0ade050115319ad410c",
@@ -385952,7 +386070,7 @@
       []
      ],
      "setters_tests.json": [
-      "b709ef5234a4fd349ddabbf966a8a56f5e5fd7c5",
+      "cff93d83ba2f8dcb88347c3d86331c85c63f22fd",
       []
      ],
      "toascii.json": [
@@ -385969,7 +386087,7 @@
      []
     ],
     "toascii.window.js.ini": [
-     "9f9103a603e0878c54a5f28e95aa7c02edd3c71a",
+     "5cfe13bf17539c78cb35a60876727bad45c9caca",
      []
     ],
     "url-constructor.any.js.ini": [
@@ -385997,7 +386115,7 @@
      []
     ],
     "url-setters-a-area.window.js.ini": [
-     "ceb06238e565d86b8b7fd7f1364a808e4ad91ae9",
+     "f89c6466df4838f8fab7683b4ef38ea3d6c40809",
      []
     ],
     "url-setters-a-area.window_include=javascript-expected.txt": [
@@ -386005,7 +386123,7 @@
      []
     ],
     "url-setters-a-area.window_include=mailto-expected.txt": [
-     "713843927b398f5d6be2b933d1eb8b048525b0fd",
+     "addb92f18ff56a1fafa0d68021e13fb629d89f04",
      []
     ],
     "url-setters-stripping.any-expected.txt": [
@@ -386013,7 +386131,7 @@
      []
     ],
     "url-setters-stripping.any.js.ini": [
-     "68d160ce46ff159431e4f42981317470276bf2b6",
+     "5c23a98a6205bc1eeba0e0623b80063b03a8d6f1",
      []
     ],
     "url-setters-stripping.any.worker-expected.txt": [
@@ -386021,7 +386139,7 @@
      []
     ],
     "url-setters.any.js.ini": [
-     "9b7e5592636b5db3b12c78b3b4fa9ca64d27ce67",
+     "2cdb9571d4477e1a7b3ab2e4d56c4cb80477b6da",
      []
     ],
     "url-setters.any.worker_include=javascript-expected.txt": [
@@ -386029,7 +386147,7 @@
      []
     ],
     "url-setters.any.worker_include=mailto-expected.txt": [
-     "af68c2a184369e85042232c8363013fbe6af00ce",
+     "ce4605f8f22ba80fff2de147062fd010d992f14c",
      []
     ],
     "url-setters.any_include=javascript-expected.txt": [
@@ -386037,11 +386155,19 @@
      []
     ],
     "url-setters.any_include=mailto-expected.txt": [
-     "af68c2a184369e85042232c8363013fbe6af00ce",
+     "ce4605f8f22ba80fff2de147062fd010d992f14c",
+     []
+    ],
+    "urlsearchparams-delete.any-expected.txt": [
+     "2e788491cee9e3a84ec463ae936a0bb874558c00",
      []
     ],
     "urlsearchparams-delete.any.js.ini": [
-     "e2c3974e3be40dc22e3f981210605cc6e63d2161",
+     "9f22a447d7a66f9514b01ba4102d38c7aff7d171",
+     []
+    ],
+    "urlsearchparams-delete.any.worker-expected.txt": [
+     "2e788491cee9e3a84ec463ae936a0bb874558c00",
      []
     ],
     "urlsearchparams-get.any.js.ini": [
@@ -386049,7 +386175,7 @@
      []
     ],
     "urlsearchparams-stringifier.any.js.ini": [
-     "acdd4a89a63a0eb390ff0ae47d16c4300f74b64c",
+     "d7a376af68c4ac557519a2f40da1e69b5ec84702",
      []
     ]
    },
@@ -387053,10 +387179,6 @@
       "finished.html.ini": [
        "1e48fb216d8591cf61a0ad365c3dfa8068f77a72",
        []
-      ],
-      "onremove.html.ini": [
-       "b77dcd32d6654de3af56d5c4ce31bb77f6466fdf",
-       []
       ]
      },
      "KeyframeEffect": {
@@ -387252,6 +387374,10 @@
       ]
      },
      "timelines": {
+      "document-timelines.html.ini": [
+       "8c474c4dac8bc4767a86e055c819fe3f07b63f59",
+       []
+      ],
       "resources": {
        "target-frame.html": [
         "18ee4fd8a23e6a9b4f95068b418d4da1bdef1679",
@@ -387267,7 +387393,7 @@
        []
       ],
       "sibling-iframe-timeline.html.ini": [
-       "675b3f1bf576cac09b7b92d0a3579e3d0c26c018",
+       "96ae3e671d90670c8296fa6805886feb8a3f362f",
        []
       ],
       "timelines.html.ini": [
@@ -387750,12 +387876,8 @@
      "4423c326ffe912062124a75cc712052f08b5a15e",
      []
     ],
-    "query-ordering.tentative.https.html.ini": [
-     "55679228daedc14e37f98c9297c1755648885e1b",
-     []
-    ],
     "query.tentative.https.any.js.ini": [
-     "ce2966b3d29a183be238c0953ecf1f9b92275f21",
+     "c7d15b034eebc3ff91bcfe3f8a7cc87dd6180ebe",
      []
     ],
     "resources": {
@@ -388053,7 +388175,7 @@
      },
      "the-analysernode-interface": {
       "test-analyser-output.html.ini": [
-       "3b3be66a5d340b1b3522b416abedba243da0786d",
+       "448db8fda7ac24ef480e0b1c3f1078e2bac8ba2b",
        []
       ]
      },
@@ -388121,7 +388243,7 @@
        []
       ],
       "processing-after-resume.https.html.ini": [
-       "8d0542069ecfd58508bd89fad09c04914e8b1cad",
+       "a270ea3550af88ec08f4708d11884d9f9f5015fa",
        []
       ],
       "resources": {
@@ -389488,7 +389610,11 @@
        "ee2d51a254256761626e9d3e7743dad89caf0233",
        []
       ]
-     }
+     },
+     "workers.html.ini": [
+      "49c27878b8e2dd76c9318c237adb8158c68ad935",
+      []
+     ]
     },
     "message-channels": {
      "close-expected.txt": [
@@ -389526,7 +389652,7 @@
       []
      ],
      "worker-post-after-close.any.js.ini": [
-      "38e85428689067832d346340f862f98b5478bf08",
+      "be207b65f5e4c4892a8ea9cd2348035548674423",
       []
      ]
     },
@@ -389632,7 +389758,7 @@
       []
      ],
      "020.html.ini": [
-      "b35e66e6b3ce06b2885f4808ec48df56a5e255f0",
+      "265c7a6def4cc8db611bbcb8f304bdfab086a23c",
       []
      ],
      "021.html.ini": [
@@ -389812,6 +389938,10 @@
      "64e4c43f6578acec122ef22a3d4cc8f995ee780e",
      []
     ],
+    "RTCPeerConnection-connectionState.https.html.ini": [
+     "effd8e96568c1f5cd9d352e233b14556237d69fc",
+     []
+    ],
     "RTCPeerConnection-createAnswer-expected.txt": [
      "427284ce53c807f9352d209b513875919c071247",
      []
@@ -392245,6 +392375,10 @@
         "d4bd2b74c2db0e560114109af960c7f38cb38575",
         []
        ],
+       "audio_has_no_subtitles.html.ini": [
+        "6a131e93824e3d10701a21726ed463f487d76d3d",
+        []
+       ],
        "background.png": [
         "6d16cc84c4dd3b8777bd83d97888eaf8d351f6b5",
         []
@@ -394715,7 +394849,7 @@
      []
     ],
     "events_referenceSpace_reset_inline.https.html.ini": [
-     "fddaa5b930051715ecfd3f17869ba0b776c39b55",
+     "00c1d56bf0b835c4ab75baee491703b102791134",
      []
     ],
     "events_session_select.https.html.ini": [
@@ -394798,6 +394932,10 @@
      "ar_hittest_subscription_unlocalizable.https.html.ini": [
       "65043476afd3b63dec7abb0c67b197b0933e3df3",
       []
+     ],
+     "xrRay_matrix.https.html.ini": [
+      "43d34bacaeb185a3fb69d635848a055c5cd8b672",
+      []
      ]
     },
     "idlharness.https.window-expected.txt": [
@@ -395223,7 +395361,7 @@
     "baseurl": {
      "alpha": {
       "importScripts-in-worker.html.ini": [
-       "b871ad55841b590ec3aa1a040827b918a5778067",
+       "392414593b8d4abdf1723683f976defc53968401",
        []
       ],
       "sharedworker-in-worker-expected.txt": [
@@ -395501,7 +395639,7 @@
      []
     ],
     "dedicated-worker-from-blob-url.window.js.ini": [
-     "b6f8e24e5a0d7742cdd446ae46283964140925f2",
+     "1f41aff0a7de53851d266ce0855bfc593c0d3b1e",
      []
     ],
     "dedicated-worker-in-data-url-context.window-expected.txt": [
@@ -395529,10 +395667,6 @@
     "interfaces": {
      "DedicatedWorkerGlobalScope": {
       "postMessage": {
-       "event-ports-dedicated.html.ini": [
-        "de76679c52e1f392bba568eab8288b95a69b309e",
-        []
-       ],
        "event-ports-dedicated.js": [
         "c5cc9f8d9f580b43418045965b97bf4fd2ed371a",
         []
@@ -395643,10 +395777,6 @@
         "1c6515f8e201ef9439a48434033acafaecd68517",
         []
        ],
-       "redirect.html.ini": [
-        "3a0f10f26cb7bf5f58f70a9cb9691f6886a5421a",
-        []
-       ],
        "redirect.js": [
         "2db48544a2d7d7f55201043e73297283cd99c263",
         []
@@ -395693,7 +395823,11 @@
         "704098a6d868549316256c0f92718dd1b0a4d765",
         []
        ]
-      }
+      },
+      "self.any.js.ini": [
+       "33a7441fc4df465949c5344e5122921e9eed9b12",
+       []
+      ]
      },
      "WorkerUtils": {
       "WindowTimers": {
@@ -434856,14 +434990,14 @@
        ]
       ],
       "font-relative-units-dynamic.html": [
-       "36faf67c6d5edd20835f9c32fe2ddf780da3e1bf",
+       "f87a64a88ad14255ee4aeec39004f3cbe90270a2",
        [
         null,
         {}
        ]
       ],
       "font-relative-units.html": [
-       "5724da2030cd0f3e9c470332583a906e1cc18a38",
+       "9c05d7916f784a7900918e323adcb4e467db8ee0",
        [
         null,
         {}
@@ -458345,6 +458479,13 @@
        {}
       ]
      ],
+     "rch-invalidation.html": [
+      "fa85e94c72778c424b5cf9f525baf119a40b9f65",
+      [
+       null,
+       {}
+      ]
+     ],
      "rem-unit-root-element.html": [
       "cfd7af17c4f0463e3df02b8d91a1f96c70511408",
       [
@@ -458366,6 +458507,13 @@
        {}
       ]
      ],
+     "ric-invalidation.html": [
+      "60abb8b5eb4630b16c39e36e77b1e13670c5049b",
+      [
+       null,
+       {}
+      ]
+     ],
      "round-function.html": [
       "bc8734b011a6e7c55e206e1bb13c40b0fc555958",
       [
@@ -588259,7 +588407,7 @@
      ]
     ],
     "object-not-found-after-cross-origin-redirect.html": [
-     "c1a82d49708d72931a20c46d39902a3c92abd483",
+     "4d5d121fe32c4232dc8094906f92b7c8ac8d2ef1",
      [
       null,
       {
@@ -611978,7 +612126,7 @@
      ]
     ],
     "urlsearchparams-delete.any.js": [
-     "1aa9b313736de23e4724fe72217d9bad4df56595",
+     "28ebbce5f13bd8de759a4a1c623e7a36a0e309df",
      [
       "url/urlsearchparams-delete.any.html",
       {}
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbobjectstore_batchGetAll_largeValue.tentative.any.js.ini b/third_party/blink/web_tests/external/wpt/IndexedDB/idbobjectstore_batchGetAll_largeValue.tentative.any.js.ini
index c654be52..22f07a5 100644
--- a/third_party/blink/web_tests/external/wpt/IndexedDB/idbobjectstore_batchGetAll_largeValue.tentative.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/IndexedDB/idbobjectstore_batchGetAll_largeValue.tentative.any.js.ini
@@ -1,7 +1,7 @@
 [idbobjectstore_batchGetAll_largeValue.tentative.any.html]
   expected:
-    if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [OK, TIMEOUT]
-    if product == "chrome": OK
+    if (flag_specific == "") and (product == "chrome"): OK
+    if flag_specific == "disable-site-isolation-trials": OK
     TIMEOUT
   [Get upper/lower excluded]
     expected: [PASS, TIMEOUT]
@@ -15,8 +15,7 @@
 
 [idbobjectstore_batchGetAll_largeValue.tentative.any.worker.html]
   expected:
-    if (flag_specific == "") and (product == "chrome"): [OK, TIMEOUT]
-    if flag_specific == "disable-site-isolation-trials": OK
+    if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [OK, TIMEOUT]
     TIMEOUT
   [Get bound range with maxCount]
     expected: [PASS, TIMEOUT]
@@ -26,4 +25,4 @@
 
   [Get upper/lower excluded]
     expected:
-      if product == "chrome": [PASS, TIMEOUT]
+      if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/structured-clone.any.js.ini b/third_party/blink/web_tests/external/wpt/IndexedDB/structured-clone.any.js.ini
index 48c8ee6..e58382d3 100644
--- a/third_party/blink/web_tests/external/wpt/IndexedDB/structured-clone.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/IndexedDB/structured-clone.any.js.ini
@@ -4,7 +4,7 @@
 
 [structured-clone.any.worker.html?101-last]
   expected:
-    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
 
 [structured-clone.any.worker.html?41-60]
 
diff --git a/third_party/blink/web_tests/external/wpt/acid/acid3/test.html.ini b/third_party/blink/web_tests/external/wpt/acid/acid3/test.html.ini
index 4cb35b9..03a526e 100644
--- a/third_party/blink/web_tests/external/wpt/acid/acid3/test.html.ini
+++ b/third_party/blink/web_tests/external/wpt/acid/acid3/test.html.ini
@@ -1,2 +1,4 @@
 [test.html]
-  expected: FAIL
+  expected:
+    if flag_specific == "highdpi": [FAIL, TIMEOUT]
+    FAIL
diff --git a/third_party/blink/web_tests/external/wpt/client-hints/sec-ch-ua.https.html.ini b/third_party/blink/web_tests/external/wpt/client-hints/sec-ch-ua.https.html.ini
index dd79379..2f034c1 100644
--- a/third_party/blink/web_tests/external/wpt/client-hints/sec-ch-ua.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/client-hints/sec-ch-ua.https.html.ini
@@ -1,14 +1,3 @@
 [sec-ch-ua.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
-  [Open HTTPS window: `Sec-CH-UA` header returned by default.]
-    expected:
-      if product == "chrome": FAIL
-
-  [Open HTTPS window: `Sec-CH-UA` header is consistent across versions.]
-    expected:
-      if product == "chrome": FAIL
-
-  [Open HTTPS window: No brand in `Sec-CH-UA` header is > than 32 chars.]
-    expected:
-      if product == "chrome": FAIL
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/inheritance/history-iframe.sub.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/inheritance/history-iframe.sub.html.ini
index 3d47c07..62a339e 100644
--- a/third_party/blink/web_tests/external/wpt/content-security-policy/inheritance/history-iframe.sub.html.ini
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/inheritance/history-iframe.sub.html.ini
@@ -1,3 +1,3 @@
 [history-iframe.sub.html]
   expected:
-    if os == "win": [OK, TIMEOUT]
+    if os == "win": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/prefetch-src/prefetch-header-allowed.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/prefetch-src/prefetch-header-allowed.html.ini
index 6537e95..1aa1e89 100644
--- a/third_party/blink/web_tests/external/wpt/content-security-policy/prefetch-src/prefetch-header-allowed.html.ini
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/prefetch-src/prefetch-header-allowed.html.ini
@@ -1,3 +1,3 @@
 [prefetch-header-allowed.html]
   expected:
-    if (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [OK, TIMEOUT]
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_set_arguments.https.any.js.ini b/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_set_arguments.https.any.js.ini
index a12a879..a1ab72a 100644
--- a/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_set_arguments.https.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_set_arguments.https.any.js.ini
@@ -1,7 +1,10 @@
 [cookieStore_set_arguments.https.any.serviceworker.html]
-  [cookieStore.set with expires set to a future timestamp]
+
+[cookieStore_set_arguments.https.any.html]
+  [cookieStore.set with expires set to a future Date]
     expected:
       if os == "win": [PASS, FAIL]
 
-
-[cookieStore_set_arguments.https.any.html]
+  [cookieStore.set with expires set to a future timestamp]
+    expected:
+      if os == "win": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_subscribe_arguments.https.any.js.ini b/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_subscribe_arguments.https.any.js.ini
index bb046ff..03cbe54 100644
--- a/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_subscribe_arguments.https.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_subscribe_arguments.https.any.js.ini
@@ -1,17 +1,17 @@
 [cookieStore_subscribe_arguments.https.any.html]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [OK, ERROR]
   [cookieStore.subscribe with invalid url path in option]
     expected:
-      if product == "chrome": [PASS, NOTRUN]
+      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, NOTRUN]
 
   [cookieStore.subscribe is idempotent]
     expected:
-      if product == "chrome": [PASS, NOTRUN]
+      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, NOTRUN]
 
   [CookieStore.unsubscribe is idempotent]
     expected:
-      if product == "chrome": [PASS, NOTRUN]
+      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, NOTRUN]
 
 
 [cookieStore_subscribe_arguments.https.any.serviceworker.html]
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/fedcm-network-requests.https.html.ini b/third_party/blink/web_tests/external/wpt/credential-management/fedcm-network-requests.https.html.ini
index d03446a5..14f5926 100644
--- a/third_party/blink/web_tests/external/wpt/credential-management/fedcm-network-requests.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/credential-management/fedcm-network-requests.https.html.ini
@@ -1,5 +1,6 @@
 [fedcm-network-requests.https.html]
   expected:
+    if (product == "content_shell") and (os == "win"): [OK, TIMEOUT]
     if product == "chrome": TIMEOUT
   [nonce is not required in FederatedIdentityProvider.]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/float-nowrap-4.html.ini b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/float-nowrap-4.html.ini
index 5b5e8dbb..1181379 100644
--- a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/float-nowrap-4.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/float-nowrap-4.html.ini
@@ -1,5 +1,4 @@
 [float-nowrap-4.html]
   expected:
-    if (flag_specific == "") and (os == "win"): [TIMEOUT, CRASH]
-    if flag_specific == "disable-layout-ng": PASS
+    if (os == "linux") and (flag_specific == "disable-layout-ng"): PASS
     CRASH
diff --git a/third_party/blink/web_tests/external/wpt/css/css-animations/Element-getAnimations-dynamic-changes.tentative.html.ini b/third_party/blink/web_tests/external/wpt/css/css-animations/Element-getAnimations-dynamic-changes.tentative.html.ini
index cd79bce..42b61d6f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-animations/Element-getAnimations-dynamic-changes.tentative.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-animations/Element-getAnimations-dynamic-changes.tentative.html.ini
@@ -7,3 +7,7 @@
 
   [Animation state is preserved when interleaving animations in list]
     expected: FAIL
+
+  [Animations preserve their startTime when changed]
+    expected:
+      if product == "chrome": [FAIL, PASS]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/font-relative-units-dynamic.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/font-relative-units-dynamic.html
index f87a64a..63a07c6 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/font-relative-units-dynamic.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/font-relative-units-dynamic.html
@@ -206,6 +206,34 @@
 
 <template>
   <style>
+    :root {
+      font-size: 10px;
+      line-height: 5;
+    }
+    :root.larger {
+      font-size: 20px;
+    }
+    @container (width <= 1rlh) {
+      #test { color: green }
+    }
+  </style>
+  <div id="container">
+    <div>
+      <div id="test"></div>
+    </div>
+  </div>
+</template>
+<script>
+test_template(document.currentScript.previousElementSibling, (t) => {
+  t.add_cleanup(() => document.documentElement.classList.remove("larger"));
+  assert_equals(getComputedStyle(main.querySelector("#test")).color, red);
+  document.documentElement.classList.add("larger");
+  assert_equals(getComputedStyle(main.querySelector("#test")).color, green);
+}, 'rlh units respond to changes');
+</script>
+
+<template>
+  <style>
     main { font-size: 10px; }
     main.larger { font-size: 20px; }
     @container (width <= 8ic) {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/font-relative-units.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/font-relative-units.html
index 9c05d79..7f711ebf 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/font-relative-units.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/font-relative-units.html
@@ -5,7 +5,7 @@
 <script src="/resources/testharnessreport.js"></script>
 <script src="support/cq-testcommon.js"></script>
 <style>
-  :root { font-size: 10px; }
+  :root { font-size: 10px; line-height: 10px; }
   #em_container {
     container-type: inline-size;
     width: 100px;
@@ -59,6 +59,9 @@
   @container (width: 10lh) {
     #lh_test { color: green }
   }
+  @container (width: 50rlh) {
+    #rlh_test { color: green }
+  }
 </style>
 <div id="em_container">
   <div id="em_test"></div>
@@ -78,6 +81,7 @@
 </div>
 <div id="lh_container">
   <div id="lh_test"></div>
+  <div id="rlh_test"></div>
 </div>
 <script>
   setup(() => assert_implements_container_queries());
@@ -92,4 +96,5 @@
   test(() => assert_equals(getComputedStyle(ic_test).color, green), "ic relative inline-size");
   test(() => assert_equals(getComputedStyle(ric_test).color, green), "ric relative inline-size");
   test(() => assert_equals(getComputedStyle(lh_test).color, green), "lh relative inline-size");
+  test(() => assert_equals(getComputedStyle(rlh_test).color, green), "rlh relative inline-size");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/font-relative-units.html.ini b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/font-relative-units.html.ini
index 3d0437b..e760d71 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/font-relative-units.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/font-relative-units.html.ini
@@ -1,3 +1,4 @@
 [font-relative-units.html]
-  [rex relative inline-size220px250px]
-    expected: FAIL
+  [rex relative inline-size]
+    expected:
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/nested-query-containers.html.ini b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/nested-query-containers.html.ini
index e92a5bb1..076a237 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/nested-query-containers.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/nested-query-containers.html.ini
@@ -1,4 +1,2 @@
 [nested-query-containers.html]
-  expected:
-    if os == "win": [TIMEOUT, CRASH]
-    CRASH
+  expected: CRASH
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-001v.html.ini b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-001v.html.ini
index d36b001..f494a6e 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-001v.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-001v.html.ini
@@ -5,32 +5,32 @@
 
   [.flexbox > img 12]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
 
   [.flexbox > img 14]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
 
   [.flexbox > img 11]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
 
   [.flexbox > img 7]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
 
   [.flexbox > img 9]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
 
   [.flexbox > img 6]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
 
   [.flexbox > img 10]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
 
   [.flexbox > img 1]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/crash-large-grapheme-cluster.html.ini b/third_party/blink/web_tests/external/wpt/css/css-fonts/crash-large-grapheme-cluster.html.ini
index be7498a..9bb81c4 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/crash-large-grapheme-cluster.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/crash-large-grapheme-cluster.html.ini
@@ -1,3 +1,4 @@
 [crash-large-grapheme-cluster.html]
   expected:
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
     if flag_specific == "disable-layout-ng": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/subgrid/subgrid-baseline-002.html.ini b/third_party/blink/web_tests/external/wpt/css/css-grid/subgrid/subgrid-baseline-002.html.ini
index 4300e380..c8f5d5e 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/subgrid/subgrid-baseline-002.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/subgrid/subgrid-baseline-002.html.ini
@@ -1,4 +1,2 @@
 [subgrid-baseline-002.html]
-  expected:
-    if os == "win": [TIMEOUT, CRASH]
-    CRASH
+  expected: CRASH
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/Initial-letter-breaking-rtl.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/Initial-letter-breaking-rtl.html.ini
index 46ebc05b..9451204 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/Initial-letter-breaking-rtl.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/Initial-letter-breaking-rtl.html.ini
@@ -1,3 +1,4 @@
 [Initial-letter-breaking-rtl.html]
   expected:
-    if flag_specific == "disable-layout-ng": FAIL
+    if (os == "linux") and (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
+    if (os == "linux") and (product == "chrome"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/Initial-letter-breaking-vrl.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/Initial-letter-breaking-vrl.html.ini
index 5e2b2a7..e5040af 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/Initial-letter-breaking-vrl.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/Initial-letter-breaking-vrl.html.ini
@@ -1,4 +1,3 @@
 [Initial-letter-breaking-vrl.html]
   expected:
-    if (os == "linux") and (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
-    if (os == "linux") and (product == "chrome"): FAIL
+    if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-drop-under-ruby-tall.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-drop-under-ruby-tall.html.ini
index 8a8fc7e3..38527a1d 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-drop-under-ruby-tall.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-drop-under-ruby-tall.html.ini
@@ -1,3 +1,4 @@
 [initial-letter-block-position-drop-under-ruby-tall.html]
   expected:
-    if flag_specific == "disable-layout-ng": FAIL
+    if (os == "linux") and (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
+    if (os == "linux") and (product == "chrome"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-raise-over-ruby-tall.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-raise-over-ruby-tall.html.ini
index 50a3c7cc..f8543f21 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-raise-over-ruby-tall.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-raise-over-ruby-tall.html.ini
@@ -1,4 +1,3 @@
 [initial-letter-block-position-raise-over-ruby-tall.html]
   expected:
-    if (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
-    if product == "chrome": FAIL
+    if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-raise-under-ruby.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-raise-under-ruby.html.ini
index 1136475..eede05d 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-raise-under-ruby.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-raise-under-ruby.html.ini
@@ -1,4 +1,3 @@
 [initial-letter-block-position-raise-under-ruby.html]
   expected:
-    if (os == "linux") and (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
-    if (os == "linux") and (product == "chrome"): FAIL
+    if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-drop-initial-vlr.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-drop-initial-vlr.html.ini
index 984123ce..1e3e903 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-drop-initial-vlr.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-drop-initial-vlr.html.ini
@@ -1,3 +1,4 @@
 [initial-letter-drop-initial-vlr.html]
   expected:
-    if flag_specific == "disable-layout-ng": FAIL
+    if (os == "linux") and (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
+    if (os == "linux") and (product == "chrome"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-drop-initial-vrl.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-drop-initial-vrl.html.ini
index 9324bd34..90a6105fa 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-drop-initial-vrl.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-drop-initial-vrl.html.ini
@@ -1,4 +1,4 @@
 [initial-letter-drop-initial-vrl.html]
   expected:
-    if (flag_specific == "") and (product == "chrome"): [PASS, FAIL]
-    if flag_specific == "disable-layout-ng": FAIL
+    if (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
+    if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-001.html.ini
index ae13c19..4b45bbf 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-001.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-001.html.ini
@@ -1,4 +1,3 @@
 [initial-letter-float-001.html]
   expected:
-    if (os == "linux") and (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
-    if (os == "linux") and (product == "chrome"): FAIL
+    if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-raise-initial.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-raise-initial.html.ini
index 73516018..e37e026 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-raise-initial.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-raise-initial.html.ini
@@ -1,4 +1,3 @@
 [initial-letter-raise-initial.html]
   expected:
-    if (os == "linux") and (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
-    if (os == "linux") and (product == "chrome"): FAIL
+    if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-raised-sunken-caps-sunken.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-raised-sunken-caps-sunken.html.ini
index b0631f92..0c64a2fd 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-raised-sunken-caps-sunken.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-raised-sunken-caps-sunken.html.ini
@@ -1,3 +1,4 @@
 [initial-letter-raised-sunken-caps-sunken.html]
   expected:
-    if flag_specific == "disable-layout-ng": FAIL
+    if (os == "linux") and (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
+    if (os == "linux") and (product == "chrome"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-sunk-initial-vrl.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-sunk-initial-vrl.html.ini
index 145423c1..77a501b5 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-sunk-initial-vrl.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-sunk-initial-vrl.html.ini
@@ -1,4 +1,3 @@
 [initial-letter-sunk-initial-vrl.html]
   expected:
-    if (os == "linux") and (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
-    if (os == "linux") and (product == "chrome"): FAIL
+    if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-layout-api/fallback-intrinsic-sizes/constructor-error.https.html.ini b/third_party/blink/web_tests/external/wpt/css/css-layout-api/fallback-intrinsic-sizes/constructor-error.https.html.ini
new file mode 100644
index 0000000..ec85dd0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-layout-api/fallback-intrinsic-sizes/constructor-error.https.html.ini
@@ -0,0 +1,3 @@
+[constructor-error.https.html]
+  expected:
+    if product == "chrome": [PASS, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-inline-002.html.ini b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-inline-002.html.ini
new file mode 100644
index 0000000..84724ce
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-inline-002.html.ini
@@ -0,0 +1,3 @@
+[clip-path-inline-002.html]
+  expected:
+    if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/monolithic-oof-in-clipped-container.html b/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/monolithic-oof-in-clipped-container.html
new file mode 100644
index 0000000..7a35062
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/monolithic-oof-in-clipped-container.html
@@ -0,0 +1,8 @@
+<!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=1403467">
+<div style="columns:2; column-fill:auto; height:250px;">
+  <div style="position:relative; overflow:clip; width:100px; height:100px;">
+    <div style="position:absolute; contain:size; width:100px; height:100px;"></div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-paint-api/parse-input-arguments-005.https.html.ini b/third_party/blink/web_tests/external/wpt/css/css-paint-api/parse-input-arguments-005.https.html.ini
index 36c0ab3..e61017d 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-paint-api/parse-input-arguments-005.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-paint-api/parse-input-arguments-005.https.html.ini
@@ -1,3 +1,3 @@
 [parse-input-arguments-005.https.html]
   expected:
-    if os == "win": [PASS, TIMEOUT]
+    if os == "win": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ruby/ruby-text-combine-upright-001b.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ruby/ruby-text-combine-upright-001b.html.ini
new file mode 100644
index 0000000..654ce46
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-ruby/ruby-text-combine-upright-001b.html.ini
@@ -0,0 +1,3 @@
+[ruby-text-combine-upright-001b.html]
+  expected:
+    if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-001.html.ini
new file mode 100644
index 0000000..83483d7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-001.html.ini
@@ -0,0 +1,3 @@
+[text-transform-capitalize-001.html]
+  expected:
+    if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-005.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-005.html.ini
deleted file mode 100644
index c06d2b0..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-005.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[text-transform-capitalize-005.html]
-  expected:
-    if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/numeric-objects/cssUnitValue-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/numeric-objects/cssUnitValue-expected.txt
deleted file mode 100644
index e2378ac..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/numeric-objects/cssUnitValue-expected.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-This is a testharness.js-based test.
-PASS Constructing CSSUnitValue with an unknown unit throws a TypeError
-PASS Constructing CSSUnitValue with a empty string unit throws a TypeError
-PASS CSSUnitValue can be constructed with number
-PASS CSSUnitValue can be constructed with percent
-PASS CSSUnitValue can be constructed with em
-PASS CSSUnitValue can be constructed with ex
-PASS CSSUnitValue can be constructed with ch
-PASS CSSUnitValue can be constructed with ic
-PASS CSSUnitValue can be constructed with rem
-PASS CSSUnitValue can be constructed with lh
-FAIL CSSUnitValue can be constructed with rlh Failed to construct 'CSSUnitValue': Invalid unit: rlh
-PASS CSSUnitValue can be constructed with vw
-PASS CSSUnitValue can be constructed with vh
-PASS CSSUnitValue can be constructed with vi
-PASS CSSUnitValue can be constructed with vb
-PASS CSSUnitValue can be constructed with vmin
-PASS CSSUnitValue can be constructed with vmax
-PASS CSSUnitValue can be constructed with cm
-PASS CSSUnitValue can be constructed with mm
-PASS CSSUnitValue can be constructed with Q
-PASS CSSUnitValue can be constructed with in
-PASS CSSUnitValue can be constructed with pt
-PASS CSSUnitValue can be constructed with pc
-PASS CSSUnitValue can be constructed with px
-PASS CSSUnitValue can be constructed with deg
-PASS CSSUnitValue can be constructed with grad
-PASS CSSUnitValue can be constructed with rad
-PASS CSSUnitValue can be constructed with turn
-PASS CSSUnitValue can be constructed with s
-PASS CSSUnitValue can be constructed with ms
-PASS CSSUnitValue can be constructed with Hz
-PASS CSSUnitValue can be constructed with kHz
-PASS CSSUnitValue can be constructed with dpi
-PASS CSSUnitValue can be constructed with dpcm
-PASS CSSUnitValue can be constructed with dppx
-PASS CSSUnitValue can be constructed with fr
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/numeric-objects/cssUnitValue.html.ini b/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/numeric-objects/cssUnitValue.html.ini
deleted file mode 100644
index 660ecfc..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/numeric-objects/cssUnitValue.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[cssUnitValue.html]
-  [CSSUnitValue can be constructed with rlh]
-    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/rlh-invalidation.html b/third_party/blink/web_tests/external/wpt/css/css-values/rlh-invalidation.html
new file mode 100644
index 0000000..4618d9e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/rlh-invalidation.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<title>CSS Values and Units Test: rlh invalidation</title>
+<link rel="author" title="Daniil Sakhapov" href="sakhapov@google.com">
+<link rel="help" href="https://drafts.csswg.org/css-values/#font-relative-lengths">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="test rlh invalidation">
+<style>
+  @import url("/fonts/ahem.css");
+  html {
+    font-family: 'Ahem';
+    font-size: 40px;
+    line-height: 2;
+  }
+  body {
+    font-family: monospace;
+    font-size: 20px;
+    line-height: 5;
+  }
+  div {
+    width: 10rlh;
+  }
+</style>
+
+<html>
+  <body>
+    <div id="div"></div>
+  </body>
+</html>
+
+<script>
+  setup({ single_test: true });
+  let old_width = div.getBoundingClientRect().width;
+  document.documentElement.style.lineHeight = "4";
+  let new_width = div.getBoundingClientRect().width;
+  assert_not_equals(old_width, new_width, "expect rlh units to update on line-height update");
+  old_width = new_width;
+  document.documentElement.style.fontSize = "41px";
+  new_width = div.getBoundingClientRect().width;
+  assert_not_equals(old_width, new_width, "expect rlh units to update on font-size update");
+  done();
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-combine-upright-shadow.html.ini b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-combine-upright-shadow.html.ini
deleted file mode 100644
index cd761a1..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-combine-upright-shadow.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[text-combine-upright-shadow.html]
-  expected:
-    if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom-view/scroll-behavior-main-frame-root.html.ini b/third_party/blink/web_tests/external/wpt/css/cssom-view/scroll-behavior-main-frame-root.html.ini
index d5fe958..7cbc5c3f 100644
--- a/third_party/blink/web_tests/external/wpt/css/cssom-view/scroll-behavior-main-frame-root.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/cssom-view/scroll-behavior-main-frame-root.html.ini
@@ -1,3 +1,51 @@
 [scroll-behavior-main-frame-root.html]
   [Main frame with smooth scroll-behavior ; scrollIntoView() with instant behavior]
     expected: FAIL
+
+  [Main frame with smooth scroll-behavior ; scrollTo() with smooth behavior]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+
+  [Main frame with smooth scroll-behavior ; scrollBy() with default behavior]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+
+  [Main frame with auto scroll-behavior ; scrollIntoView() with smooth behavior]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+
+  [Main frame with smooth scroll-behavior ; scroll() with smooth behavior]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+
+  [Main frame with smooth scroll-behavior ; scrollTo() with auto behavior]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+
+  [Main frame with auto scroll-behavior ; scrollBy() with smooth behavior]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+
+  [Main frame with smooth scroll-behavior ; scrollBy() with auto behavior]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+
+  [Main frame with auto scroll-behavior ; scroll() with smooth behavior]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+
+  [Main frame with smooth scroll-behavior ; scrollTo() with default behavior]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+
+  [Main frame with auto scroll-behavior ; scrollTo() with smooth behavior]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+
+  [Main frame with smooth scroll-behavior ; scroll() with default behavior]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+
+  [Main frame with smooth scroll-behavior ; scroll() with auto behavior]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/css/printing/input-file-print.html.ini b/third_party/blink/web_tests/external/wpt/css/printing/input-file-print.html.ini
new file mode 100644
index 0000000..1ec656f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/printing/input-file-print.html.ini
@@ -0,0 +1,3 @@
+[input-file-print.html]
+  expected:
+    if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-attribute.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-attribute.html
new file mode 100644
index 0000000..0afd4689
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-attribute.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+  <title>Test nth-child selector argument</title>
+  <link rel="author" title="Chris Burdess" href="mailto:chris@bfo.com"/>
+  <link rel="help" href="https://www.w3.org/TR/selectors-4/#the-nth-child-pseudo"/>
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht"/>
+  <style type="text/css">
+    div {
+        display: block;
+        width: 100px;
+        height: 10px;
+        background-color: red;
+    }
+    .container {
+        height: 100px;
+    }
+    .reference {
+        background-color: green;
+    }
+    div:nth-child(3n-1 of [align]) { /* selects 2,5,8 of divs that have an align attribute */
+        background-color: green;
+    }
+  </style>
+ </head>
+ <body>
+  <p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+  <div class="container">
+   <div class="reference"></div>
+   <div class="reference" align="left"></div>
+   <div class="test" align="left"></div>
+   <div class="reference" align="left"></div>
+   <div class="reference" align="left"></div>
+   <div class="reference"></div>
+   <div class="test" align="left"></div>
+   <div class="reference" align="left"></div>
+   <div class="reference" align="left"></div>
+   <div class="test" align="left"></div>
+  </div>
+ </body>
+</html>
+
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-attribute.html.ini b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-attribute.html.ini
new file mode 100644
index 0000000..c5e0224
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-attribute.html.ini
@@ -0,0 +1,2 @@
+[nth-child-of-attribute.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-classname-002.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-classname-002.html
new file mode 100644
index 0000000..8aea791
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-classname-002.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+  <title>Test nth-child selector argument</title>
+  <link rel="author" title="Chris Burdess" href="mailto:chris@bfo.com"/>
+  <link rel="help" href="https://www.w3.org/TR/selectors-4/#the-nth-child-pseudo"/>
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht"/>
+  <style type="text/css">
+    div {
+        display: block;
+        width: 100px;
+        height: 10px;
+        background-color: red;
+    }
+    .container {
+        height: 100px;
+    }
+    .reference {
+        background-color: green;
+    }
+    div:nth-child(-n+3 of .test) { /* selects the first 3 with class test */
+        background-color: green;
+    }
+  </style>
+ </head>
+ <body>
+  <p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+  <div class="container">
+   <div class="reference"></div>
+   <div class="test"></div>
+   <div class="reference"></div>
+   <div class="test"></div>
+   <div class="reference"></div>
+   <div class="reference"></div>
+   <div class="reference"></div>
+   <div class="test"></div>
+   <div class="reference"></div>
+   <div class="reference"></div>
+  </div>
+ </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-classname-002.html.ini b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-classname-002.html.ini
new file mode 100644
index 0000000..618d0d2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-classname-002.html.ini
@@ -0,0 +1,2 @@
+[nth-child-of-classname-002.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-has.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-has.html
new file mode 100644
index 0000000..efead02
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-has.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+  <title>Test nth-child selector argument</title>
+  <link rel="author" title="Chris Burdess" href="mailto:chris@bfo.com"/>
+  <link rel="help" href="https://www.w3.org/TR/selectors-4/#the-nth-child-pseudo"/>
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht"/>
+  <style type="text/css">
+    div {
+        display: block;
+        width: 100px;
+        height: 10px;
+        background-color: red;
+    }
+    .container {
+        height: 100px;
+    }
+    .reference {
+        background-color: green;
+    }
+    div:nth-child(even of :has(span)) {
+        background-color: green;
+    }
+  </style>
+ </head>
+ <body>
+  <p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+  <div class="container">
+   <div class="reference"></div>
+   <div class="reference"><span></span></div>
+   <div class="reference"></div>
+   <div class="test"><span></span></div>
+   <div class="reference"></div>
+   <div class="reference"><span></span></div>
+   <div class="reference"></div>
+   <div class="test"><span></span></div>
+   <div class="reference"></div>
+   <div class="reference"><span></span></div>
+  </div>
+ </body>
+</html>
+
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-has.html.ini b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-has.html.ini
new file mode 100644
index 0000000..f9ae9a2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-has.html.ini
@@ -0,0 +1,2 @@
+[nth-child-of-has.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-not.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-not.html
new file mode 100644
index 0000000..863274fc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-not.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+  <title>Test nth-child selector argument</title>
+  <link rel="author" title="Chris Burdess" href="mailto:chris@bfo.com"/>
+  <link rel="help" href="https://www.w3.org/TR/selectors-4/#the-nth-child-pseudo"/>
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht"/>
+  <style type="text/css">
+    div {
+        display: block;
+        width: 100px;
+        height: 10px;
+        background-color: red;
+    }
+    .container {
+        height: 100px;
+    }
+    .reference, .fallback {
+        background-color: green;
+    }
+    div:nth-child(even of :not(.reference)) { /* selects even divs with class test */
+        background-color: green;
+    }
+  </style>
+ </head>
+ <body>
+  <p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+  <div class="container">
+   <div class="reference"></div>
+   <div class="test fallback"></div>
+   <div class="reference"></div>
+   <div class="test"></div>
+   <div class="test fallback"></div>
+   <div class="reference"></div>
+   <div class="reference"></div>
+   <div class="test"></div>
+   <div class="test fallback"></div>
+   <div class="reference"></div>
+  </div>
+ </body>
+</html>
+
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-not.html.ini b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-not.html.ini
new file mode 100644
index 0000000..85379cd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-not.html.ini
@@ -0,0 +1,2 @@
+[nth-child-of-not.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-nth-child.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-nth-child.html
new file mode 100644
index 0000000..bb212a57
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-nth-child.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+  <title>Test nth-child selector argument</title>
+  <link rel="author" title="Chris Burdess" href="mailto:chris@bfo.com"/>
+  <link rel="help" href="https://www.w3.org/TR/selectors-4/#the-nth-child-pseudo"/>
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht"/>
+  <style type="text/css">
+    div {
+        display: block;
+        width: 100px;
+        height: 10px;
+        background-color: red;
+    }
+    .container {
+        height: 100px;
+    }
+    .reference {
+        background-color: green;
+    }
+    div:nth-child(even of :nth-child(even)) { /* selects every other of every other */
+        background-color: green;
+    }
+  </style>
+ </head>
+ <body>
+  <p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+  <div class="container">
+   <div class="reference"></div>
+   <div class="reference"></div>
+   <div class="reference"></div>
+   <div class="test"></div>
+   <div class="reference"></div>
+   <div class="reference"></div>
+   <div class="reference"></div>
+   <div class="test"></div>
+   <div class="reference"></div>
+   <div class="reference"></div>
+  </div>
+ </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-nth-child.html.ini b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-nth-child.html.ini
new file mode 100644
index 0000000..e98ea78c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-nth-child.html.ini
@@ -0,0 +1,2 @@
+[nth-child-of-nth-child.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-universal-selector.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-universal-selector.html
new file mode 100644
index 0000000..1f77cba
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-universal-selector.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+  <title>Test nth-child selector argument</title>
+  <link rel="author" title="Chris Burdess" href="mailto:chris@bfo.com"/>
+  <link rel="help" href="https://www.w3.org/TR/selectors-4/#the-nth-child-pseudo"/>
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht"/>
+  <style type="text/css">
+    div {
+        display: block;
+        width: 100px;
+        height: 10px;
+        background-color: red;
+    }
+    .container {
+        height: 100px;
+    }
+    .reference {
+        background-color: green;
+    }
+    div:nth-child(even of *|*) { /* selects every other as S defaults to *|* */
+        background-color: green;
+    }
+  </style>
+ </head>
+ <body>
+  <p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+  <div class="container">
+   <div class="reference"></div>
+   <div class="test"></div>
+   <div class="reference"></div>
+   <div class="test"></div>
+   <div class="reference"></div>
+   <div class="test"></div>
+   <div class="reference"></div>
+   <div class="test"></div>
+   <div class="reference"></div>
+   <div class="test"></div>
+  </div>
+ </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-universal-selector.html.ini b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-universal-selector.html.ini
new file mode 100644
index 0000000..ab15855
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-universal-selector.html.ini
@@ -0,0 +1,2 @@
+[nth-child-of-universal-selector.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-of-invalid.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-of-invalid.html
new file mode 100644
index 0000000..89c3026
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-of-invalid.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+  <title>Test nth-child selector argument</title>
+  <link rel="author" title="Mike Bremford" href="https://bfo.com"/>
+  <link rel="help" href="https://www.w3.org/TR/selectors-4/#the-nth-child-pseudo"/>
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht"/>
+  <style type="text/css">
+    div {
+        display: block;
+        width: 100px;
+        height: 20px;
+        background-color: green;
+    }
+    .container {
+        height: 100px;
+    }
+    .reference {
+        background-color: green;
+    }
+    div:nth-child(1 of) { background-color: red; }
+    div:nth-last-child(n of) { background-color: red; }
+    div:nth-child(even of) { background-color: red; }
+    div:nth-last-child(even of even) { background-color: red; } /* valid just not matching */
+    div:nth-child(even .test) { background-color: red; }
+    div:nth-last-child(of) { background-color: red; }
+    div:nth-child(of ) { background-color: red; }
+    div:nth-last-child(of .) { background-color: red; }
+    div:nth-child(of .test) { background-color: red; }
+    div:nth-last-child(n + of ) { background-color: red; }
+    div:nth-child(n - of ) { background-color: red; }
+    div:nth-last-child(n + 1of) { background-color: red; }
+    div:nth-child(+ of .test) { background-color: red; }
+    div:nth-last-child(1 + of .test) { background-color: red; }
+    div:nth-child(1 - of .test) { background-color: red; }
+    div:nth-last-child(1 n) { background-color: red }
+    div:nth-child("1" of div) { background-color: red }
+    div:nth-last-child(1 "of" div) { background-color: red }
+    div:nth-child(1 of "" div) { background-color: red }
+    div:nth-last-child(n-1of div) { background-color: red }
+    div:nth-of-type(n of div) { background-color: red } /* gotcha */
+    div:nth-last-of-type(n of div) { background-color: red }
+  </style>
+ </head>
+ <body>
+  <p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+  <div class="container">
+   <div class="test"></div>
+   <div class="test"></div>
+   <div class="test"></div>
+   <div class="test"></div>
+   <div class="test"></div>
+  </div>
+ </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/root-siblings.htm b/third_party/blink/web_tests/external/wpt/css/selectors/root-siblings.htm
deleted file mode 100644
index 99c0cb4c..0000000
--- a/third_party/blink/web_tests/external/wpt/css/selectors/root-siblings.htm
+++ /dev/null
@@ -1,16 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>CSS Test: Parsing check for * ~ :root error handling</title>
-<link rel="author" title="Microsoft" href="http://www.microsoft.com/">
-<link rel="help" href="https://drafts.csswg.org/selectors-3/#selector-syntax">
-<link rel="match" href="../CSS2/reference/ref-this-text-should-be-green.xht">
-<meta name="assert" content="* ~ :root should not match anything">
-<style>
-* ~ :root p {
-  color: red;
-}
-p {
-  color: green;
-}
-</style>
-<p>This text should be green.</p>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/root-siblings.html b/third_party/blink/web_tests/external/wpt/css/selectors/root-siblings.html
new file mode 100644
index 0000000..c2f897a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/root-siblings.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test: Parsing check for * ~ :root error handling</title>
+<link rel="author" title="Microsoft" href="http://www.microsoft.com/">
+<link rel="help" href="https://drafts.csswg.org/selectors-3/#selector-syntax">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="* ~ :root should not match anything">
+<style>
+* ~ :root div {
+  background-color: red;
+}
+div {
+  width: 100px;
+  height: 100px;
+  background-color: green;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div></div>
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/form-associated/ElementInternals-target-element-is-held-strongly.html.ini b/third_party/blink/web_tests/external/wpt/custom-elements/form-associated/ElementInternals-target-element-is-held-strongly.html.ini
index 63d58fb..64240c7 100644
--- a/third_party/blink/web_tests/external/wpt/custom-elements/form-associated/ElementInternals-target-element-is-held-strongly.html.ini
+++ b/third_party/blink/web_tests/external/wpt/custom-elements/form-associated/ElementInternals-target-element-is-held-strongly.html.ini
@@ -1,5 +1,3 @@
 [ElementInternals-target-element-is-held-strongly.html]
   expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
-    if (flag_specific == "") and (os == "win"): TIMEOUT
-    if flag_specific == "disable-layout-ng": TIMEOUT
+    if os == "win": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/dom/ranges/Range-mutations-dataChange.html.ini b/third_party/blink/web_tests/external/wpt/dom/ranges/Range-mutations-dataChange.html.ini
index c1f1d46..7158a50 100644
--- a/third_party/blink/web_tests/external/wpt/dom/ranges/Range-mutations-dataChange.html.ini
+++ b/third_party/blink/web_tests/external/wpt/dom/ranges/Range-mutations-dataChange.html.ini
@@ -1,3 +1,3 @@
 [Range-mutations-dataChange.html]
   expected:
-    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
+    if flag_specific == "disable-site-isolation-trials": CRASH
diff --git a/third_party/blink/web_tests/external/wpt/domxpath/xml_xpath_runner.html.ini b/third_party/blink/web_tests/external/wpt/domxpath/xml_xpath_runner.html.ini
deleted file mode 100644
index d9cf144..0000000
--- a/third_party/blink/web_tests/external/wpt/domxpath/xml_xpath_runner.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[xml_xpath_runner.html]
-  expected:
-    if flag_specific == "disable-layout-ng": CRASH
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/image-carousel.html.ini b/third_party/blink/web_tests/external/wpt/element-timing/image-carousel.html.ini
deleted file mode 100644
index a0d1c2a..0000000
--- a/third_party/blink/web_tests/external/wpt/element-timing/image-carousel.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[image-carousel.html]
-  [Entries for elements within an image carousel are dispatched when the elements are redrawn.]
-    expected:
-      if os == "win": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/image-src-change.html.ini b/third_party/blink/web_tests/external/wpt/element-timing/image-src-change.html.ini
index 8a259054..23803ef 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/image-src-change.html.ini
+++ b/third_party/blink/web_tests/external/wpt/element-timing/image-src-change.html.ini
@@ -1,3 +1,6 @@
 [image-src-change.html]
   expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): TIMEOUT
+    if product == "chrome": [OK, TIMEOUT]
+  [Element Timing: changing src causes a new entry to be dispatched.]
+    expected:
+      if product == "chrome": [PASS, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/observe-multiple-images.html.ini b/third_party/blink/web_tests/external/wpt/element-timing/observe-multiple-images.html.ini
index 0be2f864..798b155 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/observe-multiple-images.html.ini
+++ b/third_party/blink/web_tests/external/wpt/element-timing/observe-multiple-images.html.ini
@@ -1,5 +1,4 @@
 [observe-multiple-images.html]
   [PerformanceObserver can observe multiple image elements.]
     expected:
-      if (os == "linux") and (flag_specific == "disable-layout-ng"): [PASS, FAIL]
-      if (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/euc-jp/eucjp-encode-form-cseucpkdfmtjapanese.html.ini b/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/euc-jp/eucjp-encode-form-cseucpkdfmtjapanese.html.ini
index e839ecd..2c9f8ab 100644
--- a/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/euc-jp/eucjp-encode-form-cseucpkdfmtjapanese.html.ini
+++ b/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/euc-jp/eucjp-encode-form-cseucpkdfmtjapanese.html.ini
@@ -3,8 +3,6 @@
 [eucjp-encode-form-cseucpkdfmtjapanese.html?5001-6000]
 
 [eucjp-encode-form-cseucpkdfmtjapanese.html?4001-5000]
-  expected:
-    if os == "win": [OK, CRASH]
 
 [eucjp-encode-form-cseucpkdfmtjapanese.html?1-1000]
 
@@ -15,3 +13,5 @@
 [eucjp-encode-form-cseucpkdfmtjapanese.html?1001-2000]
 
 [eucjp-encode-form-cseucpkdfmtjapanese.html?6001-7000]
+  expected:
+    if os == "win": [OK, CRASH]
diff --git a/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/euc-jp/eucjp-encode-href-errors-han.html.ini b/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/euc-jp/eucjp-encode-href-errors-han.html.ini
index 41f5d57..5aa7112 100644
--- a/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/euc-jp/eucjp-encode-href-errors-han.html.ini
+++ b/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/euc-jp/eucjp-encode-href-errors-han.html.ini
@@ -15,8 +15,6 @@
 [eucjp-encode-href-errors-han.html?1-1000]
 
 [eucjp-encode-href-errors-han.html?20001-21000]
-  expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
 
 [eucjp-encode-href-errors-han.html?10001-11000]
 
@@ -27,6 +25,8 @@
 [eucjp-encode-href-errors-han.html?18001-19000]
 
 [eucjp-encode-href-errors-han.html?16001-17000]
+  expected:
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
 
 [eucjp-encode-href-errors-han.html?19001-20000]
 
diff --git a/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-korean/euc-kr/euckr-decode-iso-ir-149.html.ini b/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-korean/euc-kr/euckr-decode-iso-ir-149.html.ini
index 56a36e4..50f8f02 100644
--- a/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-korean/euc-kr/euckr-decode-iso-ir-149.html.ini
+++ b/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-korean/euc-kr/euckr-decode-iso-ir-149.html.ini
@@ -19,8 +19,6 @@
 [euckr-decode-iso-ir-149.html?5001-6000]
 
 [euckr-decode-iso-ir-149.html?2001-3000]
-  expected:
-    if flag_specific == "disable-layout-ng": [OK, CRASH]
 
 [euckr-decode-iso-ir-149.html?17001-last]
 
@@ -33,5 +31,7 @@
 [euckr-decode-iso-ir-149.html?11001-12000]
 
 [euckr-decode-iso-ir-149.html?7001-8000]
+  expected:
+    if flag_specific == "disable-layout-ng": [OK, CRASH]
 
 [euckr-decode-iso-ir-149.html?3001-4000]
diff --git a/third_party/blink/web_tests/external/wpt/encoding/unsupported-labels.window.js.ini b/third_party/blink/web_tests/external/wpt/encoding/unsupported-labels.window.js.ini
index 450e960b..090aad90 100644
--- a/third_party/blink/web_tests/external/wpt/encoding/unsupported-labels.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/encoding/unsupported-labels.window.js.ini
@@ -1,7 +1,5 @@
 [unsupported-labels.window.html]
-  expected:
-    if product == "chrome": [OK, TIMEOUT]
-    TIMEOUT
+  expected: TIMEOUT
   [_autodetect_all is not supported by the Encoding Standard]
     expected: [PASS, TIMEOUT]
 
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/basic/keepalive.html.ini b/third_party/blink/web_tests/external/wpt/fetch/api/basic/keepalive.html.ini
deleted file mode 100644
index d7c7aa2..0000000
--- a/third_party/blink/web_tests/external/wpt/fetch/api/basic/keepalive.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[keepalive.html]
-  [keepalive in onunload in nested frame in another window]
-    expected:
-      if os == "win": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/cors/cors-cookies-redirect.any.js.ini b/third_party/blink/web_tests/external/wpt/fetch/api/cors/cors-cookies-redirect.any.js.ini
deleted file mode 100644
index c876095..0000000
--- a/third_party/blink/web_tests/external/wpt/fetch/api/cors/cors-cookies-redirect.any.js.ini
+++ /dev/null
@@ -1,18 +0,0 @@
-[cors-cookies-redirect.any.worker.html]
-  [Testing credentials after cross-origin redirection with CORS and no preflight]
-    expected:
-      if product == "chrome": [PASS, FAIL]
-
-  [Testing credentials after cross-origin redirection with CORS and preflight]
-    expected:
-      if product == "chrome": [PASS, FAIL]
-
-
-[cors-cookies-redirect.any.html]
-  [Testing credentials after cross-origin redirection with CORS and no preflight]
-    expected:
-      if product == "chrome": FAIL
-
-  [Testing credentials after cross-origin redirection with CORS and preflight]
-    expected:
-      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/iframe.tentative.https.window.js.ini b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/iframe.tentative.https.window.js.ini
index feb27192..890cec5a 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/iframe.tentative.https.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/iframe.tentative.https.window.js.ini
@@ -1,6 +1,6 @@
 [iframe.tentative.https.window.html]
   expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): TIMEOUT
   [private to local: success.]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/service-worker-background-fetch.https.window.js.ini b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/service-worker-background-fetch.https.window.js.ini
index fcf7be67..3814b1c 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/service-worker-background-fetch.https.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/service-worker-background-fetch.https.window.js.ini
@@ -1,11 +1,11 @@
 [service-worker-background-fetch.https.window.html]
   [local to local: success.]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
-      if (flag_specific == "") and (os == "linux") and (product == "chrome"): FAIL
+      if product == "chrome": FAIL
 
   [private to local: success.]
     expected:
+      if (product == "content_shell") and (flag_specific == "") and (os == "linux"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [private to private: success.]
@@ -14,13 +14,11 @@
 
   [public to local: success.]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "chrome"): FAIL
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if (flag_specific == "") and (product == "chrome"): FAIL
 
   [public to private: success.]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
 
   [public to public: success.]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/focus/focus-already-focused-iframe-same-site.html.ini b/third_party/blink/web_tests/external/wpt/focus/focus-already-focused-iframe-same-site.html.ini
index c8cb0f97..4f0bb0c 100644
--- a/third_party/blink/web_tests/external/wpt/focus/focus-already-focused-iframe-same-site.html.ini
+++ b/third_party/blink/web_tests/external/wpt/focus/focus-already-focused-iframe-same-site.html.ini
@@ -1,4 +1,2 @@
 [focus-already-focused-iframe-same-site.html]
-  expected:
-    if flag_specific == "disable-site-isolation-trials": CRASH
-    TIMEOUT
+  expected: TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/focus/iframe-focuses-parent-different-site.html.ini b/third_party/blink/web_tests/external/wpt/focus/iframe-focuses-parent-different-site.html.ini
deleted file mode 100644
index 3b3149b..0000000
--- a/third_party/blink/web_tests/external/wpt/focus/iframe-focuses-parent-different-site.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[iframe-focuses-parent-different-site.html]
-  expected:
-    if flag_specific == "disable-site-isolation-trials": CRASH
diff --git a/third_party/blink/web_tests/external/wpt/fs/FileSystemFileHandle-create-sync-access-handle.https.tentative.window.js.ini b/third_party/blink/web_tests/external/wpt/fs/FileSystemFileHandle-create-sync-access-handle.https.tentative.window.js.ini
new file mode 100644
index 0000000..c3348a5c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fs/FileSystemFileHandle-create-sync-access-handle.https.tentative.window.js.ini
@@ -0,0 +1,4 @@
+[FileSystemFileHandle-create-sync-access-handle.https.tentative.window.html]
+  [Attempt to create a sync access handle.]
+    expected:
+      if os == "win": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/anonymous-iframe/embedding.tentative.https.window.js.ini b/third_party/blink/web_tests/external/wpt/html/anonymous-iframe/embedding.tentative.https.window.js.ini
index b0a79ce..0df41291 100644
--- a/third_party/blink/web_tests/external/wpt/html/anonymous-iframe/embedding.tentative.https.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/html/anonymous-iframe/embedding.tentative.https.window.js.ini
@@ -17,6 +17,8 @@
     if product == "chrome": ERROR
 
 [embedding.tentative.https.window.html?11-11]
+  expected:
+    if product == "chrome": [OK, ERROR]
 
 [embedding.tentative.https.window.html?5-5]
 
@@ -29,17 +31,19 @@
 [embedding.tentative.https.window.html?10-10]
 
 [embedding.tentative.https.window.html?2-2]
+  expected:
+    if product == "chrome": [OK, ERROR]
 
 [embedding.tentative.https.window.html?12-12]
 
 [embedding.tentative.https.window.html?4-4]
 
 [embedding.tentative.https.window.html?8-8]
+  expected:
+    if product == "chrome": [OK, ERROR]
 
 [embedding.tentative.https.window.html?3-3]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
 
 [embedding.tentative.https.window.html?9-9]
-  expected:
-    if product == "chrome": [OK, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/back-forward-cache/service-worker-controlled-after-restore.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/back-forward-cache/service-worker-controlled-after-restore.https.html.ini
index 947eebb7..33ae6cd3 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/back-forward-cache/service-worker-controlled-after-restore.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/back-forward-cache/service-worker-controlled-after-restore.https.html.ini
@@ -1,6 +1,5 @@
 [service-worker-controlled-after-restore.https.html]
-  expected:
-    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
   [Pages should remain controlled after restored from BFCache]
     expected:
-      if (os == "linux") and (product == "chrome"): PRECONDITION_FAILED
+      if (product == "content_shell") and (os == "win"): [PASS, FAIL]
+      if product == "chrome": PRECONDITION_FAILED
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-traversal-cross-document-traversal.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-traversal-cross-document-traversal.html.ini
index dcb75058..dfb8578 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-traversal-cross-document-traversal.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-traversal-cross-document-traversal.html.ini
@@ -1,4 +1,7 @@
 [same-document-traversal-cross-document-traversal.html]
+  expected:
+    if flag_specific == "disable-layout-ng": [OK, TIMEOUT]
+    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
   [traversals in the same (back) direction: queued up]
     expected: [PASS, TIMEOUT]
 
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/history/the-history-interface/combination_history_006.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/history/the-history-interface/combination_history_006.html.ini
new file mode 100644
index 0000000..a339e37
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/history/the-history-interface/combination_history_006.html.ini
@@ -0,0 +1,3 @@
+[combination_history_006.html]
+  expected:
+    if os == "win": [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/history/the-location-interface/location-protocol-setter-non-broken.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/history/the-location-interface/location-protocol-setter-non-broken.html.ini
index 264d685..ac462d6 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/history/the-location-interface/location-protocol-setter-non-broken.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/history/the-location-interface/location-protocol-setter-non-broken.html.ini
@@ -1,11 +1,8 @@
 [location-protocol-setter-non-broken.html]
   [Set HTTP URL frame location.protocol to data]
-    expected:
-      if os == "win": PASS
-      FAIL
+    expected: FAIL
 
   [Set data URL frame location.protocol to data]
     expected:
-      if (flag_specific == "") and (os == "win"): PASS
-      if flag_specific == "disable-layout-ng": PASS
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
       FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-no-child-yeswithparams-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-no-child-yeswithparams-subdomain.sub.https.html.ini
index b890829..d15b316 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-no-child-yeswithparams-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-no-child-yeswithparams-subdomain.sub.https.html.ini
@@ -1,8 +1,8 @@
 [parent-no-child-yeswithparams-subdomain.sub.https.html]
   [setting document.domain must not give sync access]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [child: originAgentCluster must equal true]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-no-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-no-subdomain.sub.https.html.ini
index 93a8eb6..61e0306 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-no-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-no-subdomain.sub.https.html.ini
@@ -1,9 +1,11 @@
 [parent-yes-child-no-subdomain.sub.https.html]
   [setting document.domain must not give sync access]
     expected:
+      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [parent: originAgentCluster must equal true]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-layout-ng"): [PASS, FAIL]
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-same.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-same.sub.https.html.ini
index 2b7fa4f..21a2266 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-same.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-same.sub.https.html.ini
@@ -1,10 +1,10 @@
 [parent-yes-child-yes-same.sub.https.html]
   [parent: originAgentCluster must equal true]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [child: originAgentCluster must equal true]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-no-child1-no-subdomain-child2-yes-subdomainport.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-no-child1-no-subdomain-child2-yes-subdomainport.sub.https.html.ini
index 0683058..f003cfe3 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-no-child1-no-subdomain-child2-yes-subdomainport.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-no-child1-no-subdomain-child2-yes-subdomainport.sub.https.html.ini
@@ -4,7 +4,3 @@
       if (flag_specific == "") and (product == "chrome"): PASS
       if flag_specific == "disable-site-isolation-trials": PASS
       FAIL
-
-  [parent: originAgentCluster must equal false]
-    expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-no-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-no-subdomain.sub.https.html.ini
index cab93f6..c6fbd89 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-no-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-no-subdomain.sub.https.html.ini
@@ -1,18 +1,15 @@
 [parent-yes-child1-no-subdomain-child2-no-subdomain.sub.https.html]
   [Parent to child1: setting document.domain must not give sync access]
     expected:
-      if (flag_specific == "") and (product == "chrome"): FAIL
-      if flag_specific == "disable-site-isolation-trials": FAIL
+      if product == "chrome": FAIL
 
   [Parent to child2: setting document.domain must not give sync access]
     expected:
-      if (flag_specific == "") and (product == "chrome"): FAIL
-      if flag_specific == "disable-site-isolation-trials": FAIL
+      if product == "chrome": FAIL
 
   [parent: originAgentCluster must equal true]
     expected:
-      if (flag_specific == "") and (product == "chrome"): FAIL
-      if flag_specific == "disable-site-isolation-trials": FAIL
+      if product == "chrome": FAIL
 
   [child2: originAgentCluster must equal false]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-no-subdomain2.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-no-subdomain2.sub.https.html.ini
index 88e01c2..0ac9250 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-no-subdomain2.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-no-subdomain2.sub.https.html.ini
@@ -13,12 +13,15 @@
 
   [parent: originAgentCluster must equal true]
     expected:
+      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [Parent to child1: setting document.domain must not give sync access]
     expected:
+      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [Parent to child2: setting document.domain must not give sync access]
     expected:
+      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-yes-subdomain2.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-yes-subdomain2.sub.https.html.ini
index 9bcd0656..ba2d6b6 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-yes-subdomain2.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-yes-subdomain2.sub.https.html.ini
@@ -1,24 +1,8 @@
 [parent-yes-child1-no-subdomain-child2-yes-subdomain2.sub.https.html]
   [Parent to child1: setting document.domain must not give sync access]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
-
-  [Parent to child2: setting document.domain must not give sync access]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
-
-  [child1 to child2: setting document.domain must not give sync access]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
-
-  [child2 to child1: setting document.domain must not give sync access]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [parent: originAgentCluster must equal true]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
-
-  [child2: originAgentCluster must equal true]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-yes-subdomainport.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-yes-subdomainport.sub.https.html.ini
index 8349778..7ba4e73 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-yes-subdomainport.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-yes-subdomainport.sub.https.html.ini
@@ -1,12 +1,12 @@
 [parent-yes-child1-no-subdomain-child2-yes-subdomainport.sub.https.html]
   [Parent to child1: setting document.domain must not give sync access]
     expected:
-      if (flag_specific == "") and (product == "chrome"): FAIL
+      if product == "chrome": FAIL
 
   [parent: originAgentCluster must equal true]
     expected:
-      if (flag_specific == "") and (product == "chrome"): FAIL
+      if product == "chrome": FAIL
 
   [child1: originAgentCluster must equal false]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-no-port.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-no-port.sub.https.html.ini
index c238adf..a3efc434 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-no-port.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-no-port.sub.https.html.ini
@@ -6,15 +6,3 @@
   [parent: originAgentCluster must equal true]
     expected:
       if product == "chrome": FAIL
-
-  [child1: originAgentCluster must equal true]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": FAIL
-
-  [child1 to child2: setting document.domain must not give sync access]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": FAIL
-
-  [child2 to child1: setting document.domain must not give sync access]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-no-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-no-subdomain.sub.https.html.ini
index 6ede574..bb8a3cbb 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-no-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-no-subdomain.sub.https.html.ini
@@ -1,24 +1,12 @@
 [parent-yes-child1-yes-subdomain-child2-no-subdomain.sub.https.html]
   [parent: originAgentCluster must equal true]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
-      if (flag_specific == "") and (os == "linux") and (product == "chrome"): FAIL
-      if flag_specific == "disable-site-isolation-trials": FAIL
+      if product == "chrome": FAIL
 
   [child1: originAgentCluster must equal true]
     expected:
-      if (flag_specific == "") and (os == "win"): FAIL
-      if flag_specific == "disable-site-isolation-trials": FAIL
+      if os == "win": FAIL
 
   [child2: originAgentCluster must equal true]
     expected:
-      if (flag_specific == "") and (os == "win"): FAIL
-      if flag_specific == "disable-site-isolation-trials": FAIL
-
-  [Parent to child2: setting document.domain must not give sync access]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": FAIL
-
-  [Parent to child1: setting document.domain must not give sync access]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": FAIL
+      if os == "win": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomain.sub.https.html.ini
index 3be8b66..3735ac72c 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomain.sub.https.html.ini
@@ -1,12 +1,21 @@
 [parent-yes-child1-yes-subdomain-child2-yes-subdomain.sub.https.html]
   [parent: originAgentCluster must equal true]
     expected:
+      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [child1: originAgentCluster must equal true]
     expected:
-      if flag_specific == "disable-site-isolation-trials": FAIL
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
 
   [child2: originAgentCluster must equal true]
     expected:
-      if flag_specific == "disable-site-isolation-trials": FAIL
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+
+  [Parent to child2: setting document.domain must not give sync access]
+    expected:
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+
+  [Parent to child1: setting document.domain must not give sync access]
+    expected:
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomainport.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomainport.sub.https.html.ini
index 5d32ec5..753d9e5 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomainport.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomainport.sub.https.html.ini
@@ -1,6 +1,6 @@
 [parent-yes-child1-yes-subdomain-child2-yes-subdomainport.sub.https.html]
   expected:
-    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
+    if flag_specific == "disable-site-isolation-trials": CRASH
   [parent: originAgentCluster must equal true]
     expected:
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/document-domain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/document-domain.sub.https.html.ini
index 39fb46a..869ca53 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/document-domain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/document-domain.sub.https.html.ini
@@ -1,8 +1,11 @@
 [document-domain.sub.https.html]
   [Setting document.domain must not change same-originness]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): FAIL
+      if (flag_specific == "") and (os == "linux") and (product == "chrome"): FAIL
+      if (flag_specific == "") and (os == "win"): [PASS, FAIL]
 
   [Having an origin-keyed subdomain child try to set document.domain must not change the document.domain value it sees]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+      if (os == "linux") and (flag_specific == "") and (product == "content_shell"): FAIL
+      if os == "win": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/removed-iframe.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/removed-iframe.sub.https.html.ini
new file mode 100644
index 0000000..55f11aaf
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/removed-iframe.sub.https.html.ini
@@ -0,0 +1,4 @@
+[removed-iframe.sub.https.html]
+  [Removing the iframe does not change originAgentCluster]
+    expected:
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/sandboxed-same-origin-iframe-yes.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/sandboxed-same-origin-iframe-yes.https.html.ini
index 3b19d0f..e6f5815 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/sandboxed-same-origin-iframe-yes.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/sandboxed-same-origin-iframe-yes.https.html.ini
@@ -1,5 +1,5 @@
 [sandboxed-same-origin-iframe-yes.https.html]
   [originAgentCluster must equal true]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/going-back.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/going-back.sub.https.html.ini
index 9f1f582..b8b3d6a 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/going-back.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/going-back.sub.https.html.ini
@@ -1,16 +1,20 @@
 [going-back.sub.https.html]
   [Before navigation: parent to child1: setting document.domain must not give sync access]
     expected:
+      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [After navigation: parent to child2: setting document.domain must not give sync access]
     expected:
+      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [After back: parent to child1: setting document.domain must not give sync access]
     expected:
+      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [After back: parent to child2: setting document.domain must not give sync access]
     expected:
+      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-same-2-yes-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-same-2-yes-subdomain.sub.https.html.ini
index 20a6fc5..8cdf9fa 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-same-2-yes-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-same-2-yes-subdomain.sub.https.html.ini
@@ -1,22 +1,15 @@
 [parent-no-1-no-same-2-yes-subdomain.sub.https.html]
   [before parent: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
       if (flag_specific == "") and (os == "win"): FAIL
       if flag_specific == "disable-layout-ng": FAIL
 
   [before child: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
       if (flag_specific == "") and (os == "win"): FAIL
       if flag_specific == "disable-layout-ng": FAIL
 
   [after parent: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
       if (flag_specific == "") and (os == "win"): FAIL
       if flag_specific == "disable-layout-ng": FAIL
-
-  [after child: originAgentCluster must equal true]
-    expected:
-      if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-subdomain-2-yes-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-subdomain-2-yes-subdomain.sub.https.html.ini
index 27358051..5a2bf36 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-subdomain-2-yes-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-subdomain-2-yes-subdomain.sub.https.html.ini
@@ -2,19 +2,19 @@
   [Before: parent to child: setting document.domain must give sync access]
     expected:
       if (flag_specific == "") and (product == "chrome"): PASS
+      if flag_specific == "disable-site-isolation-trials": PASS
       FAIL
 
   [After: parent to child: setting document.domain must give sync access]
     expected:
       if (flag_specific == "") and (product == "chrome"): PASS
+      if flag_specific == "disable-site-isolation-trials": PASS
       FAIL
 
   [before parent: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "win"): FAIL
-      if flag_specific == "disable-site-isolation-trials": FAIL
+      if os == "win": FAIL
 
   [after parent: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "win"): FAIL
-      if flag_specific == "disable-site-isolation-trials": FAIL
+      if os == "win": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html.ini
index cb3c21c0..ca40622 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html.ini
@@ -1,18 +1,20 @@
 [parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html]
   [After: parent to child: setting document.domain must give sync access]
     expected:
-      if (flag_specific == "") and (product == "chrome"): PASS
-      if flag_specific == "disable-site-isolation-trials": PASS
+      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
+      if product == "chrome": PASS
       FAIL
 
   [before parent: originAgentCluster must equal false]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
 
   [after parent: originAgentCluster must equal false]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
 
   [before child: originAgentCluster must equal true]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-yes-subdomain-2-no-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-yes-subdomain-2-no-subdomain.sub.https.html.ini
index cf2645dc..6e7ddbd 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-yes-subdomain-2-no-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-yes-subdomain-2-no-subdomain.sub.https.html.ini
@@ -1,20 +1,18 @@
 [parent-no-1-yes-subdomain-2-no-subdomain.sub.https.html]
   [before parent: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+      if (flag_specific == "") and (os == "win"): [PASS, FAIL]
       if flag_specific == "disable-layout-ng": FAIL
 
   [before child: originAgentCluster must equal true]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
       if flag_specific == "disable-layout-ng": FAIL
 
   [after parent: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+      if (flag_specific == "") and (os == "win"): [PASS, FAIL]
       if flag_specific == "disable-layout-ng": FAIL
 
   [after child: originAgentCluster must equal true]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
       if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-yes-1-no-same-2-no-port.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-yes-1-no-same-2-no-port.sub.https.html.ini
index cb86ed17..9f3db00e 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-yes-1-no-same-2-no-port.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-yes-1-no-same-2-no-port.sub.https.html.ini
@@ -1,26 +1,23 @@
 [parent-yes-1-no-same-2-no-port.sub.https.html]
   [before parent: originAgentCluster must equal true]
     expected:
-      if (flag_specific == "") and (product == "chrome"): FAIL
-      if flag_specific == "disable-layout-ng": FAIL
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if (flag_specific == "") and (product == "content_shell"): PASS
+      FAIL
 
   [before child: originAgentCluster must equal true]
     expected:
-      if (flag_specific == "") and (product == "chrome"): FAIL
-      if flag_specific == "disable-layout-ng": FAIL
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if (flag_specific == "") and (product == "content_shell"): PASS
+      FAIL
 
   [After: parent to child: setting document.domain must not give sync access]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [after parent: originAgentCluster must equal true]
     expected:
-      if (flag_specific == "") and (product == "chrome"): FAIL
-      if flag_specific == "disable-layout-ng": FAIL
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if (flag_specific == "") and (product == "content_shell"): PASS
+      FAIL
 
   [after child: originAgentCluster must equal false]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-yes-1-no-same-2-no-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-yes-1-no-same-2-no-subdomain.sub.https.html.ini
index 07f864d..70e77cb 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-yes-1-no-same-2-no-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-yes-1-no-same-2-no-subdomain.sub.https.html.ini
@@ -1,17 +1,16 @@
 [parent-yes-1-no-same-2-no-subdomain.sub.https.html]
   [before parent: originAgentCluster must equal true]
     expected:
-      if os == "win": [PASS, FAIL]
+      if os == "win": FAIL
 
   [after parent: originAgentCluster must equal true]
     expected:
-      if os == "win": [PASS, FAIL]
+      if os == "win": FAIL
 
   [before child: originAgentCluster must equal true]
     expected:
-      if os == "win": [PASS, FAIL]
+      if os == "win": FAIL
 
   [after child: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-same.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-same.sub.https.html.ini
index 0f5a12b..a9c87499 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-same.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-same.sub.https.html.ini
@@ -1,10 +1,14 @@
 [opener-no-openee-yes-same.sub.https.html]
   [opener: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if (flag_specific == "") and (os == "linux") and (product == "chrome"): PASS
+      if (flag_specific == "") and (os == "win"): [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      FAIL
 
   [openee: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): FAIL
+      if (flag_specific == "") and (os == "linux") and (product == "chrome"): PASS
+      if flag_specific == "disable-layout-ng": FAIL
+      [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-subdomain.sub.https.html.ini
index 53f643b..575ec913 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-subdomain.sub.https.html.ini
@@ -1,9 +1,9 @@
 [opener-no-openee-yes-subdomain.sub.https.html]
   [opener: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "win"): [PASS, FAIL]
+      if (flag_specific == "") and (os == "win"): FAIL
       if flag_specific == "disable-layout-ng": FAIL
 
   [openee: originAgentCluster must equal true]
     expected:
-      if (flag_specific == "") and (os == "win"): [PASS, FAIL]
+      if os == "win": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-no-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-no-subdomain.sub.https.html.ini
index 83fcc1f..c3ea49453 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-no-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-no-subdomain.sub.https.html.ini
@@ -9,4 +9,4 @@
 
   [openee: originAgentCluster must equal false]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-yes-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-yes-subdomain.sub.https.html.ini
index 37cb728..5ec4080 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-yes-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-yes-subdomain.sub.https.html.ini
@@ -2,7 +2,3 @@
   [openee: originAgentCluster must equal true]
     expected:
       if flag_specific == "disable-layout-ng": FAIL
-
-  [opener: originAgentCluster must equal true]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-tokenization-noreferrer.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-tokenization-noreferrer.html.ini
index 05abd9e3..725998e 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-tokenization-noreferrer.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-tokenization-noreferrer.html.ini
@@ -1,3 +1,3 @@
 [open-features-tokenization-noreferrer.html]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-tokenization-width-height.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-tokenization-width-height.html.ini
new file mode 100644
index 0000000..25200b9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-tokenization-width-height.html.ini
@@ -0,0 +1,3 @@
+[open-features-tokenization-width-height.html]
+  expected:
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/window-open-noopener.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/window-open-noopener.html.ini
deleted file mode 100644
index d1fa6d1..0000000
--- a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/window-open-noopener.html.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-[window-open-noopener.html?_parent]
-
-[window-open-noopener.html?_top]
-
-[window-open-noopener.html?_self]
-
-[window-open-noopener.html?indexed]
-  expected:
-    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/windows/browsing-context-names/choose-_blank-002.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/windows/browsing-context-names/choose-_blank-002.html.ini
deleted file mode 100644
index 9038f753..0000000
--- a/third_party/blink/web_tests/external/wpt/html/browsers/windows/browsing-context-names/choose-_blank-002.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[choose-_blank-002.html]
-  expected:
-    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.resize.html.ini b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.resize.html.ini
index 8640bb99..8b40327 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.resize.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.resize.html.ini
@@ -1,14 +1,12 @@
 [offscreencanvas.resize.html]
   [Verify that resizing an OffscreenCanvas with a webgl context propagates the new size to its placeholder canvas asynchronously.]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-layout-ng"): [FAIL, PASS]
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
 
   [Verify that drawImage uses the size of the frame as the intinsic size of a placeholder canvas.]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [FAIL, PASS]
-      FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [Verify that resizing an OffscreenCanvas with a 2d context propagates the new size to its placeholder canvas asynchronously.]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/credentialless/link.https.window.js.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/credentialless/link.https.window.js.ini
deleted file mode 100644
index 1a3ff5b..0000000
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/credentialless/link.https.window.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[link.https.window.html]
-  expected:
-    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/cross-origin-isolated-permission-worker.https.window.js.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/cross-origin-isolated-permission-worker.https.window.js.ini
index 1cda6978..6e7bbd4c 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/cross-origin-isolated-permission-worker.https.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/cross-origin-isolated-permission-worker.https.window.js.ini
@@ -1,5 +1,3 @@
 [cross-origin-isolated-permission-worker.https.window.html]
-  expected:
-    if os == "win": TIMEOUT
   [shared_worker (withCoopCoep: true) cross origin isolated permission test]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/reporting-subresource-corp.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/reporting-subresource-corp.https.html.ini
index 87f642f..9560d8d6 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/reporting-subresource-corp.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/reporting-subresource-corp.https.html.ini
@@ -1,6 +1,4 @@
 [reporting-subresource-corp.https.html]
-  expected:
-    if (flag_specific == "") and (product == "chrome"): TIMEOUT
   [[dedicated worker\] blocked due to COEP]
     expected: FAIL
 
@@ -12,15 +10,3 @@
 
   [[shared worker\] blocked during redirect]
     expected: FAIL
-
-  [[between service worker and page\] blocked during redirect]
-    expected:
-      if product == "chrome": NOTRUN
-
-  [[between service worker and page\] blocked due to COEP]
-    expected:
-      if product == "chrome": TIMEOUT
-
-  [destination: script]
-    expected:
-      if product == "chrome": NOTRUN
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coop-sandbox-redirects-cuts-opener.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coop-sandbox-redirects-cuts-opener.https.html.ini
index 4e04abe..72e5db08 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coop-sandbox-redirects-cuts-opener.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coop-sandbox-redirects-cuts-opener.https.html.ini
@@ -1,8 +1,8 @@
 [coop-sandbox-redirects-cuts-opener.https.html]
   [<iframe sandbox="allow-popups allow-scripts allow-same-origin"> Sandboxed Cross-Origin-Opener-Policy popup should cut the opener if necessary including during redirects.]
     expected:
-      if os == "win": [PASS, FAIL]
+      if os == "win": FAIL
 
   [<iframe sandbox="allow-popups allow-scripts"> Sandboxed Cross-Origin-Opener-Policy popup should cut the opener if necessary including during redirects.]
     expected:
-      if os == "win": [PASS, FAIL]
+      if os == "win": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-non-ascii.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-non-ascii.https.html.ini
deleted file mode 100644
index fd3dc93..0000000
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-non-ascii.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[header-parsing-non-ascii.https.html]
-  expected:
-    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html.ini
deleted file mode 100644
index 8eb49f5..0000000
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html]
-  expected:
-    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.ini
new file mode 100644
index 0000000..0ece312
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.ini
@@ -0,0 +1,3 @@
+[popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-allow-popups-to-same-origin-allow-popups.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-allow-popups-to-same-origin-allow-popups.https.html.ini
index c563da9..9813f106 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-allow-popups-to-same-origin-allow-popups.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-allow-popups-to-same-origin-allow-popups.https.html.ini
@@ -16,4 +16,4 @@
 
 [iframe-popup-same-origin-allow-popups-to-same-origin-allow-popups.https.html?9-last]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-to-unsafe-none.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-to-unsafe-none.https.html.ini
index 8eec163..59c33be 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-to-unsafe-none.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-to-unsafe-none.https.html.ini
@@ -11,6 +11,8 @@
     if product == "chrome": ERROR
 
 [iframe-popup-same-origin-to-unsafe-none.https.html?9-last]
+  expected:
+    if product == "chrome": [ERROR, OK]
 
 [iframe-popup-same-origin-to-unsafe-none.https.html?3-4]
   expected:
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/javascript-url.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/javascript-url.https.html.ini
index e3e0f9d7b..b8259e3c 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/javascript-url.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/javascript-url.https.html.ini
@@ -15,21 +15,15 @@
     if product == "chrome": ERROR
 
 [javascript-url.https.html?15-16]
-  expected:
-    if product == "chrome": ERROR
 
 [javascript-url.https.html?17-last]
   expected:
     if product == "chrome": ERROR
 
 [javascript-url.https.html?5-6]
-  expected:
-    if product == "chrome": ERROR
 
 [javascript-url.https.html?7-8]
   expected:
     if product == "chrome": ERROR
 
 [javascript-url.https.html?9-10]
-  expected:
-    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-top-to-aboutblank.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-top-to-aboutblank.https.html.ini
index 9a870f3..d5c6b762 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-top-to-aboutblank.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-top-to-aboutblank.https.html.ini
@@ -1,4 +1,6 @@
 [navigate-top-to-aboutblank.https.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
   [Navigate top to about:blank from iframe with opener COOP: |header(Cross-Origin-Opener-Policy,same-origin), iframe origin: https://www1.web-platform.test:8444]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-redirect-cache.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-redirect-cache.https.html.ini
index 116d941..9c8fdd8 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-redirect-cache.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-redirect-cache.https.html.ini
@@ -1,13 +1,11 @@
 [popup-redirect-cache.https.html?2-3]
 
 [popup-redirect-cache.https.html?0-1]
-  expected:
-    if product == "chrome": [OK, ERROR]
 
 [popup-redirect-cache.https.html?6-7]
+  expected:
+    if product == "chrome": [ERROR, OK]
 
 [popup-redirect-cache.https.html?4-5]
 
 [popup-redirect-cache.https.html?8-last]
-  expected:
-    if product == "chrome": [OK, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html.ini
deleted file mode 100644
index 21a59714..0000000
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[popup-same-origin-with-cross-origin.https.html]
-  expected:
-    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https.html.ini
index 604de218..c087e209 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https.html.ini
@@ -1,3 +1,3 @@
 [popup-unsafe-none-with-same-site.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-openee_coop-ro.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-openee_coop-ro.https.html.ini
index 4ca363c7..59258e97 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-openee_coop-ro.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-openee_coop-ro.https.html.ini
@@ -1,10 +1,3 @@
 [access-from-coop-page-to-openee_coop-ro.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
-  [access-from-coop-page-to-openee, same-origin + redirect]
-    expected:
-      if product == "chrome": FAIL
-
-  [access-from-coop-page-to-openee, same-origin]
-    expected:
-      if product == "chrome": FAIL
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-opener_coop-ro_cross-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-opener_coop-ro_cross-origin.https.html.ini
index 175280c..7e47b2b0 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-opener_coop-ro_cross-origin.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-opener_coop-ro_cross-origin.https.html.ini
@@ -1,10 +1,3 @@
 [access-from-coop-page-to-opener_coop-ro_cross-origin.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
-  [access-from-coop-page-to-opener, cross-origin + redirect]
-    expected:
-      if product == "chrome": FAIL
-
-  [access-from-coop-page-to-opener, cross-origin]
-    expected:
-      if (os == "linux") and (product == "chrome"): FAIL
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-other_coop-ro.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-other_coop-ro.https.html.ini
index 999c88e2..ad1f304 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-other_coop-ro.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-other_coop-ro.https.html.ini
@@ -1,3 +1,6 @@
 [access-from-coop-page-to-other_coop-ro.https.html]
   expected:
-    if product == "chrome": [ERROR, CRASH]
+    if product == "chrome": [OK, ERROR]
+  [access-from-coop-page-to-other (COOP-RO)]
+    expected:
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-other_coop-ro_cross-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-other_coop-ro_cross-origin.https.html.ini
index dd5c96b2..56b8e03 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-other_coop-ro_cross-origin.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-other_coop-ro_cross-origin.https.html.ini
@@ -1,3 +1,6 @@
 [access-from-coop-page-to-other_coop-ro_cross-origin.https.html]
   expected:
-    if product == "chrome": ERROR
+    if product == "chrome": [OK, ERROR]
+  [access-from-coop-page-to-other (COOP-RO)]
+    expected:
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-openee_coop-ro_cross-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-openee_coop-ro_cross-origin.https.html.ini
index a07396ec2..c12963c3 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-openee_coop-ro_cross-origin.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-openee_coop-ro_cross-origin.https.html.ini
@@ -1,6 +1,4 @@
 [access-to-coop-page-from-openee_coop-ro_cross-origin.https.html]
-  expected:
-    if product == "chrome": [ERROR, OK]
   [access-to-coop-page-from-openee, cross-origin]
     expected:
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-other_coop-ro.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-other_coop-ro.https.html.ini
index 22693c3..12463d2 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-other_coop-ro.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-other_coop-ro.https.html.ini
@@ -1,6 +1,3 @@
 [access-to-coop-page-from-other_coop-ro.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
-  [access-to-coop-page-from-other (COOP-RO)]
-    expected:
-      if product == "chrome": FAIL
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-other_coop-ro_cross-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-other_coop-ro_cross-origin.https.html.ini
index 9d900f4e..9871408 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-other_coop-ro_cross-origin.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-other_coop-ro_cross-origin.https.html.ini
@@ -1,3 +1,6 @@
 [access-to-coop-page-from-other_coop-ro_cross-origin.https.html]
   expected:
-    if product == "chrome": ERROR
+    if product == "chrome": [OK, ERROR]
+  [access-to-coop-page-from-other (COOP-RO)]
+    expected:
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-close.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-close.https.html.ini
index d060d8a9..1abd8a1 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-close.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-close.https.html.ini
@@ -1,10 +1,3 @@
 [property-close.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
-  [cross-origin > w => w.close()]
-    expected:
-      if product == "chrome": FAIL
-
-  [same-origin > w => w.close()]
-    expected:
-      if product == "chrome": FAIL
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-closed.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-closed.https.html.ini
index ad0e9b0..99d03e52c 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-closed.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-closed.https.html.ini
@@ -1,3 +1,10 @@
 [property-closed.https.html]
   expected:
-    if product == "chrome": ERROR
+    if product == "chrome": [OK, ERROR]
+  [cross-origin > w => w.closed]
+    expected:
+      if product == "chrome": FAIL
+
+  [same-origin > w => w.closed]
+    expected:
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-location-get.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-location-get.https.html.ini
index dcfc817..0523467e 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-location-get.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-location-get.https.html.ini
@@ -1,3 +1,10 @@
 [property-location-get.https.html]
   expected:
-    if product == "chrome": ERROR
+    if product == "chrome": [OK, ERROR]
+  [cross-origin > w => w.location]
+    expected:
+      if product == "chrome": FAIL
+
+  [same-origin > w => w.location]
+    expected:
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-location-set.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-location-set.https.html.ini
index 1ee952d..175abd5 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-location-set.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-location-set.https.html.ini
@@ -1,4 +1,6 @@
 [property-location-set.https.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
   [cross-origin > w => w.location = "#"]
     expected:
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/document-reporting/report-to-both_coop-ro.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/document-reporting/report-to-both_coop-ro.https.html.ini
index 290a306..a842eff 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/document-reporting/report-to-both_coop-ro.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/document-reporting/report-to-both_coop-ro.https.html.ini
@@ -1,6 +1,4 @@
 [report-to-both_coop-ro.https.html]
-  expected:
-    if product == "chrome": [ERROR, OK]
   [Access from openee]
     expected:
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/document-reporting/reporting-redirect-with-unsafe-none.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/document-reporting/reporting-redirect-with-unsafe-none.https.html.ini
index 7b11492b..f600281 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/document-reporting/reporting-redirect-with-unsafe-none.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/document-reporting/reporting-redirect-with-unsafe-none.https.html.ini
@@ -1,10 +1,3 @@
 [reporting-redirect-with-unsafe-none.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
-  [Cross origin openee redirected to same-origin with unsafe-none]
-    expected:
-      if product == "chrome": FAIL
-
-  [Same origin openee redirected to same-origin with unsafe-none]
-    expected:
-      if product == "chrome": FAIL
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.ini
index da58f27..2451a4e 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.ini
@@ -16,4 +16,4 @@
 
 [iframe-popup-to-so.https.html?9-last]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.ini
index dd70f03..29c6cc0 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.ini
@@ -3,8 +3,6 @@
     if product == "chrome": ERROR
 
 [iframe-popup-to-soap.https.html?3-4]
-  expected:
-    if product == "chrome": ERROR
 
 [iframe-popup-to-soap.https.html?1-2]
   expected:
@@ -16,4 +14,4 @@
 
 [iframe-popup-to-soap.https.html?9-last]
   expected:
-    if product == "chrome": [ERROR, OK]
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.ini
index 4f6dc5095..f3681f2 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.ini
@@ -9,6 +9,8 @@
 
 
 [iframe-popup.https.html?9-last]
+  expected:
+    if product == "chrome": ERROR
   [COOP: restrict-properties to popup COOP: restrict-properties via an iframe, with cross origin iframe, cross origin popup with window_open]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html.ini
index edddc8e..75e0479 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html.ini
@@ -1,6 +1,4 @@
 [popup-soap.https.html]
-  expected:
-    if product == "chrome": ERROR
   [SAME_ORIGIN popup with coop restrict-properties]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.ini
index 245d44f..1fa6809a 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.ini
@@ -1,4 +1,6 @@
 [popup-un.https.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
   [SAME_ORIGIN popup with coop restrict-properties]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.ini
index a2bc292..ed48901 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.ini
@@ -1,6 +1,6 @@
 [popup-with-same-origin.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
   [Same-origin popup with coop restrict-properties]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/documents/resource-metadata-management/document-cookie.html.ini b/third_party/blink/web_tests/external/wpt/html/dom/documents/resource-metadata-management/document-cookie.html.ini
index b9b8e1df..87ed375 100644
--- a/third_party/blink/web_tests/external/wpt/html/dom/documents/resource-metadata-management/document-cookie.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/dom/documents/resource-metadata-management/document-cookie.html.ini
@@ -1,15 +1,3 @@
 [document-cookie.html]
   [document.cookie 2]
     expected: FAIL
-
-  [document.cookie 1]
-    expected:
-      if product == "chrome": FAIL
-
-  [document has no cookie]
-    expected:
-      if product == "chrome": FAIL
-
-  [document.cookie]
-    expected:
-      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/parser-inserted-async-script.tentative.html.ini b/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/parser-inserted-async-script.tentative.html.ini
deleted file mode 100644
index 632b0b9..0000000
--- a/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/parser-inserted-async-script.tentative.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[parser-inserted-async-script.tentative.html]
-  [Rendering is blocked before render-blocking resources are loaded]
-    expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/nested-sharedworker-success.https.html.ini b/third_party/blink/web_tests/external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/nested-sharedworker-success.https.html.ini
index 5a66574c..84f2fbe 100644
--- a/third_party/blink/web_tests/external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/nested-sharedworker-success.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/nested-sharedworker-success.https.html.ini
@@ -1,4 +1,6 @@
 [nested-sharedworker-success.https.html]
+  expected:
+    if os == "win": [OK, TIMEOUT]
   [postMessaging to a dedicated sub-worker allows them to see each others' modifications]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-insert-source-not-in-document.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-insert-source-not-in-document.html.ini
index 98a26c77..ebefe86 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-insert-source-not-in-document.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-insert-source-not-in-document.html.ini
@@ -1,6 +1,5 @@
 [resource-selection-invoke-insert-source-not-in-document.html]
   [invoking resource selection by inserting <source> in video not in a document]
     expected:
-      if (flag_specific == "") and (product == "chrome"): PASS
-      if flag_specific == "disable-site-isolation-trials": PASS
+      if product == "chrome": [PASS, FAIL]
       FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-insert-source.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-insert-source.html.ini
index b9e4785..90bfb40 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-insert-source.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-insert-source.html.ini
@@ -1,5 +1,5 @@
 [resource-selection-invoke-insert-source.html]
   [invoking resource selection by inserting <source>]
     expected:
-      if flag_specific == "disable-site-isolation-trials": PASS
+      if flag_specific == "disable-layout-ng": PASS
       FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-pause-networkState.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-pause-networkState.html.ini
index 625313ce..e889ab7 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-pause-networkState.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-pause-networkState.html.ini
@@ -1,6 +1,3 @@
 [resource-selection-invoke-pause-networkState.html]
   [NOT invoking resource selection with pause() when networkState is not NETWORK_EMPTY]
-    expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): PASS
-      if flag_specific == "disable-layout-ng": PASS
-      FAIL
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-set-src.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-set-src.html.ini
index 5ae5fd0..c0581652 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-set-src.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-set-src.html.ini
@@ -1,6 +1,3 @@
 [resource-selection-invoke-set-src.html]
   [invoking load by setting src]
-    expected:
-      if (flag_specific == "") and (product == "chrome"): PASS
-      if flag_specific == "disable-site-isolation-trials": PASS
-      FAIL
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-after-controls-removed.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-after-controls-removed.html.ini
index d59d9c4..b8c5187 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-after-controls-removed.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-after-controls-removed.html.ini
@@ -1,5 +1,3 @@
 [track-cue-rendering-after-controls-removed.html]
   expected:
-    if (flag_specific == "") and (product == "chrome"): PASS
-    if flag_specific == "disable-layout-ng": PASS
-    FAIL
+    if (flag_specific == "") and (product == "content_shell"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-grandchild.tentative.sub.window.js.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-grandchild.tentative.sub.window.js.ini
index 3df57b35..a28e10d 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-grandchild.tentative.sub.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-grandchild.tentative.sub.window.js.ini
@@ -1,4 +1,4 @@
 [sandbox-top-navigation-grandchild.tentative.sub.window.html]
   expected:
-    if (flag_specific == "") and (product == "content_shell") and (os == "linux"): [OK, TIMEOUT]
-    if (flag_specific == "") and (product == "chrome"): ERROR
+    if (flag_specific == "") and (os == "linux") and (product == "chrome"): ERROR
+    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/relevant-mutations.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/relevant-mutations.html.ini
index b94e288..a2a7094 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/relevant-mutations.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/relevant-mutations.html.ini
@@ -1,9 +1,139 @@
 [relevant-mutations.html]
   [parent is picture, following sibling source inserted]
-    expected: FAIL
+    expected:
+      if os == "win": [PASS, FAIL]
+      FAIL
 
   [parent is picture, following sibling source removed]
-    expected: FAIL
+    expected:
+      if os == "win": [PASS, FAIL]
+      FAIL
 
   [parent is picture, following sibling source has srcset set]
-    expected: FAIL
+    expected:
+      if os == "win": [PASS, FAIL]
+      FAIL
+
+  [srcset is set to same value]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [parent is picture, previous source has type removed]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [removed from picture]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [referrerpolicy no-referrer-when-downgrade to empty, src already set]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [referrerpolicy absent to no-referrer, src already set]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [referrerpolicy no-referrer-when-downgrade to invalid, src already set]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [referrerpolicy no-referrer to empty, src already set]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [parent is picture, previous source removed]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [inserted into picture]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [referrerpolicy no-referrer to no-referrer-when-downgrade, src already set]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [parent is picture, previous source inserted]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [parent is picture, previous source has sizes changed]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [referrerpolicy empty to no-referrer-when-downgrade, src already set]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [parent is picture, previous source has srcset set]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [referrerpolicy no-referrer to absent, src already set]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [parent is picture, previous source has media removed]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [parent is picture, previous source has sizes set]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [parent is picture, previous source has srcset removed]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [parent is picture, previous source has type set]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [parent is picture, previous source has srcset changed]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [parent is picture, previous source has sizes removed]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [parent is picture, previous source has type changed]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [sizes is set to same value]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [referrerpolicy no-referrer-when-downgrade to absent, src already set]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [crossorigin use-credentials to absent, src already set]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [referrerpolicy no-referrer to invalid, src already set]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [parent is picture, previous source has media set]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [referrerpolicy empty to no-referrer, src already set]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [referrerpolicy absent to no-referrer-when-downgrade, src already set]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [referrerpolicy no-referrer-when-downgrade to no-referrer, src already set]
+    expected:
+      if os == "win": [PASS, FAIL]
+
+  [parent is picture, previous source has media changed]
+    expected:
+      if os == "win": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-0/text-plain.window.js.ini b/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-0/text-plain.window.js.ini
index b00bae7..cb83d32c 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-0/text-plain.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-0/text-plain.window.js.ini
@@ -1,3 +1,4 @@
 [text-plain.window.html]
   expected:
-    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
+    if (flag_specific == "") and (os == "win"): [OK, TIMEOUT]
+    if flag_specific == "disable-layout-ng": [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-target/rel-base-target.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-target/rel-base-target.html.ini
new file mode 100644
index 0000000..790eba9e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-target/rel-base-target.html.ini
@@ -0,0 +1,3 @@
+[rel-base-target.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-form-state-restore.tentative.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-form-state-restore.tentative.html.ini
index 6da6358..977886a 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-form-state-restore.tentative.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-form-state-restore.tentative.html.ini
@@ -1,2 +1,4 @@
 [selectmenu-form-state-restore.tentative.html]
-  expected: ERROR
+  expected:
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): OK
+    ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/links/following-hyperlinks/activation-behavior.window.js.ini b/third_party/blink/web_tests/external/wpt/html/semantics/links/following-hyperlinks/activation-behavior.window.js.ini
index e49c667e..ecf50d4 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/links/following-hyperlinks/activation-behavior.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/links/following-hyperlinks/activation-behavior.window.js.ini
@@ -1,11 +1,9 @@
 [activation-behavior.window.html]
   [<area> that is not connected should not be followed]
     expected:
-      if (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if os == "win": PASS
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
       FAIL
 
   [<a> that is not connected should be followed]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/event-loops/fully_active_document.window.js.ini b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/event-loops/fully_active_document.window.js.ini
index d1bc92f..d255157 100644
--- a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/event-loops/fully_active_document.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/event-loops/fully_active_document.window.js.ini
@@ -1,6 +1,5 @@
 [fully_active_document.window.html]
   expected:
-    if (product == "content_shell") and (flag_specific == "") and (os == "linux"): CRASH
     if product == "chrome": ERROR
   [Tasks for documents that are not fully active are stored, and run when the documents becomes fully-active]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/timers/negative-settimeout.any.js.ini b/third_party/blink/web_tests/external/wpt/html/webappapis/timers/negative-settimeout.any.js.ini
deleted file mode 100644
index 702bf536..0000000
--- a/third_party/blink/web_tests/external/wpt/html/webappapis/timers/negative-settimeout.any.js.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[negative-settimeout.any.html]
-
-[negative-settimeout.any.worker.html]
-  expected:
-    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/idle-detection/idle-detection-allowed-by-permissions-policy.https.sub.html.ini b/third_party/blink/web_tests/external/wpt/idle-detection/idle-detection-allowed-by-permissions-policy.https.sub.html.ini
index 2e5bbac..6f363c1 100644
--- a/third_party/blink/web_tests/external/wpt/idle-detection/idle-detection-allowed-by-permissions-policy.https.sub.html.ini
+++ b/third_party/blink/web_tests/external/wpt/idle-detection/idle-detection-allowed-by-permissions-policy.https.sub.html.ini
@@ -14,6 +14,3 @@
 
   [Permissions-Policy idle-detection=* explicity set by top-level frame allows workers in cross-origin iframes.]
     expected: NOTRUN
-
-  [Inherited header permissions policy allows dedicated workers.]
-    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/server/webtransport-h3.https.sub.any.js.ini b/third_party/blink/web_tests/external/wpt/infrastructure/server/webtransport-h3.https.sub.any.js.ini
index 6b6492c..667aadcf 100644
--- a/third_party/blink/web_tests/external/wpt/infrastructure/server/webtransport-h3.https.sub.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/infrastructure/server/webtransport-h3.https.sub.any.js.ini
@@ -1,4 +1,8 @@
 [webtransport-h3.https.sub.any.worker.html]
+  [WebTransport server should be running and should handle a bidirectional stream]
+    expected:
+      if os == "win": FAIL
+
 
 [webtransport-h3.https.sub.any.serviceworker.html]
   [WebTransport server should be running and should handle a bidirectional stream]
@@ -7,8 +11,9 @@
 
 
 [webtransport-h3.https.sub.any.sharedworker.html]
-
-[webtransport-h3.https.sub.any.html]
   [WebTransport server should be running and should handle a bidirectional stream]
     expected:
       if os == "win": FAIL
+
+
+[webtransport-h3.https.sub.any.html]
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.sub.html.ini b/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.sub.html.ini
index d1a46ba..9d717d18 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.sub.html.ini
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.sub.html.ini
@@ -1,21 +1,11 @@
 [cross-origin-iframe.sub.html]
   [topDocument.scrollingElement.scrollTop = 200]
     expected:
-      if (flag_specific == "") and (product == "content_shell") and (os == "win"): [PASS, FAIL]
-      if (flag_specific == "") and (product == "content_shell") and (os == "linux"): PASS
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
-      FAIL
+      if (flag_specific == "") and (os == "linux") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [topDocument.scrollingElement.scrollTop = 100]
     expected:
-      if os == "win": [FAIL, PASS]
-
-  [First rAF]
-    expected:
-      if (flag_specific == "") and (os == "win"): [PASS, FAIL]
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
-
-  [iframeDocument.scrollingElement.scrollTop = 250]
-    expected:
-      if (flag_specific == "") and (os == "win"): [PASS, FAIL]
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [PASS, FAIL]
+      if (os == "linux") and (flag_specific == "disable-layout-ng"): [PASS, FAIL]
+      if os == "win": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/iframe-no-root-with-wrapping-scroller.html.ini b/third_party/blink/web_tests/external/wpt/intersection-observer/iframe-no-root-with-wrapping-scroller.html.ini
new file mode 100644
index 0000000..23c24a7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/iframe-no-root-with-wrapping-scroller.html.ini
@@ -0,0 +1,3 @@
+[iframe-no-root-with-wrapping-scroller.html]
+  expected:
+    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
diff --git a/third_party/blink/web_tests/external/wpt/largest-contentful-paint/first-paint-equals-lcp-text.html.ini b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/first-paint-equals-lcp-text.html.ini
index 8f534d54..414fac1 100644
--- a/third_party/blink/web_tests/external/wpt/largest-contentful-paint/first-paint-equals-lcp-text.html.ini
+++ b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/first-paint-equals-lcp-text.html.ini
@@ -1,5 +1,5 @@
 [first-paint-equals-lcp-text.html]
   [FCP and LCP are the same when there is a single text element in the page.]
     expected:
-      if flag_specific == "disable-layout-ng": PASS
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
       FAIL
diff --git a/third_party/blink/web_tests/external/wpt/loading/early-hints/coep-early-hints-none-final-require-corp.h2.window.js.ini b/third_party/blink/web_tests/external/wpt/loading/early-hints/coep-early-hints-none-final-require-corp.h2.window.js.ini
index ada632c..2e5ceac 100644
--- a/third_party/blink/web_tests/external/wpt/loading/early-hints/coep-early-hints-none-final-require-corp.h2.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/loading/early-hints/coep-early-hints-none-final-require-corp.h2.window.js.ini
@@ -1,4 +1,4 @@
 [coep-early-hints-none-final-require-corp.h2.window.html]
   expected:
-    if product == "chrome": OK
+    if product == "chrome": [OK, ERROR]
     ERROR
diff --git a/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-absent-final-allowed.h2.window.js.ini b/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-absent-final-allowed.h2.window.js.ini
index 7de5e40c..ffaf1c01 100644
--- a/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-absent-final-allowed.h2.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-absent-final-allowed.h2.window.js.ini
@@ -1,2 +1,4 @@
 [csp-early-hints-absent-final-allowed.h2.window.html]
-  expected: ERROR
+  expected:
+    if product == "chrome": OK
+    ERROR
diff --git a/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-allowed-final-absent.h2.window.js.ini b/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-allowed-final-absent.h2.window.js.ini
index e5500a1..989e58b 100644
--- a/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-allowed-final-absent.h2.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-allowed-final-absent.h2.window.js.ini
@@ -1,2 +1,4 @@
 [csp-early-hints-allowed-final-absent.h2.window.html]
-  expected: ERROR
+  expected:
+    if product == "chrome": OK
+    ERROR
diff --git a/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-disallowed-final-absent.h2.window.js.ini b/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-disallowed-final-absent.h2.window.js.ini
index 3623b15..fd87f892 100644
--- a/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-disallowed-final-absent.h2.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-disallowed-final-absent.h2.window.js.ini
@@ -1,4 +1,2 @@
 [csp-early-hints-disallowed-final-absent.h2.window.html]
-  expected:
-    if product == "chrome": [OK, ERROR]
-    ERROR
+  expected: ERROR
diff --git a/third_party/blink/web_tests/external/wpt/loading/early-hints/preconnect-in-early-hints.h2.window.js.ini b/third_party/blink/web_tests/external/wpt/loading/early-hints/preconnect-in-early-hints.h2.window.js.ini
index 44bab013..7f528f0 100644
--- a/third_party/blink/web_tests/external/wpt/loading/early-hints/preconnect-in-early-hints.h2.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/loading/early-hints/preconnect-in-early-hints.h2.window.js.ini
@@ -1,4 +1,2 @@
 [preconnect-in-early-hints.h2.window.html]
-  expected:
-    if product == "chrome": [OK, ERROR]
-    ERROR
+  expected: ERROR
diff --git a/third_party/blink/web_tests/external/wpt/loading/early-hints/preload-without-csp-document-disallow.h2.window.js.ini b/third_party/blink/web_tests/external/wpt/loading/early-hints/preload-without-csp-document-disallow.h2.window.js.ini
index f3dd853..acb504f 100644
--- a/third_party/blink/web_tests/external/wpt/loading/early-hints/preload-without-csp-document-disallow.h2.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/loading/early-hints/preload-without-csp-document-disallow.h2.window.js.ini
@@ -1,4 +1,4 @@
 [preload-without-csp-document-disallow.h2.window.html]
   expected:
-    if product == "chrome": [ERROR, OK]
+    if product == "chrome": OK
     ERROR
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/mrow/legacy-mstyle-attributes.html.ini b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/mrow/legacy-mstyle-attributes.html.ini
index 826bfe44..be13767 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/mrow/legacy-mstyle-attributes.html.ini
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/mrow/legacy-mstyle-attributes.html.ini
@@ -1,4 +1,4 @@
 [legacy-mstyle-attributes.html]
   [Legacy mstyle attributes do not apply to mo]
     expected:
-      if product == "chrome": [PASS, FAIL]
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/media-source/dedicated-worker/mediasource-worker-play-terminate-worker.html.ini b/third_party/blink/web_tests/external/wpt/media-source/dedicated-worker/mediasource-worker-play-terminate-worker.html.ini
index e4d323f..933d86d6 100644
--- a/third_party/blink/web_tests/external/wpt/media-source/dedicated-worker/mediasource-worker-play-terminate-worker.html.ini
+++ b/third_party/blink/web_tests/external/wpt/media-source/dedicated-worker/mediasource-worker-play-terminate-worker.html.ini
@@ -1,8 +1,12 @@
 [mediasource-worker-play-terminate-worker.html]
   [Test worker MediaSource termination after at least 6 main thread setTimeouts, starting counting before setting srcObject]
     expected:
-      if product == "chrome": [PASS, FAIL]
+      if (product == "content_shell") and (flag_specific == "") and (os == "linux"): [PASS, FAIL]
 
   [Test worker MediaSource termination after at least 8 main thread setTimeouts, starting counting before setting srcObject]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+
+  [Test worker MediaSource termination after at least 9 main thread setTimeouts, starting counting before setting srcObject]
+    expected:
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/media-source/mediasource-avtracks.html.ini b/third_party/blink/web_tests/external/wpt/media-source/mediasource-avtracks.html.ini
index e9e2a32..96f7c14 100644
--- a/third_party/blink/web_tests/external/wpt/media-source/mediasource-avtracks.html.ini
+++ b/third_party/blink/web_tests/external/wpt/media-source/mediasource-avtracks.html.ini
@@ -4,4 +4,6 @@
 
   [Media tracks must be removed when the SourceBuffer is removed from the MediaSource]
     expected:
-      if (flag_specific == "") and (os == "win"): FAIL
+      if (flag_specific == "") and (product == "chrome"): [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": PASS
+      FAIL
diff --git a/third_party/blink/web_tests/external/wpt/media-source/mediasource-duration.html.ini b/third_party/blink/web_tests/external/wpt/media-source/mediasource-duration.html.ini
index 3627867..80b5872 100644
--- a/third_party/blink/web_tests/external/wpt/media-source/mediasource-duration.html.ini
+++ b/third_party/blink/web_tests/external/wpt/media-source/mediasource-duration.html.ini
@@ -1,5 +1,7 @@
 [mediasource-duration.html]
   expected:
-    if (os == "linux") and (product == "chrome"): [OK, ERROR]
-    if os == "win": OK
-    ERROR
+    if flag_specific == "disable-site-isolation-trials": ERROR
+    if flag_specific == "disable-layout-ng": ERROR
+  [Test appendBuffer completes previous seek to truncated duration]
+    expected:
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigation-methods/return-value/navigate-initial-about-blank.html.ini b/third_party/blink/web_tests/external/wpt/navigation-api/navigation-methods/return-value/navigate-initial-about-blank.html.ini
index b34e07a7..0adc9d25 100644
--- a/third_party/blink/web_tests/external/wpt/navigation-api/navigation-methods/return-value/navigate-initial-about-blank.html.ini
+++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigation-methods/return-value/navigate-initial-about-blank.html.ini
@@ -1,3 +1,3 @@
 [navigate-initial-about-blank.html]
   expected:
-    if flag_specific == "disable-layout-ng": [OK, ERROR]
+    if flag_specific == "disable-layout-ng": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/navigation-timing/test-performance-attributes.sub.html.ini b/third_party/blink/web_tests/external/wpt/navigation-timing/test-performance-attributes.sub.html.ini
index 47d7592..a805bf5 100644
--- a/third_party/blink/web_tests/external/wpt/navigation-timing/test-performance-attributes.sub.html.ini
+++ b/third_party/blink/web_tests/external/wpt/navigation-timing/test-performance-attributes.sub.html.ini
@@ -1,4 +1,4 @@
 [test-performance-attributes.sub.html]
   [Check that performance.timing has reasonable values for secureConnectionStart and other attributes]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if (flag_specific == "") and (product == "chrome"): [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/pending-beacon/pending_beacon-sendondiscard.tentative.https.window.js.ini b/third_party/blink/web_tests/external/wpt/pending-beacon/pending_beacon-sendondiscard.tentative.https.window.js.ini
index e40c36d..3150981 100644
--- a/third_party/blink/web_tests/external/wpt/pending-beacon/pending_beacon-sendondiscard.tentative.https.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/pending-beacon/pending_beacon-sendondiscard.tentative.https.window.js.ini
@@ -1,18 +1,6 @@
 [pending_beacon-sendondiscard.tentative.https.window.html]
   expected:
     if product == "chrome": ERROR
-  [A discarded document sends all its beacons of which backgroundTimeouts are\n    not default.]
-    expected:
-      if (flag_specific == "") and (os == "linux"): [PASS, FAIL]
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
-
-  [A discarded document sends all its beacons of which timeouts are not\n    default.]
-    expected:
-      if (flag_specific == "") and (os == "linux"): [PASS, FAIL]
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
-
   [A discarded document does not send an already sent beacon.]
     expected:
-      if (flag_specific == "") and (os == "linux"): FAIL
-      if flag_specific == "disable-layout-ng": PASS
-      [FAIL, PASS]
+      if (flag_specific == "") and (os == "win"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/pending-beacon/pending_post_beacon-cors.tentative.https.window.js.ini b/third_party/blink/web_tests/external/wpt/pending-beacon/pending_post_beacon-cors.tentative.https.window.js.ini
index bec5019..b881b0f 100644
--- a/third_party/blink/web_tests/external/wpt/pending-beacon/pending_post_beacon-cors.tentative.https.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/pending-beacon/pending_post_beacon-cors.tentative.https.window.js.ini
@@ -1,6 +1,3 @@
 [pending_post_beacon-cors.tentative.https.window.html]
   expected:
-    if product == "chrome": [OK, TIMEOUT]
-  [PendingPostBeacon(ArrayBuffer): PendingPostBeacon[ArrayBuffer\]: cross-origin, CORS-safelisted Content-Type => non-CORS response (from redirect handler) should be rejected by browser]
-    expected:
-      if product == "chrome": [PASS, TIMEOUT]
+    if (product == "content_shell") and (flag_specific == "") and (os == "linux"): [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/pending-beacon/pending_post_beacon-sendwithdata.tentative.https.window.js.ini b/third_party/blink/web_tests/external/wpt/pending-beacon/pending_post_beacon-sendwithdata.tentative.https.window.js.ini
new file mode 100644
index 0000000..7eb5ca5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/pending-beacon/pending_post_beacon-sendwithdata.tentative.https.window.js.ini
@@ -0,0 +1,72 @@
+[pending_post_beacon-sendwithdata.tentative.https.window.html]
+  [PendingPostBeacon(String): Sent empty String, and server got no data.]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [PendingPostBeacon(ArrayBuffer): Sent empty ArrayBuffer, and server got no data.]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [PendingPostBeacon(FormData): Sent empty FormData, and server got no data.]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [PendingPostBeacon(URLSearchParams): Sent empty URLSearchParams, and server got no data.]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [PendingPostBeacon(Blob): Sent empty Blob, and server got no data.]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [PendingPostBeacon(File): Sent empty File, and server got no data.]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [PendingPostBeacon(String): Encoded and sent in POST request.]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [PendingPostBeacon(ArrayBuffer): Encoded and sent in POST request.]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [PendingPostBeacon(FormData): Encoded and sent in POST request.]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [PendingPostBeacon(URLSearchParams): Encoded and sent in POST request.]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [PendingPostBeacon(Blob): Encoded and sent in POST request.]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [PendingPostBeacon(File): Encoded and sent in POST request.]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [PendingPostBeacon(String): Sent out big data.]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [PendingPostBeacon(ArrayBuffer): Sent out big data.]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [PendingPostBeacon(FormData): Sent out big data.]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [PendingPostBeacon(URLSearchParams): Sent out big data.]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [PendingPostBeacon(Blob): Sent out big data.]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [PendingPostBeacon(File): Sent out big data.]
+    expected:
+      if product == "chrome": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/performance-timeline/not-restored-reasons/performance-navigation-timing-same-origin-bfcache.tentative.window.js.ini b/third_party/blink/web_tests/external/wpt/performance-timeline/not-restored-reasons/performance-navigation-timing-same-origin-bfcache.tentative.window.js.ini
index 9d13735..b54282c 100644
--- a/third_party/blink/web_tests/external/wpt/performance-timeline/not-restored-reasons/performance-navigation-timing-same-origin-bfcache.tentative.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/performance-timeline/not-restored-reasons/performance-navigation-timing-same-origin-bfcache.tentative.window.js.ini
@@ -1,5 +1,7 @@
 [performance-navigation-timing-same-origin-bfcache.tentative.window.html]
   [RemoteContextHelper navigation using BFCache]
     expected:
-      if (flag_specific == "") and (product == "content_shell") and (os == "win"): [PASS, FAIL]
-      if (flag_specific == "") and (product == "chrome"): FAIL
+      if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [PASS, FAIL]
+      if (os == "linux") and (flag_specific == "disable-site-isolation-trials"): PASS
+      if (os == "linux") and (flag_specific == "disable-layout-ng"): [PASS, FAIL]
+      FAIL
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/bluetooth-allowed-by-permissions-policy.https.sub.html.ini b/third_party/blink/web_tests/external/wpt/permissions-policy/bluetooth-allowed-by-permissions-policy.https.sub.html.ini
index 99d782c..75a7b4b 100644
--- a/third_party/blink/web_tests/external/wpt/permissions-policy/bluetooth-allowed-by-permissions-policy.https.sub.html.ini
+++ b/third_party/blink/web_tests/external/wpt/permissions-policy/bluetooth-allowed-by-permissions-policy.https.sub.html.ini
@@ -1,4 +1,6 @@
 [bluetooth-allowed-by-permissions-policy.https.sub.html]
+  expected:
+    if flag_specific == "disable-layout-ng": [OK, TIMEOUT]
   [bluetooth-allowed-by-permissions-policy]
     expected:
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/unload-allowed-by-default.tentative.window.js.ini b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/unload-allowed-by-default.tentative.window.js.ini
new file mode 100644
index 0000000..041aee22
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/unload-allowed-by-default.tentative.window.js.ini
@@ -0,0 +1,3 @@
+[unload-allowed-by-default.tentative.window.html]
+  expected:
+    if os == "win": [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/reporting/reporting-isolated-across-navigations.https.sub.html.ini b/third_party/blink/web_tests/external/wpt/reporting/reporting-isolated-across-navigations.https.sub.html.ini
index a20d664..2e79080 100644
--- a/third_party/blink/web_tests/external/wpt/reporting/reporting-isolated-across-navigations.https.sub.html.ini
+++ b/third_party/blink/web_tests/external/wpt/reporting/reporting-isolated-across-navigations.https.sub.html.ini
@@ -1,4 +1,5 @@
 [reporting-isolated-across-navigations.https.sub.html]
   [Reports should be sent to the correct endpoints]
     expected:
+      if (product == "content_shell") and (flag_specific == "") and (os == "linux"): [PASS, FAIL]
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-rAF-dynamic.html.ini b/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-rAF-dynamic.html.ini
index 765815f..2c4667b 100644
--- a/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-rAF-dynamic.html.ini
+++ b/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-rAF-dynamic.html.ini
@@ -1,3 +1,3 @@
 [deadline-max-rAF-dynamic.html]
   expected:
-    if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [OK, TIMEOUT]
+    if flag_specific == "disable-layout-ng": [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-rAF.html.ini b/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-rAF.html.ini
index ff1add8..b79130fb 100644
--- a/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-rAF.html.ini
+++ b/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-rAF.html.ini
@@ -1,3 +1,3 @@
 [deadline-max-rAF.html]
   expected:
-    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
+    if (flag_specific == "") and (os == "win"): [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/nested-context-navigations-iframe.html.ini b/third_party/blink/web_tests/external/wpt/resource-timing/nested-context-navigations-iframe.html.ini
index d39ca27..99d8add 100644
--- a/third_party/blink/web_tests/external/wpt/resource-timing/nested-context-navigations-iframe.html.ini
+++ b/third_party/blink/web_tests/external/wpt/resource-timing/nested-context-navigations-iframe.html.ini
@@ -1,4 +1,4 @@
 [nested-context-navigations-iframe.html]
   [Test that crossorigin iframe navigations are not observable by the parent, even after history navigations by the parent]
     expected:
-      if os == "win": [PASS, FAIL]
+      if os == "win": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/no-entries-for-cross-origin-css-fetched-memory-cache.sub.html.ini b/third_party/blink/web_tests/external/wpt/resource-timing/no-entries-for-cross-origin-css-fetched-memory-cache.sub.html.ini
index 74539cf6..e3208a2 100644
--- a/third_party/blink/web_tests/external/wpt/resource-timing/no-entries-for-cross-origin-css-fetched-memory-cache.sub.html.ini
+++ b/third_party/blink/web_tests/external/wpt/resource-timing/no-entries-for-cross-origin-css-fetched-memory-cache.sub.html.ini
@@ -1,5 +1,6 @@
 [no-entries-for-cross-origin-css-fetched-memory-cache.sub.html]
   [Make sure that resources fetched by cross origin CSS are not in the timeline.]
     expected:
-      if (product == "content_shell") and (flag_specific == "") and (os == "win"): FAIL
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): FAIL
+      if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [PASS, FAIL]
+      if os == "win": PASS
+      FAIL
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/response-status-code.html.ini b/third_party/blink/web_tests/external/wpt/resource-timing/response-status-code.html.ini
index 28fcc51c..b06a0ac 100644
--- a/third_party/blink/web_tests/external/wpt/resource-timing/response-status-code.html.ini
+++ b/third_party/blink/web_tests/external/wpt/resource-timing/response-status-code.html.ini
@@ -1,130 +1,51 @@
 [response-status-code.html]
-  expected:
-    if (product == "content_shell") and (flag_specific == "") and (os == "win"): TIMEOUT
-    if (product == "content_shell") and (flag_specific == "disable-layout-ng"): TIMEOUT
-    if product == "chrome": [TIMEOUT, OK]
-  [This test validates the response status of resources. 299]
-    expected:
-      if product == "chrome": [NOTRUN, PASS]
-
-  [This test validates the response status of resources. 289]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
   [This test validates the response status of resources. 296]
     expected:
-      if product == "chrome": [PASS, TIMEOUT, NOTRUN]
-
-  [This test validates the response status of resources. 292]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 291]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 297]
-    expected:
-      if product == "chrome": [NOTRUN, PASS]
-
-  [This test validates the response status of resources. 293]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+      if product == "chrome": FAIL
 
   [This test validates the response status of resources. 276]
     expected: [NOTRUN, PASS, TIMEOUT]
 
-  [This test validates the response status of resources. 283]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
   [This test validates the response status of resources. 273]
     expected: [PASS, NOTRUN]
 
-  [This test validates the response status of resources. 282]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 288]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 290]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
   [This test validates the response status of resources. 271]
     expected: [PASS, NOTRUN]
 
   [This test validates the response status of resources. 275]
-    expected: [NOTRUN, PASS, TIMEOUT]
-
-  [This test validates the response status of resources. 281]
     expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 287]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+      if product == "chrome": FAIL
 
   [This test validates the response status of resources. 268]
     expected: [PASS, NOTRUN]
 
-  [This test validates the response status of resources. 298]
-    expected:
-      if product == "chrome": [NOTRUN, PASS]
-
   [This test validates the response status of resources. 267]
     expected: [NOTRUN, PASS]
 
   [This test validates the response status of resources. 294]
     expected:
-      if product == "chrome": [PASS, NOTRUN]
+      if (product == "content_shell") and (flag_specific == "") and (os == "linux"): [PASS, FAIL]
 
   [This test validates the response status of resources. 272]
     expected: [PASS, TIMEOUT, NOTRUN]
 
-  [This test validates the response status of resources. 286]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 285]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
   [This test validates the response status of resources. 278]
     expected:
-      if product == "chrome": [PASS, NOTRUN]
+      if (product == "content_shell") and (flag_specific == "disable-layout-ng"): [PASS, FAIL]
 
   [This test validates the response status of resources. 274]
     expected: [PASS, NOTRUN]
 
-  [This test validates the response status of resources. 280]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 295]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 277]
-    expected:
-      if product == "chrome": [PASS, TIMEOUT]
-
   [This test validates the response status of resources. 270]
     expected: [PASS, NOTRUN]
 
   [This test validates the response status of resources. 279]
     expected:
-      if product == "chrome": [PASS, NOTRUN]
+      if product == "chrome": FAIL
 
   [This test validates the response status of resources. 269]
     expected: [PASS, NOTRUN]
 
-  [This test validates the response status of resources. 284]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
   [This test validates the response status of resources. 125]
     expected: [PASS, NOTRUN]
 
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/cache-storage/cache-add.https.any.js.ini b/third_party/blink/web_tests/external/wpt/service-workers/cache-storage/cache-add.https.any.js.ini
index d767838f..6e81129 100644
--- a/third_party/blink/web_tests/external/wpt/service-workers/cache-storage/cache-add.https.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/service-workers/cache-storage/cache-add.https.any.js.ini
@@ -7,6 +7,10 @@
   [Cache.addAll called with the same Request object specified twice]
     expected: FAIL
 
+  [Cache.addAll should succeed when entries differ by vary header]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
 
 [cache-add.https.any.serviceworker.html]
   [Cache.addAll called with the same Request object specified twice]
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/about-blank-replacement.https.html.ini b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/about-blank-replacement.https.html.ini
index b2a61d9c..c59a16f 100644
--- a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/about-blank-replacement.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/about-blank-replacement.https.html.ini
@@ -1,6 +1,6 @@
 [about-blank-replacement.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
   [Initial about:blank is controlled, exposed to clients.matchAll(), and matches final Client.]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/client-navigate.https.html.ini b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/client-navigate.https.html.ini
new file mode 100644
index 0000000..ed96e18b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/client-navigate.https.html.ini
@@ -0,0 +1,4 @@
+[client-navigate.https.html]
+  [Frame location should not be accessible after redirect]
+    expected:
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/unregister-immediately-during-extendable-events.https.html.ini b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/unregister-immediately-during-extendable-events.https.html.ini
index 481bcd7..acf3dea8 100644
--- a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/unregister-immediately-during-extendable-events.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/unregister-immediately-during-extendable-events.https.html.ini
@@ -1,7 +1,8 @@
 [unregister-immediately-during-extendable-events.https.html]
   expected:
-    if (product == "content_shell") and (flag_specific == "") and (os == "linux"): [TIMEOUT, OK]
-    if product == "chrome": TIMEOUT
+    if flag_specific == "disable-layout-ng": [TIMEOUT, OK]
+    if flag_specific == "disable-site-isolation-trials": OK
+    TIMEOUT
   [Clear-Site-Data must fail pending subresource fetch events.]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/csp-script-src-self.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/csp-script-src-self.html.ini
index 74869a8f..a3b998ac 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/csp-script-src-self.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/csp-script-src-self.html.ini
@@ -1,5 +1,4 @@
 [csp-script-src-self.html]
   expected:
-    if (os == "linux") and (product == "chrome"): OK
-    if os == "win": [OK, ERROR]
-    ERROR
+    if (os == "linux") and (flag_specific == "") and (product == "content_shell"): ERROR
+    if os == "win": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/navigator-subapp.https.tentative.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/navigator-subapp.https.tentative.html.ini
index 6a8f25d..f08bb85 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/navigator-subapp.https.tentative.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/navigator-subapp.https.tentative.html.ini
@@ -1,7 +1,7 @@
 [navigator-subapp.https.tentative.html]
   expected:
-    if (product == "content_shell") and (os == "win"): [OK, TIMEOUT]
-    if product == "chrome": TIMEOUT
+    if (os == "linux") and (product == "chrome"): TIMEOUT
+    if os == "win": TIMEOUT
   [prerendering pages should not be able to access subapp API.]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/response-code-non-successful.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/response-code-non-successful.html.ini
deleted file mode 100644
index 29ab07e..0000000
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/response-code-non-successful.html.ini
+++ /dev/null
@@ -1,17 +0,0 @@
-[response-code-non-successful.html?code=404]
-  expected:
-    if product == "chrome": ERROR
-
-[response-code-non-successful.html?code=503]
-
-[response-code-non-successful.html?code=402]
-
-[response-code-non-successful.html?code=205]
-
-[response-code-non-successful.html?code=204]
-  expected:
-    if product == "chrome": [OK, ERROR]
-
-[response-code-non-successful.html?code=500]
-  expected:
-    if product == "chrome": [OK, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/response-code-successful.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/response-code-successful.html.ini
index 2cbbf86..89a10867 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/response-code-successful.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/response-code-successful.html.ini
@@ -1,14 +1,15 @@
 [response-code-successful.html?code=203]
-  expected:
-    if product == "chrome": ERROR
+  [Responses with code 203 should be activated]
+    expected:
+      if (product == "content_shell") and (os == "win"): [PASS, FAIL]
+      if product == "chrome": FAIL
+
 
 [response-code-successful.html?code=200]
   expected:
     if product == "chrome": ERROR
 
 [response-code-successful.html?code=201]
-  expected:
-    if product == "chrome": [OK, ERROR]
   [Responses with code 201 should be activated]
     expected:
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-dedicated-worker.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-dedicated-worker.https.html.ini
index 9362fa3..4c890c0c2 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-dedicated-worker.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-dedicated-worker.https.html.ini
@@ -1,5 +1,6 @@
 [restriction-dedicated-worker.https.html]
   expected:
+    if (product == "content_shell") and (os == "win"): [OK, ERROR]
     if product == "chrome": TIMEOUT
   [The access to the Dedicated Worker API should be deferred until the\n    prerendered page is activated]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-encrypted-media-unsupported-config.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-encrypted-media-unsupported-config.https.html.ini
index ac50913..a6597b5 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-encrypted-media-unsupported-config.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-encrypted-media-unsupported-config.https.html.ini
@@ -1,7 +1,6 @@
 [restriction-encrypted-media-unsupported-config.https.html]
   expected:
-    if (os == "linux") and (product == "chrome"): TIMEOUT
-    if os == "win": ERROR
+    if product == "chrome": TIMEOUT
   [the access to the Encrypted Media API should be deferred with the\n    unsupported configurations until the prerendered page is activated]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-idle-detection.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-idle-detection.https.html.ini
index d76b8a30..ff11792f 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-idle-detection.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-idle-detection.https.html.ini
@@ -1,7 +1,7 @@
 [restriction-idle-detection.https.html]
   expected:
-    if (product == "content_shell") and (os == "win"): [OK, TIMEOUT]
-    if product == "chrome": TIMEOUT
+    if (os == "linux") and (product == "content_shell") and (flag_specific == "disable-layout-ng"): [OK, TIMEOUT]
+    if (os == "linux") and (product == "chrome"): TIMEOUT
   [prerendering pages should not be able to invoke the Idle Detection API]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-media-auto-play-attribute.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-media-auto-play-attribute.html.ini
index 1638866..8abf580 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-media-auto-play-attribute.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-media-auto-play-attribute.html.ini
@@ -3,6 +3,7 @@
   disabled:
     if flag_specific == "force-renderer-accessibility": was skipped in 'FlagExpectations/force-renderer-accessibility'
   expected:
+    if (product == "content_shell") and (os == "win"): [OK, ERROR]
     if product == "chrome": TIMEOUT
   [autoplay of the audio media should be deferred until the prerendered page is activated]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-message-boxes.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-message-boxes.html.ini
index 8bd9788..a190613 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-message-boxes.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-message-boxes.html.ini
@@ -1,7 +1,7 @@
 [restriction-message-boxes.html]
   expected:
-    if (product == "content_shell") and (os == "win"): [OK, ERROR]
-    if product == "chrome": TIMEOUT
+    if (os == "linux") and (product == "chrome"): TIMEOUT
+    if os == "win": ERROR
   [alert() does not display the modal and returns immediately]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-service-worker-update.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-service-worker-update.https.html.ini
index f959936..fb6c6b0 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-service-worker-update.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-service-worker-update.https.html.ini
@@ -1,7 +1,6 @@
 [restriction-service-worker-update.https.html]
   expected:
-    if (os == "linux") and (product == "chrome"): TIMEOUT
-    if os == "win": ERROR
+    if product == "chrome": TIMEOUT
   [ServiceWorkerRegistration.update() should be deferred in a prerendered page]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-locks.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-locks.https.html.ini
index eb9f2ef..fee9484 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-locks.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-locks.https.html.ini
@@ -1,7 +1,7 @@
 [restriction-web-locks.https.html]
   expected:
-    if (product == "content_shell") and (os == "win"): [OK, ERROR]
-    if product == "chrome": TIMEOUT
+    if (os == "linux") and (product == "chrome"): TIMEOUT
+    if os == "win": ERROR
   [navigator.locks.request should be deferred until the prerendered page is activated]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-share.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-share.https.html.ini
index 6a5f19de..f0101a56 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-share.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-share.https.html.ini
@@ -1,7 +1,6 @@
 [restriction-web-share.https.html]
   expected:
-    if (os == "linux") and (product == "chrome"): TIMEOUT
-    if os == "win": TIMEOUT
+    if product == "chrome": TIMEOUT
   [prerendering pages should not be able to invoke the Web Share API]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-xr-inline-session.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-xr-inline-session.https.html.ini
index 6942089..de3f51bc 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-xr-inline-session.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-xr-inline-session.https.html.ini
@@ -1,7 +1,7 @@
 [restriction-web-xr-inline-session.https.html]
   expected:
-    if (product == "content_shell") and (os == "win"): [OK, ERROR]
-    if product == "chrome": TIMEOUT
+    if (os == "linux") and (product == "chrome"): TIMEOUT
+    if os == "win": ERROR
   [The access to the WebXR inline session API should be deferred until the\n    prerendered page is activated]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-window-open.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-window-open.html.ini
index 019af15..73abde5 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-window-open.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-window-open.html.ini
@@ -1,7 +1,7 @@
 [restriction-window-open.html]
   expected:
     if (os == "linux") and (product == "chrome"): TIMEOUT
-    if os == "win": [OK, ERROR]
+    if os == "win": [OK, TIMEOUT]
   [window.open() should fail during prerendering]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/sandbox-iframe.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/sandbox-iframe.html.ini
index 927719e21..a287cc3 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/sandbox-iframe.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/sandbox-iframe.html.ini
@@ -1,5 +1,6 @@
 [sandbox-iframe.html]
   expected:
+    if (product == "content_shell") and (os == "win"): [OK, ERROR]
     if product == "chrome": TIMEOUT
   [same-origin sandbox iframes should not load until activation]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/session-history-navigation.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/session-history-navigation.https.html.ini
index af371ee..415a3a1 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/session-history-navigation.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/session-history-navigation.https.html.ini
@@ -1,7 +1,6 @@
 [session-history-navigation.https.html]
   expected:
-    if (os == "linux") and (product == "chrome"): TIMEOUT
-    if os == "win": TIMEOUT
+    if product == "chrome": TIMEOUT
   [Synthetic anchor click navigates independently with replacement in a prerender]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/windowclient-navigate.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/windowclient-navigate.https.html.ini
index 1ea18b66..f209d85e 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/windowclient-navigate.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/windowclient-navigate.https.html.ini
@@ -3,4 +3,5 @@
     if product == "chrome": TIMEOUT
   [WindowClient.navigate() for a prerendered main page should throw aTypeError]
     expected:
+      if (product == "content_shell") and (os == "win"): [PASS, FAIL]
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/storage/partitioned-estimate-usage-details-caches.tentative.https.sub.html.ini b/third_party/blink/web_tests/external/wpt/storage/partitioned-estimate-usage-details-caches.tentative.https.sub.html.ini
index 322ad21..2cd29ff 100644
--- a/third_party/blink/web_tests/external/wpt/storage/partitioned-estimate-usage-details-caches.tentative.https.sub.html.ini
+++ b/third_party/blink/web_tests/external/wpt/storage/partitioned-estimate-usage-details-caches.tentative.https.sub.html.ini
@@ -1,6 +1,3 @@
 [partitioned-estimate-usage-details-caches.tentative.https.sub.html]
   expected:
-    if product == "chrome": [OK, TIMEOUT]
-  [Partitioned estimate() usage details for caches test.]
-    expected:
-      if product == "chrome": [PASS, TIMEOUT]
+    if (product == "content_shell") and (flag_specific == "disable-layout-ng"): [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/url/a-element-xhtml.xhtml.ini b/third_party/blink/web_tests/external/wpt/url/a-element-xhtml.xhtml.ini
index adfd7d0c..e03a00d 100644
--- a/third_party/blink/web_tests/external/wpt/url/a-element-xhtml.xhtml.ini
+++ b/third_party/blink/web_tests/external/wpt/url/a-element-xhtml.xhtml.ini
@@ -963,8 +963,8 @@
 
 [a-element-xhtml.xhtml?include=file]
   expected:
-    if (flag_specific == "") and (os == "win"): [OK, TIMEOUT]
-    if flag_specific == "disable-layout-ng": [OK, CRASH]
+    if (flag_specific == "") and (os == "win"): TIMEOUT
+    if flag_specific == "disable-layout-ng": CRASH
   [Parsing: <file://example%/> against <about:blank>]
     expected: FAIL
 
@@ -975,19 +975,13 @@
     expected: FAIL
 
   [Parsing: <C|/foo/bar> against <file:///tmp/mock/path>]
-    expected:
-      if os == "win": PASS
-      FAIL
+    expected: FAIL
 
   [Parsing: </C|\\foo\\bar> against <file:///tmp/mock/path>]
-    expected:
-      if os == "win": PASS
-      FAIL
+    expected: FAIL
 
   [Parsing: <//C|/foo/bar> against <file:///tmp/mock/path>]
-    expected:
-      if os == "win": PASS
-      FAIL
+    expected: FAIL
 
   [Parsing: <file://localhost> against <file:///tmp/mock/path>]
     expected: FAIL
@@ -1014,19 +1008,13 @@
     expected: FAIL
 
   [Parsing: <..> against <file:///C:/>]
-    expected:
-      if os == "win": PASS
-      FAIL
+    expected: FAIL
 
   [Parsing: </> against <file:///C:/a/b>]
-    expected:
-      if os == "win": PASS
-      FAIL
+    expected: FAIL
 
   [Parsing: </> against <file://h/C:/a/b>]
-    expected:
-      if os == "win": PASS
-      FAIL
+    expected: FAIL
 
   [Parsing: <//d:> against <file:///C:/a/b>]
     expected: FAIL
@@ -1095,24 +1083,16 @@
     expected: FAIL
 
   [Parsing: <//C:/> against <file://host/>]
-    expected:
-      if os == "win": PASS
-      FAIL
+    expected: FAIL
 
   [Parsing: <file://C:/> against <file://host/>]
-    expected:
-      if os == "win": PASS
-      FAIL
+    expected: FAIL
 
   [Parsing: <file:/C|/> against <about:blank>]
-    expected:
-      if os == "win": PASS
-      FAIL
+    expected: FAIL
 
   [Parsing: <file://C|/> against <about:blank>]
-    expected:
-      if os == "win": PASS
-      FAIL
+    expected: FAIL
 
   [Parsing: <file://localhost//a//../..//foo> against <about:blank>]
     expected: FAIL
@@ -1138,80 +1118,10 @@
   [Parsing: <file://xn--/p> against <about:blank>]
     expected: FAIL
 
-  [Parsing: <file:/.//p> against <about:blank>]
-    expected:
-      if os == "win": FAIL
-
-  [Parsing: </c:/foo/bar> against <file:///c:/baz/qux>]
-    expected:
-      if os == "win": FAIL
-
-  [Parsing: <file:/example.com/> against <http://example.org/foo/bar>]
-    expected:
-      if os == "win": FAIL
-
-  [Parsing: <file:///./y:> against <about:blank>]
-    expected:
-      if os == "win": FAIL
-
-  [Parsing: <file:#frag> against <about:blank>]
-    expected:
-      if os == "win": FAIL
-
-  [Parsing: <file:..> against <http://www.example.com/test>]
-    expected:
-      if os == "win": FAIL
-
-  [Parsing: <file:C:/> against <file://host/>]
-    expected:
-      if os == "win": FAIL
-
-  [Parsing: </C:/> against <file://host/>]
-    expected:
-      if os == "win": FAIL
-
-  [Parsing: </c:/foo/bar> against <file://host/path>]
-    expected:
-      if os == "win": FAIL
-
-  [Parsing: <file:?q=v> against <about:blank>]
-    expected:
-      if os == "win": FAIL
-
-  [Parsing: <file:/example.com/> against <about:blank>]
-    expected:
-      if os == "win": FAIL
-
-  [Parsing: <file:///y:/> against <about:blank>]
-    expected:
-      if os == "win": FAIL
-
-  [Parsing: <file:...> against <http://www.example.com/test>]
-    expected:
-      if os == "win": FAIL
-
-  [Parsing: <file:/C:/> against <file://host/>]
-    expected:
-      if os == "win": FAIL
-
-  [Parsing: <file:a> against <http://www.example.com/test>]
-    expected:
-      if os == "win": FAIL
-
-  [Parsing: <file:\\c:\\foo\\bar> against <file:///c:/baz/qux>]
-    expected:
-      if os == "win": FAIL
-
-  [Parsing: <file:///y:> against <about:blank>]
-    expected:
-      if os == "win": FAIL
-
-  [Parsing: <file:.//p> against <about:blank>]
-    expected:
-      if os == "win": FAIL
-
 
 [a-element-xhtml.xhtml?exclude=(file|javascript|mailto)]
+  expected:
+    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
   [Parsing: <non-special://test:@test/x> against <about:blank>]
     expected: FAIL
 
@@ -2063,13 +1973,14 @@
 
 [a-element-xhtml.xhtml?include=mailto]
   expected:
-    if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [OK, CRASH]
-    if (os == "linux") and (flag_specific == "disable-layout-ng"): [OK, CRASH]
-    if os == "win": TIMEOUT
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): CRASH
+    if flag_specific == "disable-layout-ng": CRASH
   [Parsing: <mailto:/../> against <about:blank>]
     expected: FAIL
 
 
 [a-element-xhtml.xhtml?include=javascript]
+  expected:
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
   [Parsing: <javascript:/../> against <about:blank>]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/url/a-element.html.ini b/third_party/blink/web_tests/external/wpt/url/a-element.html.ini
index 769ff5e..58ed526a 100644
--- a/third_party/blink/web_tests/external/wpt/url/a-element.html.ini
+++ b/third_party/blink/web_tests/external/wpt/url/a-element.html.ini
@@ -1073,7 +1073,8 @@
 
 [a-element.html?include=file]
   expected:
-    if flag_specific == "highdpi": [OK, CRASH]
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
+    if (flag_specific == "") and (os == "win"): [OK, TIMEOUT]
   [Parsing: <file://example%/> against <about:blank>]
     expected: FAIL
 
@@ -1322,8 +1323,8 @@
 
 [a-element.html?include=mailto]
   expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
-    if flag_specific == "disable-layout-ng": [OK, CRASH]
+    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
+    if flag_specific == "disable-layout-ng": CRASH
   [Parsing: <mailto:/../> against <about:blank>]
     expected: FAIL
 
@@ -2179,9 +2180,5 @@
 
 
 [a-element.html?include=javascript]
-  expected:
-    if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [OK, CRASH]
-    if (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [OK, CRASH]
-    if os == "win": [OK, TIMEOUT]
   [Parsing: <javascript:/../> against <about:blank>]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/url/failure.html.ini b/third_party/blink/web_tests/external/wpt/url/failure.html.ini
index 4364c892..97ce987 100644
--- a/third_party/blink/web_tests/external/wpt/url/failure.html.ini
+++ b/third_party/blink/web_tests/external/wpt/url/failure.html.ini
@@ -1,7 +1,7 @@
 [failure.html]
   expected:
-    if (product == "content_shell") and (flag_specific == "disable-layout-ng"): [OK, CRASH]
-    if product == "chrome": TIMEOUT
+    if (flag_specific == "") and (product == "chrome"): TIMEOUT
+    if flag_specific == "disable-layout-ng": CRASH
   [Location's href: file://example:1/ should throw]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/url/percent-encoding.window.js.ini b/third_party/blink/web_tests/external/wpt/url/percent-encoding.window.js.ini
deleted file mode 100644
index 36d5702..0000000
--- a/third_party/blink/web_tests/external/wpt/url/percent-encoding.window.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[percent-encoding.window.html]
-  expected:
-    if flag_specific == "disable-site-isolation-trials": CRASH
diff --git a/third_party/blink/web_tests/external/wpt/url/resources/setters_tests.json b/third_party/blink/web_tests/external/wpt/url/resources/setters_tests.json
index b709ef5..cff93d8 100644
--- a/third_party/blink/web_tests/external/wpt/url/resources/setters_tests.json
+++ b/third_party/blink/web_tests/external/wpt/url/resources/setters_tests.json
@@ -1603,7 +1603,7 @@
     ],
     "pathname": [
         {
-            "comment": "Cannot-be-a-base don’t have a path",
+            "comment": "Opaque paths cannot be set",
             "href": "mailto:me@example.net",
             "new_value": "/foo",
             "expected": {
@@ -1612,6 +1612,22 @@
             }
         },
         {
+            "href": "data:original",
+            "new_value": "new value",
+            "expected": {
+                "href": "data:original",
+                "pathname": "original"
+            }
+        },
+        {
+            "href": "sc:original",
+            "new_value": "new value",
+            "expected": {
+                "href": "sc:original",
+                "pathname": "original"
+            }
+        },
+        {
             "comment": "Special URLs cannot have their paths erased",
             "href": "file:///some/path",
             "new_value": "",
@@ -1830,6 +1846,23 @@
                 "href": "non-spec:/p",
                 "pathname": "/p"
             }
+        },
+        {
+            "comment": "Non-special URLs with non-opaque paths percent-encode U+0020",
+            "href": "data:/nospace",
+            "new_value": "space ",
+            "expected": {
+                "href": "data:/space%20",
+                "pathname": "/space%20"
+            }
+        },
+        {
+            "href": "sc:/nospace",
+            "new_value": "space ",
+            "expected": {
+                "href": "sc:/space%20",
+                "pathname": "/space%20"
+            }
         }
     ],
     "search": [
@@ -1914,6 +1947,42 @@
                 "href": "http://example.net/?%c3%89t%C3%A9",
                 "search": "?%c3%89t%C3%A9"
             }
+        },
+        {
+            "comment": "Drop trailing spaces from trailing opaque paths",
+            "href": "data:space ?query",
+            "new_value": "",
+            "expected": {
+                "href": "data:space",
+                "pathname": "space",
+                "search": ""
+            }
+        },
+        {
+            "href": "sc:space ?query",
+            "new_value": "",
+            "expected": {
+                "href": "sc:space",
+                "pathname": "space",
+                "search": ""
+            }
+        },
+        {
+            "comment": "Do not drop trailing spaces from non-trailing opaque paths",
+            "href": "data:space  ?query#fragment",
+            "new_value": "",
+            "expected": {
+                "href": "data:space  #fragment",
+                "search": ""
+            }
+        },
+        {
+            "href": "sc:space  ?query#fragment",
+            "new_value": "",
+            "expected": {
+                "href": "sc:space  #fragment",
+                "search": ""
+            }
         }
     ],
     "hash": [
@@ -2048,6 +2117,42 @@
                 "href": "javascript:alert(1)#castle",
                 "hash": "#castle"
             }
+        },
+        {
+            "comment": "Drop trailing spaces from trailing opaque paths",
+            "href": "data:space                                                                                                                                  #fragment",
+            "new_value": "",
+            "expected": {
+                "href": "data:space",
+                "pathname": "space",
+                "hash": ""
+            }
+        },
+        {
+            "href": "sc:space    #fragment",
+            "new_value": "",
+            "expected": {
+                "href": "sc:space",
+                "pathname": "space",
+                "hash": ""
+            }
+        },
+        {
+            "comment": "Do not drop trailing spaces from non-trailing opaque paths",
+            "href": "data:space  ?query#fragment",
+            "new_value": "",
+            "expected": {
+                "href": "data:space  ?query",
+                "hash": ""
+            }
+        },
+        {
+            "href": "sc:space  ?query#fragment",
+            "new_value": "",
+            "expected": {
+                "href": "sc:space  ?query",
+                "hash": ""
+            }
         }
     ]
 }
diff --git a/third_party/blink/web_tests/external/wpt/url/toascii.window.js.ini b/third_party/blink/web_tests/external/wpt/url/toascii.window.js.ini
index 9f9103a6..5cfe13bf 100644
--- a/third_party/blink/web_tests/external/wpt/url/toascii.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/url/toascii.window.js.ini
@@ -1,6 +1,4 @@
 [toascii.window.html]
-  expected:
-    if flag_specific == "disable-site-isolation-trials": CRASH
   [xn--a (using URL)]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/url/url-setters-a-area.window.js.ini b/third_party/blink/web_tests/external/wpt/url/url-setters-a-area.window.js.ini
index ceb0623..f89c646 100644
--- a/third_party/blink/web_tests/external/wpt/url/url-setters-a-area.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/url/url-setters-a-area.window.js.ini
@@ -585,8 +585,6 @@
 
 
 [url-setters-a-area.window.html?include=file]
-  expected:
-    if os == "win": [OK, TIMEOUT]
   [<a>: Setting <file://localhost/>.protocol = 'http' Can’t switch from file URL with no host]
     expected: FAIL
 
@@ -649,6 +647,8 @@
 
 
 [url-setters-a-area.window.html?exclude=(file|javascript|mailto)]
+  expected:
+    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
   [<a>: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special]
     expected: FAIL
 
@@ -1149,10 +1149,20 @@
     expected:
       if os == "win": FAIL
 
+  [<a>: Setting <sc:/nospace>.pathname = 'space ']
+    expected: FAIL
+
+  [<area>: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020]
+    expected: FAIL
+
+  [<area>: Setting <sc:/nospace>.pathname = 'space ']
+    expected: FAIL
+
+  [<a>: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020]
+    expected: FAIL
+
 
 [url-setters-a-area.window.html?include=javascript]
-  expected:
-    if flag_specific == "disable-layout-ng": [OK, CRASH]
   [<a>: Setting <javascript://x/>.username = 'wario']
     expected: FAIL
 
@@ -1173,8 +1183,6 @@
 
 
 [url-setters-a-area.window.html?include=mailto]
-  expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
   [<a>: Setting <mailto:me@example.net>.protocol = 'http' Cannot-be-a-base URL doesn’t have a host, but URL in a special scheme must.]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/url/url-setters-a-area.window_include=mailto-expected.txt b/third_party/blink/web_tests/external/wpt/url/url-setters-a-area.window_include=mailto-expected.txt
index 7138439..addb92f 100644
--- a/third_party/blink/web_tests/external/wpt/url/url-setters-a-area.window_include=mailto-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/url/url-setters-a-area.window_include=mailto-expected.txt
@@ -10,7 +10,7 @@
 PASS <area>: Setting <mailto:me@example.net>.host = 'example.com' Cannot-be-a-base means no host
 PASS <a>: Setting <mailto:me@example.net>.hostname = 'example.com' Cannot-be-a-base means no host
 PASS <area>: Setting <mailto:me@example.net>.hostname = 'example.com' Cannot-be-a-base means no host
-PASS <a>: Setting <mailto:me@example.net>.pathname = '/foo' Cannot-be-a-base don’t have a path
-PASS <area>: Setting <mailto:me@example.net>.pathname = '/foo' Cannot-be-a-base don’t have a path
+PASS <a>: Setting <mailto:me@example.net>.pathname = '/foo' Opaque paths cannot be set
+PASS <area>: Setting <mailto:me@example.net>.pathname = '/foo' Opaque paths cannot be set
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/url/url-setters-stripping.any.js.ini b/third_party/blink/web_tests/external/wpt/url/url-setters-stripping.any.js.ini
index 68d160c..5c23a98 100644
--- a/third_party/blink/web_tests/external/wpt/url/url-setters-stripping.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/url/url-setters-stripping.any.js.ini
@@ -1,4 +1,6 @@
 [url-setters-stripping.any.html]
+  expected:
+    if os == "win": [OK, TIMEOUT]
   [Setting pathname with leading U+0000 (https:)]
     expected: FAIL
 
@@ -316,8 +318,6 @@
 
 
 [url-setters-stripping.any.worker.html]
-  expected:
-    if os == "win": TIMEOUT
   [Setting pathname with leading U+0000 (https:)]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/url/url-setters.any.js.ini b/third_party/blink/web_tests/external/wpt/url/url-setters.any.js.ini
index 9b7e559..2cdb957 100644
--- a/third_party/blink/web_tests/external/wpt/url/url-setters.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/url/url-setters.any.js.ini
@@ -825,8 +825,28 @@
     expected:
       if os == "win": FAIL
 
+  [URL: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths]
+    expected: FAIL
+
+  [URL: Setting <sc:space    #fragment>.hash = '']
+    expected: FAIL
+
+  [URL: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020]
+    expected: FAIL
+
+  [URL: Setting <sc:space ?query>.search = '']
+    expected: FAIL
+
+  [URL: Setting <sc:/nospace>.pathname = 'space ']
+    expected: FAIL
+
+  [URL: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths]
+    expected: FAIL
+
 
 [url-setters.any.worker.html?exclude=(file|javascript|mailto)]
+  expected:
+    if os == "win": [OK, TIMEOUT]
   [URL: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.]
     expected:
       if os == "win": FAIL
@@ -1077,6 +1097,24 @@
     expected:
       if os == "win": FAIL
 
+  [URL: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths]
+    expected: FAIL
+
+  [URL: Setting <sc:space    #fragment>.hash = '']
+    expected: FAIL
+
+  [URL: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020]
+    expected: FAIL
+
+  [URL: Setting <sc:space ?query>.search = '']
+    expected: FAIL
+
+  [URL: Setting <sc:/nospace>.pathname = 'space ']
+    expected: FAIL
+
+  [URL: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths]
+    expected: FAIL
+
 
 [url-setters.any.worker.html?include=file]
   [URL: Setting <file://localhost/>.protocol = 'http' Can’t switch from file URL with no host]
@@ -1116,8 +1154,6 @@
 
 
 [url-setters.any.html?include=file]
-  expected:
-    if os == "win": [OK, TIMEOUT]
   [URL: Setting <file://localhost/>.protocol = 'http' Can’t switch from file URL with no host]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/url/url-setters.any.worker_include=mailto-expected.txt b/third_party/blink/web_tests/external/wpt/url/url-setters.any.worker_include=mailto-expected.txt
index af68c2a..ce4605f8 100644
--- a/third_party/blink/web_tests/external/wpt/url/url-setters.any.worker_include=mailto-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/url/url-setters.any.worker_include=mailto-expected.txt
@@ -5,6 +5,6 @@
 PASS URL: Setting <mailto:me@example.net>.password = 'secret' Cannot-be-a-base means no password
 PASS URL: Setting <mailto:me@example.net>.host = 'example.com' Cannot-be-a-base means no host
 PASS URL: Setting <mailto:me@example.net>.hostname = 'example.com' Cannot-be-a-base means no host
-PASS URL: Setting <mailto:me@example.net>.pathname = '/foo' Cannot-be-a-base don’t have a path
+PASS URL: Setting <mailto:me@example.net>.pathname = '/foo' Opaque paths cannot be set
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/url/url-setters.any_include=mailto-expected.txt b/third_party/blink/web_tests/external/wpt/url/url-setters.any_include=mailto-expected.txt
index af68c2a..ce4605f8 100644
--- a/third_party/blink/web_tests/external/wpt/url/url-setters.any_include=mailto-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/url/url-setters.any_include=mailto-expected.txt
@@ -5,6 +5,6 @@
 PASS URL: Setting <mailto:me@example.net>.password = 'secret' Cannot-be-a-base means no password
 PASS URL: Setting <mailto:me@example.net>.host = 'example.com' Cannot-be-a-base means no host
 PASS URL: Setting <mailto:me@example.net>.hostname = 'example.com' Cannot-be-a-base means no host
-PASS URL: Setting <mailto:me@example.net>.pathname = '/foo' Cannot-be-a-base don’t have a path
+PASS URL: Setting <mailto:me@example.net>.pathname = '/foo' Opaque paths cannot be set
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/url/urlsearchparams-delete.any-expected.txt b/third_party/blink/web_tests/external/wpt/url/urlsearchparams-delete.any-expected.txt
new file mode 100644
index 0000000..2e788491
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/url/urlsearchparams-delete.any-expected.txt
@@ -0,0 +1,9 @@
+This is a testharness.js-based test.
+PASS Delete basics
+PASS Deleting appended multiple
+PASS Deleting all params removes ? from URL
+PASS Removing non-existent param removes ? from URL
+FAIL Changing the query of a URL with an opaque path can impact the path assert_equals: expected "space" but got "space    "
+PASS Changing the query of a URL with an opaque path can impact the path if the URL has no fragment
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/url/urlsearchparams-delete.any.js b/third_party/blink/web_tests/external/wpt/url/urlsearchparams-delete.any.js
index 1aa9b313..28ebbce 100644
--- a/third_party/blink/web_tests/external/wpt/url/urlsearchparams-delete.any.js
+++ b/third_party/blink/web_tests/external/wpt/url/urlsearchparams-delete.any.js
@@ -43,3 +43,21 @@
     assert_equals(url.href, 'http://example.com/', 'url.href does not have ?');
     assert_equals(url.search, '', 'url.search does not have ?');
 }, 'Removing non-existent param removes ? from URL');
+
+test(() => {
+  const url = new URL('data:space    ?test');
+  assert_true(url.searchParams.has('test'));
+  url.searchParams.delete('test');
+  assert_false(url.searchParams.has('test'));
+  assert_equals(url.search, '');
+  assert_equals(url.pathname, 'space');
+  assert_equals(url.href, 'data:space');
+}, 'Changing the query of a URL with an opaque path can impact the path');
+
+test(() => {
+  const url = new URL('data:space    ?test#test');
+  url.searchParams.delete('test');
+  assert_equals(url.search, '');
+  assert_equals(url.pathname, 'space    ');
+  assert_equals(url.href, 'data:space    #test');
+}, 'Changing the query of a URL with an opaque path can impact the path if the URL has no fragment');
diff --git a/third_party/blink/web_tests/external/wpt/url/urlsearchparams-delete.any.js.ini b/third_party/blink/web_tests/external/wpt/url/urlsearchparams-delete.any.js.ini
index e2c3974e3..9f22a447 100644
--- a/third_party/blink/web_tests/external/wpt/url/urlsearchparams-delete.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/url/urlsearchparams-delete.any.js.ini
@@ -1,5 +1,8 @@
 [urlsearchparams-delete.any.html]
+  [Changing the query of a URL with an opaque path can impact the path]
+    expected: FAIL
+
 
 [urlsearchparams-delete.any.worker.html]
-  expected:
-    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
+  [Changing the query of a URL with an opaque path can impact the path]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/url/urlsearchparams-delete.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/url/urlsearchparams-delete.any.worker-expected.txt
new file mode 100644
index 0000000..2e788491
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/url/urlsearchparams-delete.any.worker-expected.txt
@@ -0,0 +1,9 @@
+This is a testharness.js-based test.
+PASS Delete basics
+PASS Deleting appended multiple
+PASS Deleting all params removes ? from URL
+PASS Removing non-existent param removes ? from URL
+FAIL Changing the query of a URL with an opaque path can impact the path assert_equals: expected "space" but got "space    "
+PASS Changing the query of a URL with an opaque path can impact the path if the URL has no fragment
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/url/urlsearchparams-stringifier.any.js.ini b/third_party/blink/web_tests/external/wpt/url/urlsearchparams-stringifier.any.js.ini
index acdd4a89..d7a376af 100644
--- a/third_party/blink/web_tests/external/wpt/url/urlsearchparams-stringifier.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/url/urlsearchparams-stringifier.any.js.ini
@@ -2,4 +2,4 @@
 
 [urlsearchparams-stringifier.any.html]
   expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): CRASH
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/onremove.html.ini b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/onremove.html.ini
deleted file mode 100644
index b77dcd3..0000000
--- a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/onremove.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[onremove.html]
-  [onremove events are fired in the correct order]
-    expected:
-      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/timing-model/timelines/document-timelines.html.ini b/third_party/blink/web_tests/external/wpt/web-animations/timing-model/timelines/document-timelines.html.ini
new file mode 100644
index 0000000..8c474c4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/web-animations/timing-model/timelines/document-timelines.html.ini
@@ -0,0 +1,4 @@
+[document-timelines.html]
+  [Document timelines report current time relative to navigationStart]
+    expected:
+      if product == "chrome": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/timing-model/timelines/sibling-iframe-timeline.html.ini b/third_party/blink/web_tests/external/wpt/web-animations/timing-model/timelines/sibling-iframe-timeline.html.ini
index 675b3f1..96ae3e67 100644
--- a/third_party/blink/web_tests/external/wpt/web-animations/timing-model/timelines/sibling-iframe-timeline.html.ini
+++ b/third_party/blink/web_tests/external/wpt/web-animations/timing-model/timelines/sibling-iframe-timeline.html.ini
@@ -1,5 +1,4 @@
 [sibling-iframe-timeline.html]
   [animation tied to another frame's timeline runs properly]
     expected:
-      if (flag_specific == "") and (os == "win"): FAIL
-      if flag_specific == "disable-layout-ng": FAIL
+      if os == "win": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/web-locks/query-ordering.tentative.https.html.ini b/third_party/blink/web_tests/external/wpt/web-locks/query-ordering.tentative.https.html.ini
deleted file mode 100644
index 5567922..0000000
--- a/third_party/blink/web_tests/external/wpt/web-locks/query-ordering.tentative.https.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[query-ordering.tentative.https.html]
-  expected:
-    if flag_specific == "disable-site-isolation-trials": CRASH
-  [Requests appear in state in order made.]
-    expected:
-      if product == "chrome": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/web-locks/query.tentative.https.any.js.ini b/third_party/blink/web_tests/external/wpt/web-locks/query.tentative.https.any.js.ini
index ce2966b3..c7d15b03 100644
--- a/third_party/blink/web_tests/external/wpt/web-locks/query.tentative.https.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/web-locks/query.tentative.https.any.js.ini
@@ -1,5 +1,5 @@
 [query.tentative.https.any.html]
   expected:
-    if flag_specific == "disable-layout-ng": [OK, CRASH]
+    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
 
 [query.tentative.https.any.worker.html]
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-analysernode-interface/test-analyser-output.html.ini b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-analysernode-interface/test-analyser-output.html.ini
index 3b3be66a..448db8f 100644
--- a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-analysernode-interface/test-analyser-output.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-analysernode-interface/test-analyser-output.html.ini
@@ -1,6 +1,4 @@
 [test-analyser-output.html]
   [AnalyserNode output]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "chrome"): [FAIL, PASS]
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if os == "win": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audiocontext-interface/processing-after-resume.https.html.ini b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audiocontext-interface/processing-after-resume.https.html.ini
index 8d05420..a270ea35 100644
--- a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audiocontext-interface/processing-after-resume.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audiocontext-interface/processing-after-resume.https.html.ini
@@ -1,3 +1,5 @@
 [processing-after-resume.https.html]
   [Test consistency of processing after resume()]
-    expected: FAIL
+    expected:
+      if flag_specific == "disable-layout-ng": PASS
+      FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webmessaging/broadcastchannel/workers.html.ini b/third_party/blink/web_tests/external/wpt/webmessaging/broadcastchannel/workers.html.ini
new file mode 100644
index 0000000..49c2787
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webmessaging/broadcastchannel/workers.html.ini
@@ -0,0 +1,3 @@
+[workers.html]
+  expected:
+    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/webmessaging/message-channels/worker-post-after-close.any.js.ini b/third_party/blink/web_tests/external/wpt/webmessaging/message-channels/worker-post-after-close.any.js.ini
index 38e85428..be207b65 100644
--- a/third_party/blink/web_tests/external/wpt/webmessaging/message-channels/worker-post-after-close.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/webmessaging/message-channels/worker-post-after-close.any.js.ini
@@ -1,5 +1,5 @@
 [worker-post-after-close.any.html]
-
-[worker-post-after-close.any.worker.html]
   expected:
     if os == "win": [OK, TIMEOUT]
+
+[worker-post-after-close.any.worker.html]
diff --git a/third_party/blink/web_tests/external/wpt/webmessaging/without-ports/020.html.ini b/third_party/blink/web_tests/external/wpt/webmessaging/without-ports/020.html.ini
index b35e66e..265c7a6 100644
--- a/third_party/blink/web_tests/external/wpt/webmessaging/without-ports/020.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webmessaging/without-ports/020.html.ini
@@ -1,4 +1,4 @@
 [020.html]
   [cross-origin test]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-connectionState.https.html.ini b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-connectionState.https.html.ini
new file mode 100644
index 0000000..effd8e9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-connectionState.https.html.ini
@@ -0,0 +1,4 @@
+[RTCPeerConnection-connectionState.https.html]
+  [connection with one data channel should eventually have transports in connected state]
+    expected:
+      if product == "chrome": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/audio_has_no_subtitles.html.ini b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/audio_has_no_subtitles.html.ini
new file mode 100644
index 0000000..6a131e9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/audio_has_no_subtitles.html.ini
@@ -0,0 +1,3 @@
+[audio_has_no_subtitles.html]
+  expected:
+    if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/events_referenceSpace_reset_inline.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/events_referenceSpace_reset_inline.https.html.ini
index fddaa5b..00c1d56 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/events_referenceSpace_reset_inline.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/events_referenceSpace_reset_inline.https.html.ini
@@ -1,6 +1,7 @@
 [events_referenceSpace_reset_inline.https.html]
-  expected:
-    if product == "chrome": OK
-    TIMEOUT
+  expected: TIMEOUT
   [XRSession resetpose from a device properly fires off the right events for non-immersive sessions - webgl]
     expected: FAIL
+
+  [XRSession resetpose from a device properly fires off the right events for non-immersive sessions - webgl2]
+    expected: TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/webxr/hit-test/xrRay_matrix.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/hit-test/xrRay_matrix.https.html.ini
new file mode 100644
index 0000000..43d34ba
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webxr/hit-test/xrRay_matrix.https.html.ini
@@ -0,0 +1,3 @@
+[xrRay_matrix.https.html]
+  expected:
+    if flag_specific == "highdpi": [OK, CRASH]
diff --git a/third_party/blink/web_tests/external/wpt/workers/baseurl/alpha/importScripts-in-worker.html.ini b/third_party/blink/web_tests/external/wpt/workers/baseurl/alpha/importScripts-in-worker.html.ini
index b871ad55..3924145 100644
--- a/third_party/blink/web_tests/external/wpt/workers/baseurl/alpha/importScripts-in-worker.html.ini
+++ b/third_party/blink/web_tests/external/wpt/workers/baseurl/alpha/importScripts-in-worker.html.ini
@@ -1,3 +1,3 @@
 [importScripts-in-worker.html]
   expected:
-    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
+    if flag_specific == "disable-site-isolation-trials": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/workers/dedicated-worker-from-blob-url.window.js.ini b/third_party/blink/web_tests/external/wpt/workers/dedicated-worker-from-blob-url.window.js.ini
index b6f8e24..1f41aff 100644
--- a/third_party/blink/web_tests/external/wpt/workers/dedicated-worker-from-blob-url.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/workers/dedicated-worker-from-blob-url.window.js.ini
@@ -1,4 +1,4 @@
 [dedicated-worker-from-blob-url.window.html]
   expected:
-    if (flag_specific == "") and (os == "win"): [OK, TIMEOUT]
+    if (flag_specific == "") and (os == "win"): TIMEOUT
     if flag_specific == "disable-layout-ng": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/event-ports-dedicated.html.ini b/third_party/blink/web_tests/external/wpt/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/event-ports-dedicated.html.ini
deleted file mode 100644
index de76679c..0000000
--- a/third_party/blink/web_tests/external/wpt/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/event-ports-dedicated.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[event-ports-dedicated.html]
-  expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/workers/interfaces/WorkerGlobalScope/location/redirect.html.ini b/third_party/blink/web_tests/external/wpt/workers/interfaces/WorkerGlobalScope/location/redirect.html.ini
deleted file mode 100644
index 3a0f10f..0000000
--- a/third_party/blink/web_tests/external/wpt/workers/interfaces/WorkerGlobalScope/location/redirect.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[redirect.html]
-  expected:
-    if os == "win": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/workers/interfaces/WorkerGlobalScope/self.any.js.ini b/third_party/blink/web_tests/external/wpt/workers/interfaces/WorkerGlobalScope/self.any.js.ini
new file mode 100644
index 0000000..33a7441f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/workers/interfaces/WorkerGlobalScope/self.any.js.ini
@@ -0,0 +1,7 @@
+[self.any.serviceworker.html]
+
+[self.any.worker.html]
+  expected:
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
+
+[self.any.sharedworker.html]
diff --git "a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
new file mode 100644
index 0000000..e0c1e6a
--- /dev/null
+++ "b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -0,0 +1,389 @@
+This is a testharness.js-based test.
+Found 371 tests; 231 PASS, 140 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS Loading data…
+PASS <a>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
+PASS <area>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
+PASS <a>: Setting <a://example.net>.protocol = 'b'
+PASS <area>: Setting <a://example.net>.protocol = 'b'
+PASS <a>: Setting <a://example.net>.protocol = 'B' Upper-case ASCII is lower-cased
+PASS <area>: Setting <a://example.net>.protocol = 'B' Upper-case ASCII is lower-cased
+PASS <a>: Setting <a://example.net>.protocol = 'é' Non-ASCII is rejected
+PASS <area>: Setting <a://example.net>.protocol = 'é' Non-ASCII is rejected
+PASS <a>: Setting <a://example.net>.protocol = '0b' No leading digit
+PASS <area>: Setting <a://example.net>.protocol = '0b' No leading digit
+PASS <a>: Setting <a://example.net>.protocol = '+b' No leading punctuation
+PASS <area>: Setting <a://example.net>.protocol = '+b' No leading punctuation
+PASS <a>: Setting <a://example.net>.protocol = 'bC0+-.'
+PASS <area>: Setting <a://example.net>.protocol = 'bC0+-.'
+PASS <a>: Setting <a://example.net>.protocol = 'b,c' Only some punctuation is acceptable
+PASS <area>: Setting <a://example.net>.protocol = 'b,c' Only some punctuation is acceptable
+PASS <a>: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected
+PASS <area>: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected
+PASS <a>: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file
+PASS <area>: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file
+PASS <a>: Setting <https://example.net:1234>.protocol = 'file'
+PASS <area>: Setting <https://example.net:1234>.protocol = 'file'
+PASS <a>: Setting <wss://x:x@example.net:1234>.protocol = 'file'
+PASS <area>: Setting <wss://x:x@example.net:1234>.protocol = 'file'
+FAIL <a>: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "b://example.net/"
+FAIL <area>: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "b://example.net/"
+FAIL <a>: Setting <https://example.net>.protocol = 's' assert_equals: expected "https://example.net/" but got "s://example.net/"
+FAIL <area>: Setting <https://example.net>.protocol = 's' assert_equals: expected "https://example.net/" but got "s://example.net/"
+FAIL <a>: Setting <ftp://example.net>.protocol = 'test' assert_equals: expected "ftp://example.net/" but got "test://example.net/"
+FAIL <area>: Setting <ftp://example.net>.protocol = 'test' assert_equals: expected "ftp://example.net/" but got "test://example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'https' assert_equals: expected "ssh://me@example.net" but got "https://me@example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'https' assert_equals: expected "ssh://me@example.net" but got "https://me@example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
+FAIL <a>: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
+FAIL <area>: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
+FAIL <a>: Setting <nonsense:///test>.protocol = 'https' assert_equals: expected "nonsense:///test" but got "https://test/"
+FAIL <area>: Setting <nonsense:///test>.protocol = 'https' assert_equals: expected "nonsense:///test" but got "https://test/"
+PASS <a>: Setting <http://example.net>.protocol = 'https:foo : bar' Stuff after the first ':' is ignored
+PASS <area>: Setting <http://example.net>.protocol = 'https:foo : bar' Stuff after the first ':' is ignored
+PASS <a>: Setting <data:text/html,<p>Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored
+PASS <area>: Setting <data:text/html,<p>Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored
+PASS <a>: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.
+PASS <area>: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.
+PASS <a>: Setting <unix:/run/foo.socket>.username = 'me' No host means no username
+PASS <area>: Setting <unix:/run/foo.socket>.username = 'me' No host means no username
+PASS <a>: Setting <http://example.net>.username = 'me'
+PASS <area>: Setting <http://example.net>.username = 'me'
+PASS <a>: Setting <http://:secret@example.net>.username = 'me'
+PASS <area>: Setting <http://:secret@example.net>.username = 'me'
+PASS <a>: Setting <http://me@example.net>.username = ''
+PASS <area>: Setting <http://me@example.net>.username = ''
+PASS <a>: Setting <http://me:secret@example.net>.username = ''
+PASS <area>: Setting <http://me:secret@example.net>.username = ''
+FAIL <a>: Setting <http://example.net>.username = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+FAIL <area>: Setting <http://example.net>.username = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS <a>: Setting <http://example.net>.username = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <area>: Setting <http://example.net>.username = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <a>: Setting <sc:///>.username = 'x'
+PASS <area>: Setting <sc:///>.username = 'x'
+PASS <a>: Setting <unix:/run/foo.socket>.password = 'secret' No host means no password
+PASS <area>: Setting <unix:/run/foo.socket>.password = 'secret' No host means no password
+PASS <a>: Setting <http://example.net>.password = 'secret'
+PASS <area>: Setting <http://example.net>.password = 'secret'
+PASS <a>: Setting <http://me@example.net>.password = 'secret'
+PASS <area>: Setting <http://me@example.net>.password = 'secret'
+PASS <a>: Setting <http://:secret@example.net>.password = ''
+PASS <area>: Setting <http://:secret@example.net>.password = ''
+PASS <a>: Setting <http://me:secret@example.net>.password = ''
+PASS <area>: Setting <http://me:secret@example.net>.password = ''
+FAIL <a>: Setting <http://example.net>.password = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://:%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+FAIL <area>: Setting <http://example.net>.password = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://:%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS <a>: Setting <http://example.net>.password = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <area>: Setting <http://example.net>.password = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <a>: Setting <sc:///>.password = 'x'
+PASS <area>: Setting <sc:///>.password = 'x'
+FAIL <a>: Setting <sc://x/>.host = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = ' ' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = ' ' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '@' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = '@' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = 'ß' assert_equals: expected "sc://%C3%9F/" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = 'ß' assert_equals: expected "sc://%C3%9F/" but got "sc://x/"
+PASS <a>: Setting <https://x/>.host = 'ß' IDNA Nontransitional_Processing
+PASS <area>: Setting <https://x/>.host = 'ß' IDNA Nontransitional_Processing
+PASS <a>: Setting <data:text/plain,Stuff>.host = 'example.net' Cannot-be-a-base means no host
+PASS <area>: Setting <data:text/plain,Stuff>.host = 'example.net' Cannot-be-a-base means no host
+PASS <a>: Setting <http://example.net>.host = 'example.com:8080'
+PASS <area>: Setting <http://example.net>.host = 'example.com:8080'
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com' Port number is unchanged if not specified in the new value
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com' Port number is unchanged if not specified in the new value
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified
+PASS <a>: Setting <http://example.net>.host = '' The empty host is not valid for special schemes
+PASS <area>: Setting <http://example.net>.host = '' The empty host is not valid for special schemes
+FAIL <a>: Setting <view-source+http://example.net/foo>.host = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <area>: Setting <view-source+http://example.net/foo>.host = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <a>: Setting <a:/foo>.host = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+FAIL <area>: Setting <a:/foo>.host = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+PASS <a>: Setting <http://example.net>.host = '0x7F000001:8080' IPv4 address syntax is normalized
+PASS <area>: Setting <http://example.net>.host = '0x7F000001:8080' IPv4 address syntax is normalized
+PASS <a>: Setting <http://example.net>.host = '[::0:01]:2' IPv6 address syntax is normalized
+PASS <area>: Setting <http://example.net>.host = '[::0:01]:2' IPv6 address syntax is normalized
+PASS <a>: Setting <http://example.net>.host = '[2001:db8::2]:4002' IPv6 literal address with port, crbug.com/1012416
+PASS <area>: Setting <http://example.net>.host = '[2001:db8::2]:4002' IPv6 literal address with port, crbug.com/1012416
+PASS <a>: Setting <http://example.net>.host = 'example.com:80' Default port number is removed
+PASS <area>: Setting <http://example.net>.host = 'example.com:80' Default port number is removed
+PASS <a>: Setting <https://example.net>.host = 'example.com:443' Default port number is removed
+PASS <area>: Setting <https://example.net>.host = 'example.com:443' Default port number is removed
+PASS <a>: Setting <https://example.net>.host = 'example.com:80' Default port number is only removed for the relevant scheme
+PASS <area>: Setting <https://example.net>.host = 'example.com:80' Default port number is only removed for the relevant scheme
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com:80' Port number is removed if new port is scheme default and existing URL has a non-default port
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com:80' Port number is removed if new port is scheme default and existing URL has a non-default port
+PASS <a>: Setting <http://example.net/path>.host = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.host = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.host = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <area>: Setting <view-source+http://example.net/path>.host = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <a>: Setting <view-source+http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.com:8080/path" but got "view-source+http://example.net/path"
+FAIL <area>: Setting <view-source+http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.com:8080/path" but got "view-source+http://example.net/path"
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:65535' Port numbers are 16 bit integers
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:65535' Port numbers are 16 bit integers
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.
+PASS <a>: Setting <http://example.net/>.host = '[google.com]' Broken IPv6
+PASS <area>: Setting <http://example.net/>.host = '[google.com]' Broken IPv6
+PASS <a>: Setting <http://example.net/>.host = '[::1.2.3.4x]'
+PASS <area>: Setting <http://example.net/>.host = '[::1.2.3.4x]'
+FAIL <a>: Setting <http://example.net/>.host = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <a>: Setting <http://example.net/>.host = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <a>: Setting <http://example.net/>.host = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <a>: Setting <sc://test@test/>.host = '' assert_equals: expected "test" but got ""
+FAIL <area>: Setting <sc://test@test/>.host = '' assert_equals: expected "test" but got ""
+FAIL <a>: Setting <sc://test:12/>.host = '' assert_equals: expected "test:12" but got ""
+FAIL <area>: Setting <sc://test:12/>.host = '' assert_equals: expected "test:12" but got ""
+PASS <a>: Setting <http://example.com/>.host = '///bad.com' Leading / is not stripped
+PASS <area>: Setting <http://example.com/>.host = '///bad.com' Leading / is not stripped
+FAIL <a>: Setting <sc://example.com/>.host = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <area>: Setting <sc://example.com/>.host = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <a>: Setting <sc://x/>.hostname = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.hostname = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = ' ' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = ' ' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.hostname = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '@' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = '@' assert_equals: expected "x" but got ""
+PASS <a>: Setting <data:text/plain,Stuff>.hostname = 'example.net' Cannot-be-a-base means no host
+PASS <area>: Setting <data:text/plain,Stuff>.hostname = 'example.net' Cannot-be-a-base means no host
+PASS <a>: Setting <http://example.net:8080>.hostname = 'example.com'
+PASS <area>: Setting <http://example.net:8080>.hostname = 'example.com'
+PASS <a>: Setting <http://example.net>.hostname = '' The empty host is not valid for special schemes
+PASS <area>: Setting <http://example.net>.hostname = '' The empty host is not valid for special schemes
+FAIL <a>: Setting <view-source+http://example.net/foo>.hostname = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <area>: Setting <view-source+http://example.net/foo>.hostname = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <a>: Setting <a:/foo>.hostname = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+FAIL <area>: Setting <a:/foo>.hostname = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+PASS <a>: Setting <http://example.net:8080>.hostname = '0x7F000001' IPv4 address syntax is normalized
+PASS <area>: Setting <http://example.net:8080>.hostname = '0x7F000001' IPv4 address syntax is normalized
+PASS <a>: Setting <http://example.net>.hostname = '[::0:01]' IPv6 address syntax is normalized
+PASS <area>: Setting <http://example.net>.hostname = '[::0:01]' IPv6 address syntax is normalized
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com:8080' : delimiter invalidates entire value
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com:8080' : delimiter invalidates entire value
+PASS <a>: Setting <http://example.net:8080/path>.hostname = 'example.com:' : delimiter invalidates entire value
+PASS <area>: Setting <http://example.net:8080/path>.hostname = 'example.com:' : delimiter invalidates entire value
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.hostname = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <area>: Setting <view-source+http://example.net/path>.hostname = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+PASS <a>: Setting <http://example.net/>.hostname = '[google.com]' Broken IPv6
+PASS <area>: Setting <http://example.net/>.hostname = '[google.com]' Broken IPv6
+PASS <a>: Setting <http://example.net/>.hostname = '[::1.2.3.4x]'
+PASS <area>: Setting <http://example.net/>.hostname = '[::1.2.3.4x]'
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <a>: Setting <sc://test@test/>.hostname = '' assert_equals: expected "test" but got ""
+FAIL <area>: Setting <sc://test@test/>.hostname = '' assert_equals: expected "test" but got ""
+FAIL <a>: Setting <sc://test:12/>.hostname = '' assert_equals: expected "test:12" but got ""
+FAIL <area>: Setting <sc://test:12/>.hostname = '' assert_equals: expected "test:12" but got ""
+FAIL <a>: Setting <non-spec:/.//p>.hostname = 'h' Drop /. from path assert_equals: expected "non-spec://h//p" but got "non-spec:/.//p"
+FAIL <area>: Setting <non-spec:/.//p>.hostname = 'h' Drop /. from path assert_equals: expected "non-spec://h//p" but got "non-spec:/.//p"
+FAIL <a>: Setting <non-spec:/.//p>.hostname = '' assert_equals: expected "non-spec:////p" but got "non-spec:/.//p"
+FAIL <area>: Setting <non-spec:/.//p>.hostname = '' assert_equals: expected "non-spec:////p" but got "non-spec:/.//p"
+PASS <a>: Setting <http://example.com/>.hostname = '///bad.com' Leading / is not stripped
+PASS <area>: Setting <http://example.com/>.hostname = '///bad.com' Leading / is not stripped
+FAIL <a>: Setting <sc://example.com/>.hostname = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <area>: Setting <sc://example.com/>.hostname = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+PASS <a>: Setting <http://example.net>.port = '8080'
+PASS <area>: Setting <http://example.net>.port = '8080'
+PASS <a>: Setting <http://example.net:8080>.port = '' Port number is removed if empty is the new value
+PASS <area>: Setting <http://example.net:8080>.port = '' Port number is removed if empty is the new value
+PASS <a>: Setting <http://example.net:8080>.port = '80' Default port number is removed
+PASS <area>: Setting <http://example.net:8080>.port = '80' Default port number is removed
+PASS <a>: Setting <https://example.net:4433>.port = '443' Default port number is removed
+PASS <area>: Setting <https://example.net:4433>.port = '443' Default port number is removed
+PASS <a>: Setting <https://example.net>.port = '80' Default port number is only removed for the relevant scheme
+PASS <area>: Setting <https://example.net>.port = '80' Default port number is only removed for the relevant scheme
+PASS <a>: Setting <http://example.net/path>.port = '8080/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.port = '8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.net:8080/path" but got "view-source+http://example.net/path"
+FAIL <area>: Setting <view-source+http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.net:8080/path" but got "view-source+http://example.net/path"
+PASS <a>: Setting <http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.port = '65535' Port numbers are 16 bit integers
+PASS <area>: Setting <http://example.net/path>.port = '65535' Port numbers are 16 bit integers
+FAIL <a>: Setting <http://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "http://example.net:8080/path" but got "http://example.net:0/path"
+FAIL <area>: Setting <http://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "http://example.net:8080/path" but got "http://example.net:0/path"
+FAIL <a>: Setting <non-special://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "example.net:8080" but got ""
+FAIL <area>: Setting <non-special://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "example.net:8080" but got ""
+PASS <a>: Setting <non-base:value>.port = '12'
+PASS <area>: Setting <non-base:value>.port = '12'
+PASS <a>: Setting <sc:///>.port = '12'
+PASS <area>: Setting <sc:///>.port = '12'
+FAIL <a>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+FAIL <a>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
+FAIL <area>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
+FAIL <a>: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
+FAIL <area>: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
+FAIL <a>: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
+FAIL <area>: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
+FAIL <a>: Setting <foo:/some/path>.pathname = 'test' Path-only URLs always have an initial slash assert_equals: expected "foo:/test" but got "foo:/some/path"
+FAIL <area>: Setting <foo:/some/path>.pathname = 'test' Path-only URLs always have an initial slash assert_equals: expected "foo:/test" but got "foo:/some/path"
+FAIL <a>: Setting <unix:/run/foo.socket?timeout=10>.pathname = '/var/log/../run/bar.socket' assert_equals: expected "unix:/var/run/bar.socket?timeout=10" but got "unix:/run/foo.socket?timeout=10"
+FAIL <area>: Setting <unix:/run/foo.socket?timeout=10>.pathname = '/var/log/../run/bar.socket' assert_equals: expected "unix:/var/run/bar.socket?timeout=10" but got "unix:/run/foo.socket?timeout=10"
+PASS <a>: Setting <https://example.net#nav>.pathname = 'home'
+PASS <area>: Setting <https://example.net#nav>.pathname = 'home'
+PASS <a>: Setting <https://example.net#nav>.pathname = '../home'
+PASS <area>: Setting <https://example.net#nav>.pathname = '../home'
+PASS <a>: Setting <http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is a segment delimiter for 'special' URLs
+PASS <area>: Setting <http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is a segment delimiter for 'special' URLs
+FAIL <a>: Setting <view-source+http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is *not* a segment delimiter for non-'special' URLs assert_equals: expected "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav" but got "view-source+http://example.net/home?lang=fr#nav"
+FAIL <area>: Setting <view-source+http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is *not* a segment delimiter for non-'special' URLs assert_equals: expected "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav" but got "view-source+http://example.net/home?lang=fr#nav"
+FAIL <a>: Setting <a:/>.pathname = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed. assert_equals: expected "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/"
+FAIL <area>: Setting <a:/>.pathname = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed. assert_equals: expected "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/"
+FAIL <a>: Setting <http://example.net>.pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, including %2E outside dotted segments. assert_equals: expected "http://example.net/%2e%2E%c3%89t%C3%A9" but got "http://example.net/..%c3%89t%C3%A9"
+FAIL <area>: Setting <http://example.net>.pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, including %2E outside dotted segments. assert_equals: expected "http://example.net/%2e%2E%c3%89t%C3%A9" but got "http://example.net/..%c3%89t%C3%A9"
+PASS <a>: Setting <http://example.net>.pathname = '?' ? needs to be encoded
+PASS <area>: Setting <http://example.net>.pathname = '?' ? needs to be encoded
+PASS <a>: Setting <http://example.net>.pathname = '#' # needs to be encoded
+PASS <area>: Setting <http://example.net>.pathname = '#' # needs to be encoded
+FAIL <a>: Setting <sc://example.net>.pathname = '?' ? needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%3F" but got "sc://example.net"
+FAIL <area>: Setting <sc://example.net>.pathname = '?' ? needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%3F" but got "sc://example.net"
+FAIL <a>: Setting <sc://example.net>.pathname = '#' # needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%23" but got "sc://example.net"
+FAIL <area>: Setting <sc://example.net>.pathname = '#' # needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%23" but got "sc://example.net"
+PASS <a>: Setting <http://example.net>.pathname = '/?é' ? doesn't mess up encoding
+PASS <area>: Setting <http://example.net>.pathname = '/?é' ? doesn't mess up encoding
+PASS <a>: Setting <http://example.net>.pathname = '/#é' # doesn't mess up encoding
+PASS <area>: Setting <http://example.net>.pathname = '/#é' # doesn't mess up encoding
+FAIL <a>: Setting <non-spec:/>.pathname = '/.//p' Serialize /. in path assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '/.//p' Serialize /. in path assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL <area>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+PASS <a>: Setting <https://example.net#nav>.search = 'lang=fr'
+PASS <area>: Setting <https://example.net#nav>.search = 'lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = '??lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = '??lang=fr'
+FAIL <a>: Setting <https://example.net?lang=en-US#nav>.search = '?' assert_equals: expected "https://example.net/?#nav" but got "https://example.net/#nav"
+FAIL <area>: Setting <https://example.net?lang=en-US#nav>.search = '?' assert_equals: expected "https://example.net/?#nav" but got "https://example.net/#nav"
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = ''
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = ''
+PASS <a>: Setting <https://example.net?lang=en-US>.search = ''
+PASS <area>: Setting <https://example.net?lang=en-US>.search = ''
+PASS <a>: Setting <https://example.net>.search = ''
+PASS <area>: Setting <https://example.net>.search = ''
+FAIL <a>: Setting <a:/>.search = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+FAIL <area>: Setting <a:/>.search = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+PASS <a>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <area>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <a>: Setting <https://example.net>.hash = 'main'
+PASS <area>: Setting <https://example.net>.hash = 'main'
+PASS <a>: Setting <https://example.net#nav>.hash = 'main'
+PASS <area>: Setting <https://example.net#nav>.hash = 'main'
+PASS <a>: Setting <https://example.net?lang=en-US>.hash = '##nav'
+PASS <area>: Setting <https://example.net?lang=en-US>.hash = '##nav'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = '#main'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = '#main'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = '#'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = '#'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = ''
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = ''
+PASS <a>: Setting <http://example.net>.hash = '#foo bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo"bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo"bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo<bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo<bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo>bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo>bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo`bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo`bar'
+PASS <a>: Setting <a:/>.hash = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' Simple percent-encoding; tabs and newlines are removed
+PASS <area>: Setting <a:/>.hash = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' Simple percent-encoding; tabs and newlines are removed
+PASS <a>: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <area>: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <a>: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <area>: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <a>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <area>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+Harness: the test ran to completion.
+
diff --git "a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/idna-2008/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/idna-2008/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
new file mode 100644
index 0000000..6e10766
--- /dev/null
+++ "b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/idna-2008/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -0,0 +1,389 @@
+This is a testharness.js-based test.
+Found 371 tests; 229 PASS, 142 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS Loading data…
+PASS <a>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
+PASS <area>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
+PASS <a>: Setting <a://example.net>.protocol = 'b'
+PASS <area>: Setting <a://example.net>.protocol = 'b'
+PASS <a>: Setting <a://example.net>.protocol = 'B' Upper-case ASCII is lower-cased
+PASS <area>: Setting <a://example.net>.protocol = 'B' Upper-case ASCII is lower-cased
+PASS <a>: Setting <a://example.net>.protocol = 'é' Non-ASCII is rejected
+PASS <area>: Setting <a://example.net>.protocol = 'é' Non-ASCII is rejected
+PASS <a>: Setting <a://example.net>.protocol = '0b' No leading digit
+PASS <area>: Setting <a://example.net>.protocol = '0b' No leading digit
+PASS <a>: Setting <a://example.net>.protocol = '+b' No leading punctuation
+PASS <area>: Setting <a://example.net>.protocol = '+b' No leading punctuation
+PASS <a>: Setting <a://example.net>.protocol = 'bC0+-.'
+PASS <area>: Setting <a://example.net>.protocol = 'bC0+-.'
+PASS <a>: Setting <a://example.net>.protocol = 'b,c' Only some punctuation is acceptable
+PASS <area>: Setting <a://example.net>.protocol = 'b,c' Only some punctuation is acceptable
+PASS <a>: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected
+PASS <area>: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected
+PASS <a>: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file
+PASS <area>: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file
+PASS <a>: Setting <https://example.net:1234>.protocol = 'file'
+PASS <area>: Setting <https://example.net:1234>.protocol = 'file'
+PASS <a>: Setting <wss://x:x@example.net:1234>.protocol = 'file'
+PASS <area>: Setting <wss://x:x@example.net:1234>.protocol = 'file'
+FAIL <a>: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "b://example.net/"
+FAIL <area>: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "b://example.net/"
+FAIL <a>: Setting <https://example.net>.protocol = 's' assert_equals: expected "https://example.net/" but got "s://example.net/"
+FAIL <area>: Setting <https://example.net>.protocol = 's' assert_equals: expected "https://example.net/" but got "s://example.net/"
+FAIL <a>: Setting <ftp://example.net>.protocol = 'test' assert_equals: expected "ftp://example.net/" but got "test://example.net/"
+FAIL <area>: Setting <ftp://example.net>.protocol = 'test' assert_equals: expected "ftp://example.net/" but got "test://example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'https' assert_equals: expected "ssh://me@example.net" but got "https://me@example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'https' assert_equals: expected "ssh://me@example.net" but got "https://me@example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
+FAIL <a>: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
+FAIL <area>: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
+FAIL <a>: Setting <nonsense:///test>.protocol = 'https' assert_equals: expected "nonsense:///test" but got "https://test/"
+FAIL <area>: Setting <nonsense:///test>.protocol = 'https' assert_equals: expected "nonsense:///test" but got "https://test/"
+PASS <a>: Setting <http://example.net>.protocol = 'https:foo : bar' Stuff after the first ':' is ignored
+PASS <area>: Setting <http://example.net>.protocol = 'https:foo : bar' Stuff after the first ':' is ignored
+PASS <a>: Setting <data:text/html,<p>Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored
+PASS <area>: Setting <data:text/html,<p>Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored
+PASS <a>: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.
+PASS <area>: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.
+PASS <a>: Setting <unix:/run/foo.socket>.username = 'me' No host means no username
+PASS <area>: Setting <unix:/run/foo.socket>.username = 'me' No host means no username
+PASS <a>: Setting <http://example.net>.username = 'me'
+PASS <area>: Setting <http://example.net>.username = 'me'
+PASS <a>: Setting <http://:secret@example.net>.username = 'me'
+PASS <area>: Setting <http://:secret@example.net>.username = 'me'
+PASS <a>: Setting <http://me@example.net>.username = ''
+PASS <area>: Setting <http://me@example.net>.username = ''
+PASS <a>: Setting <http://me:secret@example.net>.username = ''
+PASS <area>: Setting <http://me:secret@example.net>.username = ''
+FAIL <a>: Setting <http://example.net>.username = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+FAIL <area>: Setting <http://example.net>.username = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS <a>: Setting <http://example.net>.username = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <area>: Setting <http://example.net>.username = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <a>: Setting <sc:///>.username = 'x'
+PASS <area>: Setting <sc:///>.username = 'x'
+PASS <a>: Setting <unix:/run/foo.socket>.password = 'secret' No host means no password
+PASS <area>: Setting <unix:/run/foo.socket>.password = 'secret' No host means no password
+PASS <a>: Setting <http://example.net>.password = 'secret'
+PASS <area>: Setting <http://example.net>.password = 'secret'
+PASS <a>: Setting <http://me@example.net>.password = 'secret'
+PASS <area>: Setting <http://me@example.net>.password = 'secret'
+PASS <a>: Setting <http://:secret@example.net>.password = ''
+PASS <area>: Setting <http://:secret@example.net>.password = ''
+PASS <a>: Setting <http://me:secret@example.net>.password = ''
+PASS <area>: Setting <http://me:secret@example.net>.password = ''
+FAIL <a>: Setting <http://example.net>.password = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://:%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+FAIL <area>: Setting <http://example.net>.password = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://:%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS <a>: Setting <http://example.net>.password = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <area>: Setting <http://example.net>.password = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <a>: Setting <sc:///>.password = 'x'
+PASS <area>: Setting <sc:///>.password = 'x'
+FAIL <a>: Setting <sc://x/>.host = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = ' ' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = ' ' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '@' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = '@' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = 'ß' assert_equals: expected "sc://%C3%9F/" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = 'ß' assert_equals: expected "sc://%C3%9F/" but got "sc://x/"
+FAIL <a>: Setting <https://x/>.host = 'ß' IDNA Nontransitional_Processing assert_equals: expected "https://xn--zca/" but got "https://ss/"
+FAIL <area>: Setting <https://x/>.host = 'ß' IDNA Nontransitional_Processing assert_equals: expected "https://xn--zca/" but got "https://ss/"
+PASS <a>: Setting <data:text/plain,Stuff>.host = 'example.net' Cannot-be-a-base means no host
+PASS <area>: Setting <data:text/plain,Stuff>.host = 'example.net' Cannot-be-a-base means no host
+PASS <a>: Setting <http://example.net>.host = 'example.com:8080'
+PASS <area>: Setting <http://example.net>.host = 'example.com:8080'
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com' Port number is unchanged if not specified in the new value
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com' Port number is unchanged if not specified in the new value
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified
+PASS <a>: Setting <http://example.net>.host = '' The empty host is not valid for special schemes
+PASS <area>: Setting <http://example.net>.host = '' The empty host is not valid for special schemes
+FAIL <a>: Setting <view-source+http://example.net/foo>.host = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <area>: Setting <view-source+http://example.net/foo>.host = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <a>: Setting <a:/foo>.host = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+FAIL <area>: Setting <a:/foo>.host = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+PASS <a>: Setting <http://example.net>.host = '0x7F000001:8080' IPv4 address syntax is normalized
+PASS <area>: Setting <http://example.net>.host = '0x7F000001:8080' IPv4 address syntax is normalized
+PASS <a>: Setting <http://example.net>.host = '[::0:01]:2' IPv6 address syntax is normalized
+PASS <area>: Setting <http://example.net>.host = '[::0:01]:2' IPv6 address syntax is normalized
+PASS <a>: Setting <http://example.net>.host = '[2001:db8::2]:4002' IPv6 literal address with port, crbug.com/1012416
+PASS <area>: Setting <http://example.net>.host = '[2001:db8::2]:4002' IPv6 literal address with port, crbug.com/1012416
+PASS <a>: Setting <http://example.net>.host = 'example.com:80' Default port number is removed
+PASS <area>: Setting <http://example.net>.host = 'example.com:80' Default port number is removed
+PASS <a>: Setting <https://example.net>.host = 'example.com:443' Default port number is removed
+PASS <area>: Setting <https://example.net>.host = 'example.com:443' Default port number is removed
+PASS <a>: Setting <https://example.net>.host = 'example.com:80' Default port number is only removed for the relevant scheme
+PASS <area>: Setting <https://example.net>.host = 'example.com:80' Default port number is only removed for the relevant scheme
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com:80' Port number is removed if new port is scheme default and existing URL has a non-default port
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com:80' Port number is removed if new port is scheme default and existing URL has a non-default port
+PASS <a>: Setting <http://example.net/path>.host = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.host = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.host = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <area>: Setting <view-source+http://example.net/path>.host = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <a>: Setting <view-source+http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.com:8080/path" but got "view-source+http://example.net/path"
+FAIL <area>: Setting <view-source+http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.com:8080/path" but got "view-source+http://example.net/path"
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:65535' Port numbers are 16 bit integers
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:65535' Port numbers are 16 bit integers
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.
+PASS <a>: Setting <http://example.net/>.host = '[google.com]' Broken IPv6
+PASS <area>: Setting <http://example.net/>.host = '[google.com]' Broken IPv6
+PASS <a>: Setting <http://example.net/>.host = '[::1.2.3.4x]'
+PASS <area>: Setting <http://example.net/>.host = '[::1.2.3.4x]'
+FAIL <a>: Setting <http://example.net/>.host = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <a>: Setting <http://example.net/>.host = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <a>: Setting <http://example.net/>.host = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <a>: Setting <sc://test@test/>.host = '' assert_equals: expected "test" but got ""
+FAIL <area>: Setting <sc://test@test/>.host = '' assert_equals: expected "test" but got ""
+FAIL <a>: Setting <sc://test:12/>.host = '' assert_equals: expected "test:12" but got ""
+FAIL <area>: Setting <sc://test:12/>.host = '' assert_equals: expected "test:12" but got ""
+PASS <a>: Setting <http://example.com/>.host = '///bad.com' Leading / is not stripped
+PASS <area>: Setting <http://example.com/>.host = '///bad.com' Leading / is not stripped
+FAIL <a>: Setting <sc://example.com/>.host = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <area>: Setting <sc://example.com/>.host = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <a>: Setting <sc://x/>.hostname = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.hostname = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = ' ' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = ' ' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.hostname = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '@' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = '@' assert_equals: expected "x" but got ""
+PASS <a>: Setting <data:text/plain,Stuff>.hostname = 'example.net' Cannot-be-a-base means no host
+PASS <area>: Setting <data:text/plain,Stuff>.hostname = 'example.net' Cannot-be-a-base means no host
+PASS <a>: Setting <http://example.net:8080>.hostname = 'example.com'
+PASS <area>: Setting <http://example.net:8080>.hostname = 'example.com'
+PASS <a>: Setting <http://example.net>.hostname = '' The empty host is not valid for special schemes
+PASS <area>: Setting <http://example.net>.hostname = '' The empty host is not valid for special schemes
+FAIL <a>: Setting <view-source+http://example.net/foo>.hostname = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <area>: Setting <view-source+http://example.net/foo>.hostname = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <a>: Setting <a:/foo>.hostname = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+FAIL <area>: Setting <a:/foo>.hostname = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+PASS <a>: Setting <http://example.net:8080>.hostname = '0x7F000001' IPv4 address syntax is normalized
+PASS <area>: Setting <http://example.net:8080>.hostname = '0x7F000001' IPv4 address syntax is normalized
+PASS <a>: Setting <http://example.net>.hostname = '[::0:01]' IPv6 address syntax is normalized
+PASS <area>: Setting <http://example.net>.hostname = '[::0:01]' IPv6 address syntax is normalized
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com:8080' : delimiter invalidates entire value
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com:8080' : delimiter invalidates entire value
+PASS <a>: Setting <http://example.net:8080/path>.hostname = 'example.com:' : delimiter invalidates entire value
+PASS <area>: Setting <http://example.net:8080/path>.hostname = 'example.com:' : delimiter invalidates entire value
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.hostname = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <area>: Setting <view-source+http://example.net/path>.hostname = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+PASS <a>: Setting <http://example.net/>.hostname = '[google.com]' Broken IPv6
+PASS <area>: Setting <http://example.net/>.hostname = '[google.com]' Broken IPv6
+PASS <a>: Setting <http://example.net/>.hostname = '[::1.2.3.4x]'
+PASS <area>: Setting <http://example.net/>.hostname = '[::1.2.3.4x]'
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <a>: Setting <sc://test@test/>.hostname = '' assert_equals: expected "test" but got ""
+FAIL <area>: Setting <sc://test@test/>.hostname = '' assert_equals: expected "test" but got ""
+FAIL <a>: Setting <sc://test:12/>.hostname = '' assert_equals: expected "test:12" but got ""
+FAIL <area>: Setting <sc://test:12/>.hostname = '' assert_equals: expected "test:12" but got ""
+FAIL <a>: Setting <non-spec:/.//p>.hostname = 'h' Drop /. from path assert_equals: expected "non-spec://h//p" but got "non-spec:/.//p"
+FAIL <area>: Setting <non-spec:/.//p>.hostname = 'h' Drop /. from path assert_equals: expected "non-spec://h//p" but got "non-spec:/.//p"
+FAIL <a>: Setting <non-spec:/.//p>.hostname = '' assert_equals: expected "non-spec:////p" but got "non-spec:/.//p"
+FAIL <area>: Setting <non-spec:/.//p>.hostname = '' assert_equals: expected "non-spec:////p" but got "non-spec:/.//p"
+PASS <a>: Setting <http://example.com/>.hostname = '///bad.com' Leading / is not stripped
+PASS <area>: Setting <http://example.com/>.hostname = '///bad.com' Leading / is not stripped
+FAIL <a>: Setting <sc://example.com/>.hostname = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <area>: Setting <sc://example.com/>.hostname = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+PASS <a>: Setting <http://example.net>.port = '8080'
+PASS <area>: Setting <http://example.net>.port = '8080'
+PASS <a>: Setting <http://example.net:8080>.port = '' Port number is removed if empty is the new value
+PASS <area>: Setting <http://example.net:8080>.port = '' Port number is removed if empty is the new value
+PASS <a>: Setting <http://example.net:8080>.port = '80' Default port number is removed
+PASS <area>: Setting <http://example.net:8080>.port = '80' Default port number is removed
+PASS <a>: Setting <https://example.net:4433>.port = '443' Default port number is removed
+PASS <area>: Setting <https://example.net:4433>.port = '443' Default port number is removed
+PASS <a>: Setting <https://example.net>.port = '80' Default port number is only removed for the relevant scheme
+PASS <area>: Setting <https://example.net>.port = '80' Default port number is only removed for the relevant scheme
+PASS <a>: Setting <http://example.net/path>.port = '8080/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.port = '8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.net:8080/path" but got "view-source+http://example.net/path"
+FAIL <area>: Setting <view-source+http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.net:8080/path" but got "view-source+http://example.net/path"
+PASS <a>: Setting <http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.port = '65535' Port numbers are 16 bit integers
+PASS <area>: Setting <http://example.net/path>.port = '65535' Port numbers are 16 bit integers
+FAIL <a>: Setting <http://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "http://example.net:8080/path" but got "http://example.net:0/path"
+FAIL <area>: Setting <http://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "http://example.net:8080/path" but got "http://example.net:0/path"
+FAIL <a>: Setting <non-special://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "example.net:8080" but got ""
+FAIL <area>: Setting <non-special://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "example.net:8080" but got ""
+PASS <a>: Setting <non-base:value>.port = '12'
+PASS <area>: Setting <non-base:value>.port = '12'
+PASS <a>: Setting <sc:///>.port = '12'
+PASS <area>: Setting <sc:///>.port = '12'
+FAIL <a>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+FAIL <a>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
+FAIL <area>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
+FAIL <a>: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
+FAIL <area>: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
+FAIL <a>: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
+FAIL <area>: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
+FAIL <a>: Setting <foo:/some/path>.pathname = 'test' Path-only URLs always have an initial slash assert_equals: expected "foo:/test" but got "foo:/some/path"
+FAIL <area>: Setting <foo:/some/path>.pathname = 'test' Path-only URLs always have an initial slash assert_equals: expected "foo:/test" but got "foo:/some/path"
+FAIL <a>: Setting <unix:/run/foo.socket?timeout=10>.pathname = '/var/log/../run/bar.socket' assert_equals: expected "unix:/var/run/bar.socket?timeout=10" but got "unix:/run/foo.socket?timeout=10"
+FAIL <area>: Setting <unix:/run/foo.socket?timeout=10>.pathname = '/var/log/../run/bar.socket' assert_equals: expected "unix:/var/run/bar.socket?timeout=10" but got "unix:/run/foo.socket?timeout=10"
+PASS <a>: Setting <https://example.net#nav>.pathname = 'home'
+PASS <area>: Setting <https://example.net#nav>.pathname = 'home'
+PASS <a>: Setting <https://example.net#nav>.pathname = '../home'
+PASS <area>: Setting <https://example.net#nav>.pathname = '../home'
+PASS <a>: Setting <http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is a segment delimiter for 'special' URLs
+PASS <area>: Setting <http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is a segment delimiter for 'special' URLs
+FAIL <a>: Setting <view-source+http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is *not* a segment delimiter for non-'special' URLs assert_equals: expected "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav" but got "view-source+http://example.net/home?lang=fr#nav"
+FAIL <area>: Setting <view-source+http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is *not* a segment delimiter for non-'special' URLs assert_equals: expected "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav" but got "view-source+http://example.net/home?lang=fr#nav"
+FAIL <a>: Setting <a:/>.pathname = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed. assert_equals: expected "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/"
+FAIL <area>: Setting <a:/>.pathname = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed. assert_equals: expected "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/"
+FAIL <a>: Setting <http://example.net>.pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, including %2E outside dotted segments. assert_equals: expected "http://example.net/%2e%2E%c3%89t%C3%A9" but got "http://example.net/..%c3%89t%C3%A9"
+FAIL <area>: Setting <http://example.net>.pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, including %2E outside dotted segments. assert_equals: expected "http://example.net/%2e%2E%c3%89t%C3%A9" but got "http://example.net/..%c3%89t%C3%A9"
+PASS <a>: Setting <http://example.net>.pathname = '?' ? needs to be encoded
+PASS <area>: Setting <http://example.net>.pathname = '?' ? needs to be encoded
+PASS <a>: Setting <http://example.net>.pathname = '#' # needs to be encoded
+PASS <area>: Setting <http://example.net>.pathname = '#' # needs to be encoded
+FAIL <a>: Setting <sc://example.net>.pathname = '?' ? needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%3F" but got "sc://example.net"
+FAIL <area>: Setting <sc://example.net>.pathname = '?' ? needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%3F" but got "sc://example.net"
+FAIL <a>: Setting <sc://example.net>.pathname = '#' # needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%23" but got "sc://example.net"
+FAIL <area>: Setting <sc://example.net>.pathname = '#' # needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%23" but got "sc://example.net"
+PASS <a>: Setting <http://example.net>.pathname = '/?é' ? doesn't mess up encoding
+PASS <area>: Setting <http://example.net>.pathname = '/?é' ? doesn't mess up encoding
+PASS <a>: Setting <http://example.net>.pathname = '/#é' # doesn't mess up encoding
+PASS <area>: Setting <http://example.net>.pathname = '/#é' # doesn't mess up encoding
+FAIL <a>: Setting <non-spec:/>.pathname = '/.//p' Serialize /. in path assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '/.//p' Serialize /. in path assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL <area>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+PASS <a>: Setting <https://example.net#nav>.search = 'lang=fr'
+PASS <area>: Setting <https://example.net#nav>.search = 'lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = '??lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = '??lang=fr'
+FAIL <a>: Setting <https://example.net?lang=en-US#nav>.search = '?' assert_equals: expected "https://example.net/?#nav" but got "https://example.net/#nav"
+FAIL <area>: Setting <https://example.net?lang=en-US#nav>.search = '?' assert_equals: expected "https://example.net/?#nav" but got "https://example.net/#nav"
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = ''
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = ''
+PASS <a>: Setting <https://example.net?lang=en-US>.search = ''
+PASS <area>: Setting <https://example.net?lang=en-US>.search = ''
+PASS <a>: Setting <https://example.net>.search = ''
+PASS <area>: Setting <https://example.net>.search = ''
+FAIL <a>: Setting <a:/>.search = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+FAIL <area>: Setting <a:/>.search = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+PASS <a>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <area>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <a>: Setting <https://example.net>.hash = 'main'
+PASS <area>: Setting <https://example.net>.hash = 'main'
+PASS <a>: Setting <https://example.net#nav>.hash = 'main'
+PASS <area>: Setting <https://example.net#nav>.hash = 'main'
+PASS <a>: Setting <https://example.net?lang=en-US>.hash = '##nav'
+PASS <area>: Setting <https://example.net?lang=en-US>.hash = '##nav'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = '#main'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = '#main'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = '#'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = '#'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = ''
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = ''
+PASS <a>: Setting <http://example.net>.hash = '#foo bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo"bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo"bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo<bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo<bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo>bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo>bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo`bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo`bar'
+PASS <a>: Setting <a:/>.hash = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' Simple percent-encoding; tabs and newlines are removed
+PASS <area>: Setting <a:/>.hash = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' Simple percent-encoding; tabs and newlines are removed
+PASS <a>: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <area>: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <a>: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <area>: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <a>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <area>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/idna-2008/external/wpt/url/url-setters.any_include=mailto-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/idna-2008/external/wpt/url/url-setters.any_include=mailto-expected.txt
new file mode 100644
index 0000000..af68c2a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/idna-2008/external/wpt/url/url-setters.any_include=mailto-expected.txt
@@ -0,0 +1,10 @@
+This is a testharness.js-based test.
+PASS Loading data…
+FAIL URL: Setting <mailto:me@example.net>.protocol = 'http' Cannot-be-a-base URL doesn’t have a host, but URL in a special scheme must. assert_equals: expected "mailto:me@example.net" but got "http://me@example.net/"
+PASS URL: Setting <mailto:you@example.net>.username = 'me' Cannot-be-a-base means no username
+PASS URL: Setting <mailto:me@example.net>.password = 'secret' Cannot-be-a-base means no password
+PASS URL: Setting <mailto:me@example.net>.host = 'example.com' Cannot-be-a-base means no host
+PASS URL: Setting <mailto:me@example.net>.hostname = 'example.com' Cannot-be-a-base means no host
+PASS URL: Setting <mailto:me@example.net>.pathname = '/foo' Cannot-be-a-base don’t have a path
+Harness: the test ran to completion.
+
diff --git "a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
new file mode 100644
index 0000000..e0c1e6a
--- /dev/null
+++ "b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -0,0 +1,389 @@
+This is a testharness.js-based test.
+Found 371 tests; 231 PASS, 140 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS Loading data…
+PASS <a>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
+PASS <area>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
+PASS <a>: Setting <a://example.net>.protocol = 'b'
+PASS <area>: Setting <a://example.net>.protocol = 'b'
+PASS <a>: Setting <a://example.net>.protocol = 'B' Upper-case ASCII is lower-cased
+PASS <area>: Setting <a://example.net>.protocol = 'B' Upper-case ASCII is lower-cased
+PASS <a>: Setting <a://example.net>.protocol = 'é' Non-ASCII is rejected
+PASS <area>: Setting <a://example.net>.protocol = 'é' Non-ASCII is rejected
+PASS <a>: Setting <a://example.net>.protocol = '0b' No leading digit
+PASS <area>: Setting <a://example.net>.protocol = '0b' No leading digit
+PASS <a>: Setting <a://example.net>.protocol = '+b' No leading punctuation
+PASS <area>: Setting <a://example.net>.protocol = '+b' No leading punctuation
+PASS <a>: Setting <a://example.net>.protocol = 'bC0+-.'
+PASS <area>: Setting <a://example.net>.protocol = 'bC0+-.'
+PASS <a>: Setting <a://example.net>.protocol = 'b,c' Only some punctuation is acceptable
+PASS <area>: Setting <a://example.net>.protocol = 'b,c' Only some punctuation is acceptable
+PASS <a>: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected
+PASS <area>: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected
+PASS <a>: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file
+PASS <area>: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file
+PASS <a>: Setting <https://example.net:1234>.protocol = 'file'
+PASS <area>: Setting <https://example.net:1234>.protocol = 'file'
+PASS <a>: Setting <wss://x:x@example.net:1234>.protocol = 'file'
+PASS <area>: Setting <wss://x:x@example.net:1234>.protocol = 'file'
+FAIL <a>: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "b://example.net/"
+FAIL <area>: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "b://example.net/"
+FAIL <a>: Setting <https://example.net>.protocol = 's' assert_equals: expected "https://example.net/" but got "s://example.net/"
+FAIL <area>: Setting <https://example.net>.protocol = 's' assert_equals: expected "https://example.net/" but got "s://example.net/"
+FAIL <a>: Setting <ftp://example.net>.protocol = 'test' assert_equals: expected "ftp://example.net/" but got "test://example.net/"
+FAIL <area>: Setting <ftp://example.net>.protocol = 'test' assert_equals: expected "ftp://example.net/" but got "test://example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'https' assert_equals: expected "ssh://me@example.net" but got "https://me@example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'https' assert_equals: expected "ssh://me@example.net" but got "https://me@example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
+FAIL <a>: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
+FAIL <area>: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
+FAIL <a>: Setting <nonsense:///test>.protocol = 'https' assert_equals: expected "nonsense:///test" but got "https://test/"
+FAIL <area>: Setting <nonsense:///test>.protocol = 'https' assert_equals: expected "nonsense:///test" but got "https://test/"
+PASS <a>: Setting <http://example.net>.protocol = 'https:foo : bar' Stuff after the first ':' is ignored
+PASS <area>: Setting <http://example.net>.protocol = 'https:foo : bar' Stuff after the first ':' is ignored
+PASS <a>: Setting <data:text/html,<p>Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored
+PASS <area>: Setting <data:text/html,<p>Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored
+PASS <a>: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.
+PASS <area>: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.
+PASS <a>: Setting <unix:/run/foo.socket>.username = 'me' No host means no username
+PASS <area>: Setting <unix:/run/foo.socket>.username = 'me' No host means no username
+PASS <a>: Setting <http://example.net>.username = 'me'
+PASS <area>: Setting <http://example.net>.username = 'me'
+PASS <a>: Setting <http://:secret@example.net>.username = 'me'
+PASS <area>: Setting <http://:secret@example.net>.username = 'me'
+PASS <a>: Setting <http://me@example.net>.username = ''
+PASS <area>: Setting <http://me@example.net>.username = ''
+PASS <a>: Setting <http://me:secret@example.net>.username = ''
+PASS <area>: Setting <http://me:secret@example.net>.username = ''
+FAIL <a>: Setting <http://example.net>.username = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+FAIL <area>: Setting <http://example.net>.username = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS <a>: Setting <http://example.net>.username = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <area>: Setting <http://example.net>.username = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <a>: Setting <sc:///>.username = 'x'
+PASS <area>: Setting <sc:///>.username = 'x'
+PASS <a>: Setting <unix:/run/foo.socket>.password = 'secret' No host means no password
+PASS <area>: Setting <unix:/run/foo.socket>.password = 'secret' No host means no password
+PASS <a>: Setting <http://example.net>.password = 'secret'
+PASS <area>: Setting <http://example.net>.password = 'secret'
+PASS <a>: Setting <http://me@example.net>.password = 'secret'
+PASS <area>: Setting <http://me@example.net>.password = 'secret'
+PASS <a>: Setting <http://:secret@example.net>.password = ''
+PASS <area>: Setting <http://:secret@example.net>.password = ''
+PASS <a>: Setting <http://me:secret@example.net>.password = ''
+PASS <area>: Setting <http://me:secret@example.net>.password = ''
+FAIL <a>: Setting <http://example.net>.password = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://:%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+FAIL <area>: Setting <http://example.net>.password = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://:%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS <a>: Setting <http://example.net>.password = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <area>: Setting <http://example.net>.password = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <a>: Setting <sc:///>.password = 'x'
+PASS <area>: Setting <sc:///>.password = 'x'
+FAIL <a>: Setting <sc://x/>.host = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = ' ' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = ' ' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '@' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = '@' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = 'ß' assert_equals: expected "sc://%C3%9F/" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = 'ß' assert_equals: expected "sc://%C3%9F/" but got "sc://x/"
+PASS <a>: Setting <https://x/>.host = 'ß' IDNA Nontransitional_Processing
+PASS <area>: Setting <https://x/>.host = 'ß' IDNA Nontransitional_Processing
+PASS <a>: Setting <data:text/plain,Stuff>.host = 'example.net' Cannot-be-a-base means no host
+PASS <area>: Setting <data:text/plain,Stuff>.host = 'example.net' Cannot-be-a-base means no host
+PASS <a>: Setting <http://example.net>.host = 'example.com:8080'
+PASS <area>: Setting <http://example.net>.host = 'example.com:8080'
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com' Port number is unchanged if not specified in the new value
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com' Port number is unchanged if not specified in the new value
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified
+PASS <a>: Setting <http://example.net>.host = '' The empty host is not valid for special schemes
+PASS <area>: Setting <http://example.net>.host = '' The empty host is not valid for special schemes
+FAIL <a>: Setting <view-source+http://example.net/foo>.host = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <area>: Setting <view-source+http://example.net/foo>.host = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <a>: Setting <a:/foo>.host = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+FAIL <area>: Setting <a:/foo>.host = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+PASS <a>: Setting <http://example.net>.host = '0x7F000001:8080' IPv4 address syntax is normalized
+PASS <area>: Setting <http://example.net>.host = '0x7F000001:8080' IPv4 address syntax is normalized
+PASS <a>: Setting <http://example.net>.host = '[::0:01]:2' IPv6 address syntax is normalized
+PASS <area>: Setting <http://example.net>.host = '[::0:01]:2' IPv6 address syntax is normalized
+PASS <a>: Setting <http://example.net>.host = '[2001:db8::2]:4002' IPv6 literal address with port, crbug.com/1012416
+PASS <area>: Setting <http://example.net>.host = '[2001:db8::2]:4002' IPv6 literal address with port, crbug.com/1012416
+PASS <a>: Setting <http://example.net>.host = 'example.com:80' Default port number is removed
+PASS <area>: Setting <http://example.net>.host = 'example.com:80' Default port number is removed
+PASS <a>: Setting <https://example.net>.host = 'example.com:443' Default port number is removed
+PASS <area>: Setting <https://example.net>.host = 'example.com:443' Default port number is removed
+PASS <a>: Setting <https://example.net>.host = 'example.com:80' Default port number is only removed for the relevant scheme
+PASS <area>: Setting <https://example.net>.host = 'example.com:80' Default port number is only removed for the relevant scheme
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com:80' Port number is removed if new port is scheme default and existing URL has a non-default port
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com:80' Port number is removed if new port is scheme default and existing URL has a non-default port
+PASS <a>: Setting <http://example.net/path>.host = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.host = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.host = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <area>: Setting <view-source+http://example.net/path>.host = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <a>: Setting <view-source+http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.com:8080/path" but got "view-source+http://example.net/path"
+FAIL <area>: Setting <view-source+http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.com:8080/path" but got "view-source+http://example.net/path"
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:65535' Port numbers are 16 bit integers
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:65535' Port numbers are 16 bit integers
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.
+PASS <a>: Setting <http://example.net/>.host = '[google.com]' Broken IPv6
+PASS <area>: Setting <http://example.net/>.host = '[google.com]' Broken IPv6
+PASS <a>: Setting <http://example.net/>.host = '[::1.2.3.4x]'
+PASS <area>: Setting <http://example.net/>.host = '[::1.2.3.4x]'
+FAIL <a>: Setting <http://example.net/>.host = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <a>: Setting <http://example.net/>.host = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <a>: Setting <http://example.net/>.host = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <a>: Setting <sc://test@test/>.host = '' assert_equals: expected "test" but got ""
+FAIL <area>: Setting <sc://test@test/>.host = '' assert_equals: expected "test" but got ""
+FAIL <a>: Setting <sc://test:12/>.host = '' assert_equals: expected "test:12" but got ""
+FAIL <area>: Setting <sc://test:12/>.host = '' assert_equals: expected "test:12" but got ""
+PASS <a>: Setting <http://example.com/>.host = '///bad.com' Leading / is not stripped
+PASS <area>: Setting <http://example.com/>.host = '///bad.com' Leading / is not stripped
+FAIL <a>: Setting <sc://example.com/>.host = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <area>: Setting <sc://example.com/>.host = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <a>: Setting <sc://x/>.hostname = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.hostname = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = ' ' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = ' ' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.hostname = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '@' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = '@' assert_equals: expected "x" but got ""
+PASS <a>: Setting <data:text/plain,Stuff>.hostname = 'example.net' Cannot-be-a-base means no host
+PASS <area>: Setting <data:text/plain,Stuff>.hostname = 'example.net' Cannot-be-a-base means no host
+PASS <a>: Setting <http://example.net:8080>.hostname = 'example.com'
+PASS <area>: Setting <http://example.net:8080>.hostname = 'example.com'
+PASS <a>: Setting <http://example.net>.hostname = '' The empty host is not valid for special schemes
+PASS <area>: Setting <http://example.net>.hostname = '' The empty host is not valid for special schemes
+FAIL <a>: Setting <view-source+http://example.net/foo>.hostname = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <area>: Setting <view-source+http://example.net/foo>.hostname = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <a>: Setting <a:/foo>.hostname = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+FAIL <area>: Setting <a:/foo>.hostname = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+PASS <a>: Setting <http://example.net:8080>.hostname = '0x7F000001' IPv4 address syntax is normalized
+PASS <area>: Setting <http://example.net:8080>.hostname = '0x7F000001' IPv4 address syntax is normalized
+PASS <a>: Setting <http://example.net>.hostname = '[::0:01]' IPv6 address syntax is normalized
+PASS <area>: Setting <http://example.net>.hostname = '[::0:01]' IPv6 address syntax is normalized
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com:8080' : delimiter invalidates entire value
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com:8080' : delimiter invalidates entire value
+PASS <a>: Setting <http://example.net:8080/path>.hostname = 'example.com:' : delimiter invalidates entire value
+PASS <area>: Setting <http://example.net:8080/path>.hostname = 'example.com:' : delimiter invalidates entire value
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.hostname = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <area>: Setting <view-source+http://example.net/path>.hostname = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+PASS <a>: Setting <http://example.net/>.hostname = '[google.com]' Broken IPv6
+PASS <area>: Setting <http://example.net/>.hostname = '[google.com]' Broken IPv6
+PASS <a>: Setting <http://example.net/>.hostname = '[::1.2.3.4x]'
+PASS <area>: Setting <http://example.net/>.hostname = '[::1.2.3.4x]'
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <a>: Setting <sc://test@test/>.hostname = '' assert_equals: expected "test" but got ""
+FAIL <area>: Setting <sc://test@test/>.hostname = '' assert_equals: expected "test" but got ""
+FAIL <a>: Setting <sc://test:12/>.hostname = '' assert_equals: expected "test:12" but got ""
+FAIL <area>: Setting <sc://test:12/>.hostname = '' assert_equals: expected "test:12" but got ""
+FAIL <a>: Setting <non-spec:/.//p>.hostname = 'h' Drop /. from path assert_equals: expected "non-spec://h//p" but got "non-spec:/.//p"
+FAIL <area>: Setting <non-spec:/.//p>.hostname = 'h' Drop /. from path assert_equals: expected "non-spec://h//p" but got "non-spec:/.//p"
+FAIL <a>: Setting <non-spec:/.//p>.hostname = '' assert_equals: expected "non-spec:////p" but got "non-spec:/.//p"
+FAIL <area>: Setting <non-spec:/.//p>.hostname = '' assert_equals: expected "non-spec:////p" but got "non-spec:/.//p"
+PASS <a>: Setting <http://example.com/>.hostname = '///bad.com' Leading / is not stripped
+PASS <area>: Setting <http://example.com/>.hostname = '///bad.com' Leading / is not stripped
+FAIL <a>: Setting <sc://example.com/>.hostname = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <area>: Setting <sc://example.com/>.hostname = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+PASS <a>: Setting <http://example.net>.port = '8080'
+PASS <area>: Setting <http://example.net>.port = '8080'
+PASS <a>: Setting <http://example.net:8080>.port = '' Port number is removed if empty is the new value
+PASS <area>: Setting <http://example.net:8080>.port = '' Port number is removed if empty is the new value
+PASS <a>: Setting <http://example.net:8080>.port = '80' Default port number is removed
+PASS <area>: Setting <http://example.net:8080>.port = '80' Default port number is removed
+PASS <a>: Setting <https://example.net:4433>.port = '443' Default port number is removed
+PASS <area>: Setting <https://example.net:4433>.port = '443' Default port number is removed
+PASS <a>: Setting <https://example.net>.port = '80' Default port number is only removed for the relevant scheme
+PASS <area>: Setting <https://example.net>.port = '80' Default port number is only removed for the relevant scheme
+PASS <a>: Setting <http://example.net/path>.port = '8080/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.port = '8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.net:8080/path" but got "view-source+http://example.net/path"
+FAIL <area>: Setting <view-source+http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.net:8080/path" but got "view-source+http://example.net/path"
+PASS <a>: Setting <http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.port = '65535' Port numbers are 16 bit integers
+PASS <area>: Setting <http://example.net/path>.port = '65535' Port numbers are 16 bit integers
+FAIL <a>: Setting <http://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "http://example.net:8080/path" but got "http://example.net:0/path"
+FAIL <area>: Setting <http://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "http://example.net:8080/path" but got "http://example.net:0/path"
+FAIL <a>: Setting <non-special://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "example.net:8080" but got ""
+FAIL <area>: Setting <non-special://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "example.net:8080" but got ""
+PASS <a>: Setting <non-base:value>.port = '12'
+PASS <area>: Setting <non-base:value>.port = '12'
+PASS <a>: Setting <sc:///>.port = '12'
+PASS <area>: Setting <sc:///>.port = '12'
+FAIL <a>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+FAIL <a>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
+FAIL <area>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
+FAIL <a>: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
+FAIL <area>: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
+FAIL <a>: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
+FAIL <area>: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
+FAIL <a>: Setting <foo:/some/path>.pathname = 'test' Path-only URLs always have an initial slash assert_equals: expected "foo:/test" but got "foo:/some/path"
+FAIL <area>: Setting <foo:/some/path>.pathname = 'test' Path-only URLs always have an initial slash assert_equals: expected "foo:/test" but got "foo:/some/path"
+FAIL <a>: Setting <unix:/run/foo.socket?timeout=10>.pathname = '/var/log/../run/bar.socket' assert_equals: expected "unix:/var/run/bar.socket?timeout=10" but got "unix:/run/foo.socket?timeout=10"
+FAIL <area>: Setting <unix:/run/foo.socket?timeout=10>.pathname = '/var/log/../run/bar.socket' assert_equals: expected "unix:/var/run/bar.socket?timeout=10" but got "unix:/run/foo.socket?timeout=10"
+PASS <a>: Setting <https://example.net#nav>.pathname = 'home'
+PASS <area>: Setting <https://example.net#nav>.pathname = 'home'
+PASS <a>: Setting <https://example.net#nav>.pathname = '../home'
+PASS <area>: Setting <https://example.net#nav>.pathname = '../home'
+PASS <a>: Setting <http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is a segment delimiter for 'special' URLs
+PASS <area>: Setting <http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is a segment delimiter for 'special' URLs
+FAIL <a>: Setting <view-source+http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is *not* a segment delimiter for non-'special' URLs assert_equals: expected "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav" but got "view-source+http://example.net/home?lang=fr#nav"
+FAIL <area>: Setting <view-source+http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is *not* a segment delimiter for non-'special' URLs assert_equals: expected "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav" but got "view-source+http://example.net/home?lang=fr#nav"
+FAIL <a>: Setting <a:/>.pathname = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed. assert_equals: expected "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/"
+FAIL <area>: Setting <a:/>.pathname = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed. assert_equals: expected "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/"
+FAIL <a>: Setting <http://example.net>.pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, including %2E outside dotted segments. assert_equals: expected "http://example.net/%2e%2E%c3%89t%C3%A9" but got "http://example.net/..%c3%89t%C3%A9"
+FAIL <area>: Setting <http://example.net>.pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, including %2E outside dotted segments. assert_equals: expected "http://example.net/%2e%2E%c3%89t%C3%A9" but got "http://example.net/..%c3%89t%C3%A9"
+PASS <a>: Setting <http://example.net>.pathname = '?' ? needs to be encoded
+PASS <area>: Setting <http://example.net>.pathname = '?' ? needs to be encoded
+PASS <a>: Setting <http://example.net>.pathname = '#' # needs to be encoded
+PASS <area>: Setting <http://example.net>.pathname = '#' # needs to be encoded
+FAIL <a>: Setting <sc://example.net>.pathname = '?' ? needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%3F" but got "sc://example.net"
+FAIL <area>: Setting <sc://example.net>.pathname = '?' ? needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%3F" but got "sc://example.net"
+FAIL <a>: Setting <sc://example.net>.pathname = '#' # needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%23" but got "sc://example.net"
+FAIL <area>: Setting <sc://example.net>.pathname = '#' # needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%23" but got "sc://example.net"
+PASS <a>: Setting <http://example.net>.pathname = '/?é' ? doesn't mess up encoding
+PASS <area>: Setting <http://example.net>.pathname = '/?é' ? doesn't mess up encoding
+PASS <a>: Setting <http://example.net>.pathname = '/#é' # doesn't mess up encoding
+PASS <area>: Setting <http://example.net>.pathname = '/#é' # doesn't mess up encoding
+FAIL <a>: Setting <non-spec:/>.pathname = '/.//p' Serialize /. in path assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '/.//p' Serialize /. in path assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL <area>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+PASS <a>: Setting <https://example.net#nav>.search = 'lang=fr'
+PASS <area>: Setting <https://example.net#nav>.search = 'lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = '??lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = '??lang=fr'
+FAIL <a>: Setting <https://example.net?lang=en-US#nav>.search = '?' assert_equals: expected "https://example.net/?#nav" but got "https://example.net/#nav"
+FAIL <area>: Setting <https://example.net?lang=en-US#nav>.search = '?' assert_equals: expected "https://example.net/?#nav" but got "https://example.net/#nav"
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = ''
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = ''
+PASS <a>: Setting <https://example.net?lang=en-US>.search = ''
+PASS <area>: Setting <https://example.net?lang=en-US>.search = ''
+PASS <a>: Setting <https://example.net>.search = ''
+PASS <area>: Setting <https://example.net>.search = ''
+FAIL <a>: Setting <a:/>.search = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+FAIL <area>: Setting <a:/>.search = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+PASS <a>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <area>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <a>: Setting <https://example.net>.hash = 'main'
+PASS <area>: Setting <https://example.net>.hash = 'main'
+PASS <a>: Setting <https://example.net#nav>.hash = 'main'
+PASS <area>: Setting <https://example.net#nav>.hash = 'main'
+PASS <a>: Setting <https://example.net?lang=en-US>.hash = '##nav'
+PASS <area>: Setting <https://example.net?lang=en-US>.hash = '##nav'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = '#main'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = '#main'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = '#'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = '#'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = ''
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = ''
+PASS <a>: Setting <http://example.net>.hash = '#foo bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo"bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo"bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo<bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo<bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo>bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo>bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo`bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo`bar'
+PASS <a>: Setting <a:/>.hash = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' Simple percent-encoding; tabs and newlines are removed
+PASS <area>: Setting <a:/>.hash = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' Simple percent-encoding; tabs and newlines are removed
+PASS <a>: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <area>: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <a>: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <area>: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <a>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <area>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+Harness: the test ran to completion.
+
diff --git "a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/idna-2008/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/idna-2008/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
new file mode 100644
index 0000000..6e10766
--- /dev/null
+++ "b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/idna-2008/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -0,0 +1,389 @@
+This is a testharness.js-based test.
+Found 371 tests; 229 PASS, 142 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS Loading data…
+PASS <a>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
+PASS <area>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
+PASS <a>: Setting <a://example.net>.protocol = 'b'
+PASS <area>: Setting <a://example.net>.protocol = 'b'
+PASS <a>: Setting <a://example.net>.protocol = 'B' Upper-case ASCII is lower-cased
+PASS <area>: Setting <a://example.net>.protocol = 'B' Upper-case ASCII is lower-cased
+PASS <a>: Setting <a://example.net>.protocol = 'é' Non-ASCII is rejected
+PASS <area>: Setting <a://example.net>.protocol = 'é' Non-ASCII is rejected
+PASS <a>: Setting <a://example.net>.protocol = '0b' No leading digit
+PASS <area>: Setting <a://example.net>.protocol = '0b' No leading digit
+PASS <a>: Setting <a://example.net>.protocol = '+b' No leading punctuation
+PASS <area>: Setting <a://example.net>.protocol = '+b' No leading punctuation
+PASS <a>: Setting <a://example.net>.protocol = 'bC0+-.'
+PASS <area>: Setting <a://example.net>.protocol = 'bC0+-.'
+PASS <a>: Setting <a://example.net>.protocol = 'b,c' Only some punctuation is acceptable
+PASS <area>: Setting <a://example.net>.protocol = 'b,c' Only some punctuation is acceptable
+PASS <a>: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected
+PASS <area>: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected
+PASS <a>: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file
+PASS <area>: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file
+PASS <a>: Setting <https://example.net:1234>.protocol = 'file'
+PASS <area>: Setting <https://example.net:1234>.protocol = 'file'
+PASS <a>: Setting <wss://x:x@example.net:1234>.protocol = 'file'
+PASS <area>: Setting <wss://x:x@example.net:1234>.protocol = 'file'
+FAIL <a>: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "b://example.net/"
+FAIL <area>: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "b://example.net/"
+FAIL <a>: Setting <https://example.net>.protocol = 's' assert_equals: expected "https://example.net/" but got "s://example.net/"
+FAIL <area>: Setting <https://example.net>.protocol = 's' assert_equals: expected "https://example.net/" but got "s://example.net/"
+FAIL <a>: Setting <ftp://example.net>.protocol = 'test' assert_equals: expected "ftp://example.net/" but got "test://example.net/"
+FAIL <area>: Setting <ftp://example.net>.protocol = 'test' assert_equals: expected "ftp://example.net/" but got "test://example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'https' assert_equals: expected "ssh://me@example.net" but got "https://me@example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'https' assert_equals: expected "ssh://me@example.net" but got "https://me@example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
+FAIL <a>: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
+FAIL <area>: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
+FAIL <a>: Setting <nonsense:///test>.protocol = 'https' assert_equals: expected "nonsense:///test" but got "https://test/"
+FAIL <area>: Setting <nonsense:///test>.protocol = 'https' assert_equals: expected "nonsense:///test" but got "https://test/"
+PASS <a>: Setting <http://example.net>.protocol = 'https:foo : bar' Stuff after the first ':' is ignored
+PASS <area>: Setting <http://example.net>.protocol = 'https:foo : bar' Stuff after the first ':' is ignored
+PASS <a>: Setting <data:text/html,<p>Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored
+PASS <area>: Setting <data:text/html,<p>Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored
+PASS <a>: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.
+PASS <area>: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.
+PASS <a>: Setting <unix:/run/foo.socket>.username = 'me' No host means no username
+PASS <area>: Setting <unix:/run/foo.socket>.username = 'me' No host means no username
+PASS <a>: Setting <http://example.net>.username = 'me'
+PASS <area>: Setting <http://example.net>.username = 'me'
+PASS <a>: Setting <http://:secret@example.net>.username = 'me'
+PASS <area>: Setting <http://:secret@example.net>.username = 'me'
+PASS <a>: Setting <http://me@example.net>.username = ''
+PASS <area>: Setting <http://me@example.net>.username = ''
+PASS <a>: Setting <http://me:secret@example.net>.username = ''
+PASS <area>: Setting <http://me:secret@example.net>.username = ''
+FAIL <a>: Setting <http://example.net>.username = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+FAIL <area>: Setting <http://example.net>.username = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS <a>: Setting <http://example.net>.username = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <area>: Setting <http://example.net>.username = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <a>: Setting <sc:///>.username = 'x'
+PASS <area>: Setting <sc:///>.username = 'x'
+PASS <a>: Setting <unix:/run/foo.socket>.password = 'secret' No host means no password
+PASS <area>: Setting <unix:/run/foo.socket>.password = 'secret' No host means no password
+PASS <a>: Setting <http://example.net>.password = 'secret'
+PASS <area>: Setting <http://example.net>.password = 'secret'
+PASS <a>: Setting <http://me@example.net>.password = 'secret'
+PASS <area>: Setting <http://me@example.net>.password = 'secret'
+PASS <a>: Setting <http://:secret@example.net>.password = ''
+PASS <area>: Setting <http://:secret@example.net>.password = ''
+PASS <a>: Setting <http://me:secret@example.net>.password = ''
+PASS <area>: Setting <http://me:secret@example.net>.password = ''
+FAIL <a>: Setting <http://example.net>.password = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://:%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+FAIL <area>: Setting <http://example.net>.password = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://:%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS <a>: Setting <http://example.net>.password = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <area>: Setting <http://example.net>.password = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <a>: Setting <sc:///>.password = 'x'
+PASS <area>: Setting <sc:///>.password = 'x'
+FAIL <a>: Setting <sc://x/>.host = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = ' ' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = ' ' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '@' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = '@' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = 'ß' assert_equals: expected "sc://%C3%9F/" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = 'ß' assert_equals: expected "sc://%C3%9F/" but got "sc://x/"
+FAIL <a>: Setting <https://x/>.host = 'ß' IDNA Nontransitional_Processing assert_equals: expected "https://xn--zca/" but got "https://ss/"
+FAIL <area>: Setting <https://x/>.host = 'ß' IDNA Nontransitional_Processing assert_equals: expected "https://xn--zca/" but got "https://ss/"
+PASS <a>: Setting <data:text/plain,Stuff>.host = 'example.net' Cannot-be-a-base means no host
+PASS <area>: Setting <data:text/plain,Stuff>.host = 'example.net' Cannot-be-a-base means no host
+PASS <a>: Setting <http://example.net>.host = 'example.com:8080'
+PASS <area>: Setting <http://example.net>.host = 'example.com:8080'
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com' Port number is unchanged if not specified in the new value
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com' Port number is unchanged if not specified in the new value
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified
+PASS <a>: Setting <http://example.net>.host = '' The empty host is not valid for special schemes
+PASS <area>: Setting <http://example.net>.host = '' The empty host is not valid for special schemes
+FAIL <a>: Setting <view-source+http://example.net/foo>.host = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <area>: Setting <view-source+http://example.net/foo>.host = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <a>: Setting <a:/foo>.host = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+FAIL <area>: Setting <a:/foo>.host = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+PASS <a>: Setting <http://example.net>.host = '0x7F000001:8080' IPv4 address syntax is normalized
+PASS <area>: Setting <http://example.net>.host = '0x7F000001:8080' IPv4 address syntax is normalized
+PASS <a>: Setting <http://example.net>.host = '[::0:01]:2' IPv6 address syntax is normalized
+PASS <area>: Setting <http://example.net>.host = '[::0:01]:2' IPv6 address syntax is normalized
+PASS <a>: Setting <http://example.net>.host = '[2001:db8::2]:4002' IPv6 literal address with port, crbug.com/1012416
+PASS <area>: Setting <http://example.net>.host = '[2001:db8::2]:4002' IPv6 literal address with port, crbug.com/1012416
+PASS <a>: Setting <http://example.net>.host = 'example.com:80' Default port number is removed
+PASS <area>: Setting <http://example.net>.host = 'example.com:80' Default port number is removed
+PASS <a>: Setting <https://example.net>.host = 'example.com:443' Default port number is removed
+PASS <area>: Setting <https://example.net>.host = 'example.com:443' Default port number is removed
+PASS <a>: Setting <https://example.net>.host = 'example.com:80' Default port number is only removed for the relevant scheme
+PASS <area>: Setting <https://example.net>.host = 'example.com:80' Default port number is only removed for the relevant scheme
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com:80' Port number is removed if new port is scheme default and existing URL has a non-default port
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com:80' Port number is removed if new port is scheme default and existing URL has a non-default port
+PASS <a>: Setting <http://example.net/path>.host = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.host = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.host = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <area>: Setting <view-source+http://example.net/path>.host = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <a>: Setting <view-source+http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.com:8080/path" but got "view-source+http://example.net/path"
+FAIL <area>: Setting <view-source+http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.com:8080/path" but got "view-source+http://example.net/path"
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:65535' Port numbers are 16 bit integers
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:65535' Port numbers are 16 bit integers
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.
+PASS <a>: Setting <http://example.net/>.host = '[google.com]' Broken IPv6
+PASS <area>: Setting <http://example.net/>.host = '[google.com]' Broken IPv6
+PASS <a>: Setting <http://example.net/>.host = '[::1.2.3.4x]'
+PASS <area>: Setting <http://example.net/>.host = '[::1.2.3.4x]'
+FAIL <a>: Setting <http://example.net/>.host = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <a>: Setting <http://example.net/>.host = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <a>: Setting <http://example.net/>.host = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <a>: Setting <sc://test@test/>.host = '' assert_equals: expected "test" but got ""
+FAIL <area>: Setting <sc://test@test/>.host = '' assert_equals: expected "test" but got ""
+FAIL <a>: Setting <sc://test:12/>.host = '' assert_equals: expected "test:12" but got ""
+FAIL <area>: Setting <sc://test:12/>.host = '' assert_equals: expected "test:12" but got ""
+PASS <a>: Setting <http://example.com/>.host = '///bad.com' Leading / is not stripped
+PASS <area>: Setting <http://example.com/>.host = '///bad.com' Leading / is not stripped
+FAIL <a>: Setting <sc://example.com/>.host = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <area>: Setting <sc://example.com/>.host = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <a>: Setting <sc://x/>.hostname = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.hostname = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = ' ' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = ' ' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.hostname = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '@' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = '@' assert_equals: expected "x" but got ""
+PASS <a>: Setting <data:text/plain,Stuff>.hostname = 'example.net' Cannot-be-a-base means no host
+PASS <area>: Setting <data:text/plain,Stuff>.hostname = 'example.net' Cannot-be-a-base means no host
+PASS <a>: Setting <http://example.net:8080>.hostname = 'example.com'
+PASS <area>: Setting <http://example.net:8080>.hostname = 'example.com'
+PASS <a>: Setting <http://example.net>.hostname = '' The empty host is not valid for special schemes
+PASS <area>: Setting <http://example.net>.hostname = '' The empty host is not valid for special schemes
+FAIL <a>: Setting <view-source+http://example.net/foo>.hostname = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <area>: Setting <view-source+http://example.net/foo>.hostname = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <a>: Setting <a:/foo>.hostname = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+FAIL <area>: Setting <a:/foo>.hostname = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+PASS <a>: Setting <http://example.net:8080>.hostname = '0x7F000001' IPv4 address syntax is normalized
+PASS <area>: Setting <http://example.net:8080>.hostname = '0x7F000001' IPv4 address syntax is normalized
+PASS <a>: Setting <http://example.net>.hostname = '[::0:01]' IPv6 address syntax is normalized
+PASS <area>: Setting <http://example.net>.hostname = '[::0:01]' IPv6 address syntax is normalized
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com:8080' : delimiter invalidates entire value
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com:8080' : delimiter invalidates entire value
+PASS <a>: Setting <http://example.net:8080/path>.hostname = 'example.com:' : delimiter invalidates entire value
+PASS <area>: Setting <http://example.net:8080/path>.hostname = 'example.com:' : delimiter invalidates entire value
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.hostname = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <area>: Setting <view-source+http://example.net/path>.hostname = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+PASS <a>: Setting <http://example.net/>.hostname = '[google.com]' Broken IPv6
+PASS <area>: Setting <http://example.net/>.hostname = '[google.com]' Broken IPv6
+PASS <a>: Setting <http://example.net/>.hostname = '[::1.2.3.4x]'
+PASS <area>: Setting <http://example.net/>.hostname = '[::1.2.3.4x]'
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <a>: Setting <sc://test@test/>.hostname = '' assert_equals: expected "test" but got ""
+FAIL <area>: Setting <sc://test@test/>.hostname = '' assert_equals: expected "test" but got ""
+FAIL <a>: Setting <sc://test:12/>.hostname = '' assert_equals: expected "test:12" but got ""
+FAIL <area>: Setting <sc://test:12/>.hostname = '' assert_equals: expected "test:12" but got ""
+FAIL <a>: Setting <non-spec:/.//p>.hostname = 'h' Drop /. from path assert_equals: expected "non-spec://h//p" but got "non-spec:/.//p"
+FAIL <area>: Setting <non-spec:/.//p>.hostname = 'h' Drop /. from path assert_equals: expected "non-spec://h//p" but got "non-spec:/.//p"
+FAIL <a>: Setting <non-spec:/.//p>.hostname = '' assert_equals: expected "non-spec:////p" but got "non-spec:/.//p"
+FAIL <area>: Setting <non-spec:/.//p>.hostname = '' assert_equals: expected "non-spec:////p" but got "non-spec:/.//p"
+PASS <a>: Setting <http://example.com/>.hostname = '///bad.com' Leading / is not stripped
+PASS <area>: Setting <http://example.com/>.hostname = '///bad.com' Leading / is not stripped
+FAIL <a>: Setting <sc://example.com/>.hostname = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <area>: Setting <sc://example.com/>.hostname = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+PASS <a>: Setting <http://example.net>.port = '8080'
+PASS <area>: Setting <http://example.net>.port = '8080'
+PASS <a>: Setting <http://example.net:8080>.port = '' Port number is removed if empty is the new value
+PASS <area>: Setting <http://example.net:8080>.port = '' Port number is removed if empty is the new value
+PASS <a>: Setting <http://example.net:8080>.port = '80' Default port number is removed
+PASS <area>: Setting <http://example.net:8080>.port = '80' Default port number is removed
+PASS <a>: Setting <https://example.net:4433>.port = '443' Default port number is removed
+PASS <area>: Setting <https://example.net:4433>.port = '443' Default port number is removed
+PASS <a>: Setting <https://example.net>.port = '80' Default port number is only removed for the relevant scheme
+PASS <area>: Setting <https://example.net>.port = '80' Default port number is only removed for the relevant scheme
+PASS <a>: Setting <http://example.net/path>.port = '8080/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.port = '8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.net:8080/path" but got "view-source+http://example.net/path"
+FAIL <area>: Setting <view-source+http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.net:8080/path" but got "view-source+http://example.net/path"
+PASS <a>: Setting <http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.port = '65535' Port numbers are 16 bit integers
+PASS <area>: Setting <http://example.net/path>.port = '65535' Port numbers are 16 bit integers
+FAIL <a>: Setting <http://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "http://example.net:8080/path" but got "http://example.net:0/path"
+FAIL <area>: Setting <http://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "http://example.net:8080/path" but got "http://example.net:0/path"
+FAIL <a>: Setting <non-special://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "example.net:8080" but got ""
+FAIL <area>: Setting <non-special://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "example.net:8080" but got ""
+PASS <a>: Setting <non-base:value>.port = '12'
+PASS <area>: Setting <non-base:value>.port = '12'
+PASS <a>: Setting <sc:///>.port = '12'
+PASS <area>: Setting <sc:///>.port = '12'
+FAIL <a>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+FAIL <a>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
+FAIL <area>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
+FAIL <a>: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
+FAIL <area>: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
+FAIL <a>: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
+FAIL <area>: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
+FAIL <a>: Setting <foo:/some/path>.pathname = 'test' Path-only URLs always have an initial slash assert_equals: expected "foo:/test" but got "foo:/some/path"
+FAIL <area>: Setting <foo:/some/path>.pathname = 'test' Path-only URLs always have an initial slash assert_equals: expected "foo:/test" but got "foo:/some/path"
+FAIL <a>: Setting <unix:/run/foo.socket?timeout=10>.pathname = '/var/log/../run/bar.socket' assert_equals: expected "unix:/var/run/bar.socket?timeout=10" but got "unix:/run/foo.socket?timeout=10"
+FAIL <area>: Setting <unix:/run/foo.socket?timeout=10>.pathname = '/var/log/../run/bar.socket' assert_equals: expected "unix:/var/run/bar.socket?timeout=10" but got "unix:/run/foo.socket?timeout=10"
+PASS <a>: Setting <https://example.net#nav>.pathname = 'home'
+PASS <area>: Setting <https://example.net#nav>.pathname = 'home'
+PASS <a>: Setting <https://example.net#nav>.pathname = '../home'
+PASS <area>: Setting <https://example.net#nav>.pathname = '../home'
+PASS <a>: Setting <http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is a segment delimiter for 'special' URLs
+PASS <area>: Setting <http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is a segment delimiter for 'special' URLs
+FAIL <a>: Setting <view-source+http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is *not* a segment delimiter for non-'special' URLs assert_equals: expected "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav" but got "view-source+http://example.net/home?lang=fr#nav"
+FAIL <area>: Setting <view-source+http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is *not* a segment delimiter for non-'special' URLs assert_equals: expected "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav" but got "view-source+http://example.net/home?lang=fr#nav"
+FAIL <a>: Setting <a:/>.pathname = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed. assert_equals: expected "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/"
+FAIL <area>: Setting <a:/>.pathname = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed. assert_equals: expected "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/"
+FAIL <a>: Setting <http://example.net>.pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, including %2E outside dotted segments. assert_equals: expected "http://example.net/%2e%2E%c3%89t%C3%A9" but got "http://example.net/..%c3%89t%C3%A9"
+FAIL <area>: Setting <http://example.net>.pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, including %2E outside dotted segments. assert_equals: expected "http://example.net/%2e%2E%c3%89t%C3%A9" but got "http://example.net/..%c3%89t%C3%A9"
+PASS <a>: Setting <http://example.net>.pathname = '?' ? needs to be encoded
+PASS <area>: Setting <http://example.net>.pathname = '?' ? needs to be encoded
+PASS <a>: Setting <http://example.net>.pathname = '#' # needs to be encoded
+PASS <area>: Setting <http://example.net>.pathname = '#' # needs to be encoded
+FAIL <a>: Setting <sc://example.net>.pathname = '?' ? needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%3F" but got "sc://example.net"
+FAIL <area>: Setting <sc://example.net>.pathname = '?' ? needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%3F" but got "sc://example.net"
+FAIL <a>: Setting <sc://example.net>.pathname = '#' # needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%23" but got "sc://example.net"
+FAIL <area>: Setting <sc://example.net>.pathname = '#' # needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%23" but got "sc://example.net"
+PASS <a>: Setting <http://example.net>.pathname = '/?é' ? doesn't mess up encoding
+PASS <area>: Setting <http://example.net>.pathname = '/?é' ? doesn't mess up encoding
+PASS <a>: Setting <http://example.net>.pathname = '/#é' # doesn't mess up encoding
+PASS <area>: Setting <http://example.net>.pathname = '/#é' # doesn't mess up encoding
+FAIL <a>: Setting <non-spec:/>.pathname = '/.//p' Serialize /. in path assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '/.//p' Serialize /. in path assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL <area>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+PASS <a>: Setting <https://example.net#nav>.search = 'lang=fr'
+PASS <area>: Setting <https://example.net#nav>.search = 'lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = '??lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = '??lang=fr'
+FAIL <a>: Setting <https://example.net?lang=en-US#nav>.search = '?' assert_equals: expected "https://example.net/?#nav" but got "https://example.net/#nav"
+FAIL <area>: Setting <https://example.net?lang=en-US#nav>.search = '?' assert_equals: expected "https://example.net/?#nav" but got "https://example.net/#nav"
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = ''
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = ''
+PASS <a>: Setting <https://example.net?lang=en-US>.search = ''
+PASS <area>: Setting <https://example.net?lang=en-US>.search = ''
+PASS <a>: Setting <https://example.net>.search = ''
+PASS <area>: Setting <https://example.net>.search = ''
+FAIL <a>: Setting <a:/>.search = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+FAIL <area>: Setting <a:/>.search = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+PASS <a>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <area>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <a>: Setting <https://example.net>.hash = 'main'
+PASS <area>: Setting <https://example.net>.hash = 'main'
+PASS <a>: Setting <https://example.net#nav>.hash = 'main'
+PASS <area>: Setting <https://example.net#nav>.hash = 'main'
+PASS <a>: Setting <https://example.net?lang=en-US>.hash = '##nav'
+PASS <area>: Setting <https://example.net?lang=en-US>.hash = '##nav'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = '#main'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = '#main'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = '#'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = '#'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = ''
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = ''
+PASS <a>: Setting <http://example.net>.hash = '#foo bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo"bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo"bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo<bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo<bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo>bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo>bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo`bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo`bar'
+PASS <a>: Setting <a:/>.hash = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' Simple percent-encoding; tabs and newlines are removed
+PASS <area>: Setting <a:/>.hash = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' Simple percent-encoding; tabs and newlines are removed
+PASS <a>: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <area>: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <a>: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <area>: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <a>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <area>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/outline/focus-layers-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/outline/focus-layers-expected.png
index 48b90e5..a7fa9c2 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/outline/focus-layers-expected.png
+++ b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/outline/focus-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor-expected.html b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor-expected.html
new file mode 100644
index 0000000..2546325
--- /dev/null
+++ b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor-expected.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<style>
+  body {
+    margin: 0;
+    padding: 0;
+    font-size: 17px;
+    line-height: 20px;
+  }
+  a {
+    position: relative;
+    outline: red auto thin;
+    background: yellow;
+    width: 80px;
+    height: 80px;
+  }
+  div {
+    position: relative;
+    width: 80px;
+    height: 80px;
+  }
+</style>
+
+<a href="#" >Click
+  <div style="margin-left:40px; margin-top:20px; background-color: blue;"></div>
+  <div style="margin-left:80px; margin-top:-40px; background-color: green;"></div>
+</a>
+
+<a href="#" style="display:block; top:40px;">Click
+  <div style="margin-left:40px; margin-top:20px; background-color:blue;"></div>
+  <div style="margin-left:80px; margin-top:-40px; background-color:green;"></div>
+</a>
+
+<a href="#" style="display:block; top:160px;">Click
+  <div style="margin-left:40px; margin-top:20px; background-color: blue;"></div>
+  <div style="margin-left:80px; margin-top:-40px; background-color: green;"></div>
+</a>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor.html b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor.html
new file mode 100644
index 0000000..c5b03a9
--- /dev/null
+++ b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<style>
+  body {
+    margin: 0;
+    padding: 0;
+    font-size: 17px;
+    line-height: 20px;
+  }
+  a {
+    width: 80px;
+    height: 80px;
+    outline: red auto thin;
+    background: yellow;
+  }
+  a.relative {
+    position: relative;
+  }
+  a.absolute {
+    position: absolute;
+  }
+  a.block {
+    display: block;
+  }
+  div {
+    position: absolute;
+    width: 80px;
+    height: 80px;
+    top: 40px;
+    left: 40px;
+  }
+</style>
+
+<a href="#" class="relative">Click
+  <div style="background-color: blue;">
+    <div style="background-color: green;"></div>
+  </div>
+</a>
+
+<a href="#" class="relative block" style="top:180px;">Click
+  <div style="background-color: blue;">
+    <div style="background-color: green;"></div>
+  </div>
+</a>
+
+<a href="#" class="absolute" style="top:400px;">Click
+  <div style="background-color: blue;">
+    <div style="background-color: green;"></div>
+  </div>
+</a>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor1-expected.html b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor1-expected.html
new file mode 100644
index 0000000..be4ba8f
--- /dev/null
+++ b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor1-expected.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<style>
+  body {
+    line-height: 20px;
+  }
+  a {
+    width: 80px;
+    height: 80px;
+    outline: red auto thin;
+    background: yellow;
+  }
+  div {
+    position:relative;
+    width: 80px;
+    height: 80px;
+    background: yellow;
+  }
+</style>
+
+<a href="#">Click</a>
+<div style="margin-top:12px; margin-left:32px; background-color: blue;"></div>
+<div style="margin-top:-40px; margin-left:72px; background-color: green;"></div>
+
+<a href="#" style="display: block; margin-top:28px;">Click</a>
+<div style="margin-top:-38px; margin-left:32px; background-color: blue;"></div>
+<div style="margin-top:-40px; margin-left:72px; background-color: green;"></div>
+
+<div style="top:30px; outline: red auto thin;">Click</div>
+<div style="margin-top:-10px; margin-left:40px; background-color: blue;"></div>
+<div style="margin-top:-40px; margin-left:80px; background-color: green;"></div>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor1.html b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor1.html
new file mode 100644
index 0000000..e7579d3b
--- /dev/null
+++ b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor1.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<style>
+  body {
+    line-height: 20px;
+  }
+  a {
+    width: 80px;
+    height: 80px;
+    outline: red auto thin;
+    background: yellow;
+  }
+  div {
+    position: absolute;
+    width: 80px;
+    height: 80px;
+    background: yellow;
+  }
+  div.test_div {
+    top: 40px;
+    left: 40px;
+  }
+</style>
+
+<a href="#">Click
+  <div class="test_div" style="background-color: blue;">
+    <div class="test_div" style="background-color: green;"></div>
+  </div>
+</a>
+
+<a href="#" style="display: block; margin-top:160px">Click
+  <div class="test_div" style="background-color: blue; top:230px">
+    <div class="test_div" style="background-color: green; top:40px"></div>
+  </div>
+</a>
+
+<div style="top: 380px; outline: red auto thin;">Click
+  <div class="test_div" style="background-color: blue;">
+    <div class="test_div" style="background-color: green;"></div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-on-child-move-expected.txt b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-on-child-move-expected.txt
index 23751aa..cef08ea 100644
--- a/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-on-child-move-expected.txt
+++ b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-on-child-move-expected.txt
@@ -1,12 +1,13 @@
 {
   "layers": [
     {
-      "name": "Scrolling background of LayoutView #document",
+      "name": "Scrolling background of LayoutNGView #document",
       "bounds": [800, 600],
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [98, 48, 304, 304]
+        [300, 50, 20, 300],
+        [150, 50, 20, 300]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/paint/invalidation/outline/outline-auto-descendant-transform.html b/third_party/blink/web_tests/paint/invalidation/outline/outline-auto-descendant-transform.html
index 178fb32..2505f31d 100644
--- a/third_party/blink/web_tests/paint/invalidation/outline/outline-auto-descendant-transform.html
+++ b/third_party/blink/web_tests/paint/invalidation/outline/outline-auto-descendant-transform.html
@@ -2,7 +2,8 @@
 <html lang="en">
   <head>
     <style type="text/css">
-      .a {
+      a {
+        display: block;
         background: blue;
         height: 20px;
         width: 20px;
@@ -11,7 +12,7 @@
         outline-color: red;
         outline-style: auto;
       }
-      .b {
+      div {
         background: green;
         height: 100%;
         width: 100%;
@@ -24,7 +25,7 @@
     </style>
   </head>
   <body>
-    <div class="a"><div class="b"></div></div>
-    <div class="a"><div class="b"></div></div>
+    <a><div></div></a>
+    <a><div></div></a>
   </body>
 </html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/paint/invalidation/outline/transform-focus-ring-repaint-expected.html b/third_party/blink/web_tests/paint/invalidation/outline/transform-focus-ring-repaint-expected.html
deleted file mode 100644
index 4d016b1f..0000000
--- a/third_party/blink/web_tests/paint/invalidation/outline/transform-focus-ring-repaint-expected.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE html>
-<div style="height: 50px">
-Result repaint rects should cover the whole focus ring.
-</div>
-<div id="target" style="width: 200px; height: 200px; background-color: yellow; outline: red auto thin">
-    <div style="position: relative; top: 100px; left: 100px; background-color: blue; width: 300px; height: 300px">
-        <div style="position: relative; top: 40px; left: 100px; background-color: green; width: 100px; height: 400px"></div>
-    </div>
-</div>
diff --git a/third_party/blink/web_tests/paint/invalidation/outline/transform-focus-ring-repaint-expected.txt b/third_party/blink/web_tests/paint/invalidation/outline/transform-focus-ring-repaint-expected.txt
deleted file mode 100644
index 7de1c59c..0000000
--- a/third_party/blink/web_tests/paint/invalidation/outline/transform-focus-ring-repaint-expected.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "layers": [
-    {
-      "name": "Scrolling background of LayoutView #document",
-      "bounds": [800, 600],
-      "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "LayoutNGBlockFlow (positioned) DIV id='target'",
-      "position": [-2, -2],
-      "bounds": [404, 544],
-      "contentsOpaqueForText": true,
-      "backfaceVisibility": "hidden",
-      "invalidations": [
-        [0, 0, 404, 544]
-      ],
-      "transform": 1
-    }
-  ],
-  "transforms": [
-    {
-      "id": 1,
-      "transform": [
-        [1, 0, 0, 0],
-        [0, 1, 0, 0],
-        [0, 0, 1, 0],
-        [8, 58, 0, 1]
-      ]
-    }
-  ]
-}
-
diff --git a/third_party/blink/web_tests/paint/invalidation/outline/transform-focus-ring-repaint.html b/third_party/blink/web_tests/paint/invalidation/outline/transform-focus-ring-repaint.html
deleted file mode 100644
index d040bdc8..0000000
--- a/third_party/blink/web_tests/paint/invalidation/outline/transform-focus-ring-repaint.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!DOCTYPE html>
-<script src="../resources/text-based-repaint.js"></script>
-<script>
-function repaintTest() {
-  document.getElementById('target').style.outline = 'red auto thin';
-}
-onload = runRepaintAndPixelTest;
-</script>
-<div style="height: 50px">
-Result repaint rects should cover the whole focus ring.
-</div>
-<div id="target" style="position: absolute; backface-visibility: hidden; width: 200px; height: 200px; background-color: yellow">
-    <div style="transform: rotate(90deg); position: absolute; top: 100px; left: 100px; background-color: blue; width: 300px; height: 300px">
-        <div style="position: absolute; top: 100px; left: 40px; background-color: green; width: 400px; height: 100px"></div>
-    </div>
-</div>
diff --git a/third_party/blink/web_tests/platform/fuchsia/paint/invalidation/outline/focus-layers-expected.png b/third_party/blink/web_tests/platform/fuchsia/paint/invalidation/outline/focus-layers-expected.png
deleted file mode 100644
index e88f5fed..0000000
--- a/third_party/blink/web_tests/platform/fuchsia/paint/invalidation/outline/focus-layers-expected.png
+++ /dev/null
Binary files differ
diff --git "a/third_party/blink/web_tests/platform/linux/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
index e0c1e6a..51a0a6df 100644
--- "a/third_party/blink/web_tests/platform/linux/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
+++ "b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 371 tests; 231 PASS, 140 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 395 tests; 251 PASS, 144 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS <a>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
 PASS <area>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
@@ -287,6 +287,10 @@
 PASS <area>: Setting <sc:///>.port = '12'
 FAIL <a>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
 FAIL <area>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+PASS <a>: Setting <data:original>.pathname = 'new value'
+PASS <area>: Setting <data:original>.pathname = 'new value'
+PASS <a>: Setting <sc:original>.pathname = 'new value'
+PASS <area>: Setting <sc:original>.pathname = 'new value'
 FAIL <a>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
 FAIL <area>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
 FAIL <a>: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
@@ -331,6 +335,10 @@
 FAIL <area>: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
 FAIL <a>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
 FAIL <area>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL <a>: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020 assert_equals: expected "data:/space%20" but got "data:/nospace"
+FAIL <area>: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020 assert_equals: expected "data:/space%20" but got "data:/nospace"
+FAIL <a>: Setting <sc:/nospace>.pathname = 'space ' assert_equals: expected "sc:/space%20" but got "sc:/nospace"
+FAIL <area>: Setting <sc:/nospace>.pathname = 'space ' assert_equals: expected "sc:/space%20" but got "sc:/nospace"
 PASS <a>: Setting <https://example.net#nav>.search = 'lang=fr'
 PASS <area>: Setting <https://example.net#nav>.search = 'lang=fr'
 PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
@@ -353,6 +361,14 @@
 \r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
 PASS <a>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
 PASS <area>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <a>: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths
+PASS <area>: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths
+PASS <a>: Setting <sc:space ?query>.search = ''
+PASS <area>: Setting <sc:space ?query>.search = ''
+PASS <a>: Setting <data:space  ?query#fragment>.search = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <area>: Setting <data:space  ?query#fragment>.search = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <a>: Setting <sc:space  ?query#fragment>.search = ''
+PASS <area>: Setting <sc:space  ?query#fragment>.search = ''
 PASS <a>: Setting <https://example.net>.hash = 'main'
 PASS <area>: Setting <https://example.net>.hash = 'main'
 PASS <a>: Setting <https://example.net#nav>.hash = 'main'
@@ -385,5 +401,13 @@
 PASS <area>: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
 PASS <a>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
 PASS <area>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <a>: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths
+PASS <area>: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths
+PASS <a>: Setting <sc:space    #fragment>.hash = ''
+PASS <area>: Setting <sc:space    #fragment>.hash = ''
+PASS <a>: Setting <data:space  ?query#fragment>.hash = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <area>: Setting <data:space  ?query#fragment>.hash = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <a>: Setting <sc:space  ?query#fragment>.hash = ''
+PASS <area>: Setting <sc:space  ?query#fragment>.hash = ''
 Harness: the test ran to completion.
 
diff --git "a/third_party/blink/web_tests/platform/linux/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt"
index 46eab6a..4b6701a6 100644
--- "a/third_party/blink/web_tests/platform/linux/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt"
+++ "b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 186 tests; 116 PASS, 70 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 198 tests; 122 PASS, 76 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS URL: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
 PASS URL: Setting <a://example.net>.protocol = 'b'
@@ -144,6 +144,8 @@
 PASS URL: Setting <non-base:value>.port = '12'
 PASS URL: Setting <sc:///>.port = '12'
 FAIL URL: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+PASS URL: Setting <data:original>.pathname = 'new value'
+PASS URL: Setting <sc:original>.pathname = 'new value'
 FAIL URL: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
 FAIL URL: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
 FAIL URL: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
@@ -166,6 +168,8 @@
 FAIL URL: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
 FAIL URL: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
 FAIL URL: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL URL: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020 assert_equals: expected "data:/space%20" but got "data:/nospace"
+FAIL URL: Setting <sc:/nospace>.pathname = 'space ' assert_equals: expected "sc:/space%20" but got "sc:/nospace"
 PASS URL: Setting <https://example.net#nav>.search = 'lang=fr'
 PASS URL: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
 PASS URL: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
@@ -177,6 +181,10 @@
 FAIL URL: Setting <a:/>.search = '\0	
 \r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
 PASS URL: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+FAIL URL: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths assert_equals: expected "data:space" but got "data:space "
+FAIL URL: Setting <sc:space ?query>.search = '' assert_equals: expected "sc:space" but got "sc:space "
+PASS URL: Setting <data:space  ?query#fragment>.search = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS URL: Setting <sc:space  ?query#fragment>.search = ''
 PASS URL: Setting <https://example.net>.hash = 'main'
 PASS URL: Setting <https://example.net#nav>.hash = 'main'
 PASS URL: Setting <https://example.net?lang=en-US>.hash = '##nav'
@@ -193,5 +201,9 @@
 PASS URL: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
 PASS URL: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
 PASS URL: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+FAIL URL: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths assert_equals: expected "data:space" but got "data:space                                                                                                                                  "
+FAIL URL: Setting <sc:space    #fragment>.hash = '' assert_equals: expected "sc:space" but got "sc:space    "
+PASS URL: Setting <data:space  ?query#fragment>.hash = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS URL: Setting <sc:space  ?query#fragment>.hash = ''
 Harness: the test ran to completion.
 
diff --git "a/third_party/blink/web_tests/platform/linux/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt"
index 46eab6a..4b6701a6 100644
--- "a/third_party/blink/web_tests/platform/linux/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt"
+++ "b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 186 tests; 116 PASS, 70 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 198 tests; 122 PASS, 76 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS URL: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
 PASS URL: Setting <a://example.net>.protocol = 'b'
@@ -144,6 +144,8 @@
 PASS URL: Setting <non-base:value>.port = '12'
 PASS URL: Setting <sc:///>.port = '12'
 FAIL URL: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+PASS URL: Setting <data:original>.pathname = 'new value'
+PASS URL: Setting <sc:original>.pathname = 'new value'
 FAIL URL: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
 FAIL URL: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
 FAIL URL: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
@@ -166,6 +168,8 @@
 FAIL URL: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
 FAIL URL: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
 FAIL URL: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL URL: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020 assert_equals: expected "data:/space%20" but got "data:/nospace"
+FAIL URL: Setting <sc:/nospace>.pathname = 'space ' assert_equals: expected "sc:/space%20" but got "sc:/nospace"
 PASS URL: Setting <https://example.net#nav>.search = 'lang=fr'
 PASS URL: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
 PASS URL: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
@@ -177,6 +181,10 @@
 FAIL URL: Setting <a:/>.search = '\0	
 \r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
 PASS URL: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+FAIL URL: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths assert_equals: expected "data:space" but got "data:space "
+FAIL URL: Setting <sc:space ?query>.search = '' assert_equals: expected "sc:space" but got "sc:space "
+PASS URL: Setting <data:space  ?query#fragment>.search = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS URL: Setting <sc:space  ?query#fragment>.search = ''
 PASS URL: Setting <https://example.net>.hash = 'main'
 PASS URL: Setting <https://example.net#nav>.hash = 'main'
 PASS URL: Setting <https://example.net?lang=en-US>.hash = '##nav'
@@ -193,5 +201,9 @@
 PASS URL: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
 PASS URL: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
 PASS URL: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+FAIL URL: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths assert_equals: expected "data:space" but got "data:space                                                                                                                                  "
+FAIL URL: Setting <sc:space    #fragment>.hash = '' assert_equals: expected "sc:space" but got "sc:space    "
+PASS URL: Setting <data:space  ?query#fragment>.hash = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS URL: Setting <sc:space  ?query#fragment>.hash = ''
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/outline/focus-layers-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/outline/focus-layers-expected.png
index 368f7e2..369088a4 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/outline/focus-layers-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/outline/focus-layers-expected.png
Binary files differ
diff --git "a/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
index 6e10766..03ced2d3 100644
--- "a/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
+++ "b/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 371 tests; 229 PASS, 142 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 395 tests; 249 PASS, 146 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS <a>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
 PASS <area>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
@@ -287,6 +287,10 @@
 PASS <area>: Setting <sc:///>.port = '12'
 FAIL <a>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
 FAIL <area>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+PASS <a>: Setting <data:original>.pathname = 'new value'
+PASS <area>: Setting <data:original>.pathname = 'new value'
+PASS <a>: Setting <sc:original>.pathname = 'new value'
+PASS <area>: Setting <sc:original>.pathname = 'new value'
 FAIL <a>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
 FAIL <area>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
 FAIL <a>: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
@@ -331,6 +335,10 @@
 FAIL <area>: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
 FAIL <a>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
 FAIL <area>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL <a>: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020 assert_equals: expected "data:/space%20" but got "data:/nospace"
+FAIL <area>: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020 assert_equals: expected "data:/space%20" but got "data:/nospace"
+FAIL <a>: Setting <sc:/nospace>.pathname = 'space ' assert_equals: expected "sc:/space%20" but got "sc:/nospace"
+FAIL <area>: Setting <sc:/nospace>.pathname = 'space ' assert_equals: expected "sc:/space%20" but got "sc:/nospace"
 PASS <a>: Setting <https://example.net#nav>.search = 'lang=fr'
 PASS <area>: Setting <https://example.net#nav>.search = 'lang=fr'
 PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
@@ -353,6 +361,14 @@
 \r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
 PASS <a>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
 PASS <area>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <a>: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths
+PASS <area>: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths
+PASS <a>: Setting <sc:space ?query>.search = ''
+PASS <area>: Setting <sc:space ?query>.search = ''
+PASS <a>: Setting <data:space  ?query#fragment>.search = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <area>: Setting <data:space  ?query#fragment>.search = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <a>: Setting <sc:space  ?query#fragment>.search = ''
+PASS <area>: Setting <sc:space  ?query#fragment>.search = ''
 PASS <a>: Setting <https://example.net>.hash = 'main'
 PASS <area>: Setting <https://example.net>.hash = 'main'
 PASS <a>: Setting <https://example.net#nav>.hash = 'main'
@@ -385,5 +401,13 @@
 PASS <area>: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
 PASS <a>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
 PASS <area>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <a>: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths
+PASS <area>: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths
+PASS <a>: Setting <sc:space    #fragment>.hash = ''
+PASS <area>: Setting <sc:space    #fragment>.hash = ''
+PASS <a>: Setting <data:space  ?query#fragment>.hash = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <area>: Setting <data:space  ?query#fragment>.hash = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <a>: Setting <sc:space  ?query#fragment>.hash = ''
+PASS <area>: Setting <sc:space  ?query#fragment>.hash = ''
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters-a-area.window_include=mailto-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters-a-area.window_include=mailto-expected.txt
new file mode 100644
index 0000000..addb92f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters-a-area.window_include=mailto-expected.txt
@@ -0,0 +1,16 @@
+This is a testharness.js-based test.
+PASS Loading data…
+FAIL <a>: Setting <mailto:me@example.net>.protocol = 'http' Cannot-be-a-base URL doesn’t have a host, but URL in a special scheme must. assert_equals: expected "mailto:me@example.net" but got "http://me@example.net/"
+FAIL <area>: Setting <mailto:me@example.net>.protocol = 'http' Cannot-be-a-base URL doesn’t have a host, but URL in a special scheme must. assert_equals: expected "mailto:me@example.net" but got "http://me@example.net/"
+PASS <a>: Setting <mailto:you@example.net>.username = 'me' Cannot-be-a-base means no username
+PASS <area>: Setting <mailto:you@example.net>.username = 'me' Cannot-be-a-base means no username
+PASS <a>: Setting <mailto:me@example.net>.password = 'secret' Cannot-be-a-base means no password
+PASS <area>: Setting <mailto:me@example.net>.password = 'secret' Cannot-be-a-base means no password
+PASS <a>: Setting <mailto:me@example.net>.host = 'example.com' Cannot-be-a-base means no host
+PASS <area>: Setting <mailto:me@example.net>.host = 'example.com' Cannot-be-a-base means no host
+PASS <a>: Setting <mailto:me@example.net>.hostname = 'example.com' Cannot-be-a-base means no host
+PASS <area>: Setting <mailto:me@example.net>.hostname = 'example.com' Cannot-be-a-base means no host
+PASS <a>: Setting <mailto:me@example.net>.pathname = '/foo' Opaque paths cannot be set
+PASS <area>: Setting <mailto:me@example.net>.pathname = '/foo' Opaque paths cannot be set
+Harness: the test ran to completion.
+
diff --git "a/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt"
index b51a548..473f6a621 100644
--- "a/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt"
+++ "b/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 186 tests; 115 PASS, 71 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 198 tests; 121 PASS, 77 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS URL: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
 PASS URL: Setting <a://example.net>.protocol = 'b'
@@ -144,6 +144,8 @@
 PASS URL: Setting <non-base:value>.port = '12'
 PASS URL: Setting <sc:///>.port = '12'
 FAIL URL: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+PASS URL: Setting <data:original>.pathname = 'new value'
+PASS URL: Setting <sc:original>.pathname = 'new value'
 FAIL URL: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
 FAIL URL: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
 FAIL URL: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
@@ -166,6 +168,8 @@
 FAIL URL: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
 FAIL URL: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
 FAIL URL: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL URL: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020 assert_equals: expected "data:/space%20" but got "data:/nospace"
+FAIL URL: Setting <sc:/nospace>.pathname = 'space ' assert_equals: expected "sc:/space%20" but got "sc:/nospace"
 PASS URL: Setting <https://example.net#nav>.search = 'lang=fr'
 PASS URL: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
 PASS URL: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
@@ -177,6 +181,10 @@
 FAIL URL: Setting <a:/>.search = '\0	
 \r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
 PASS URL: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+FAIL URL: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths assert_equals: expected "data:space" but got "data:space "
+FAIL URL: Setting <sc:space ?query>.search = '' assert_equals: expected "sc:space" but got "sc:space "
+PASS URL: Setting <data:space  ?query#fragment>.search = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS URL: Setting <sc:space  ?query#fragment>.search = ''
 PASS URL: Setting <https://example.net>.hash = 'main'
 PASS URL: Setting <https://example.net#nav>.hash = 'main'
 PASS URL: Setting <https://example.net?lang=en-US>.hash = '##nav'
@@ -193,5 +201,9 @@
 PASS URL: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
 PASS URL: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
 PASS URL: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+FAIL URL: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths assert_equals: expected "data:space" but got "data:space                                                                                                                                  "
+FAIL URL: Setting <sc:space    #fragment>.hash = '' assert_equals: expected "sc:space" but got "sc:space    "
+PASS URL: Setting <data:space  ?query#fragment>.hash = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS URL: Setting <sc:space  ?query#fragment>.hash = ''
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters.any.worker_include=mailto-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters.any.worker_include=mailto-expected.txt
new file mode 100644
index 0000000..ce4605f8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters.any.worker_include=mailto-expected.txt
@@ -0,0 +1,10 @@
+This is a testharness.js-based test.
+PASS Loading data…
+FAIL URL: Setting <mailto:me@example.net>.protocol = 'http' Cannot-be-a-base URL doesn’t have a host, but URL in a special scheme must. assert_equals: expected "mailto:me@example.net" but got "http://me@example.net/"
+PASS URL: Setting <mailto:you@example.net>.username = 'me' Cannot-be-a-base means no username
+PASS URL: Setting <mailto:me@example.net>.password = 'secret' Cannot-be-a-base means no password
+PASS URL: Setting <mailto:me@example.net>.host = 'example.com' Cannot-be-a-base means no host
+PASS URL: Setting <mailto:me@example.net>.hostname = 'example.com' Cannot-be-a-base means no host
+PASS URL: Setting <mailto:me@example.net>.pathname = '/foo' Opaque paths cannot be set
+Harness: the test ran to completion.
+
diff --git "a/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt"
index b51a548..473f6a621 100644
--- "a/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt"
+++ "b/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 186 tests; 115 PASS, 71 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 198 tests; 121 PASS, 77 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS URL: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
 PASS URL: Setting <a://example.net>.protocol = 'b'
@@ -144,6 +144,8 @@
 PASS URL: Setting <non-base:value>.port = '12'
 PASS URL: Setting <sc:///>.port = '12'
 FAIL URL: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+PASS URL: Setting <data:original>.pathname = 'new value'
+PASS URL: Setting <sc:original>.pathname = 'new value'
 FAIL URL: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
 FAIL URL: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
 FAIL URL: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
@@ -166,6 +168,8 @@
 FAIL URL: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
 FAIL URL: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
 FAIL URL: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL URL: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020 assert_equals: expected "data:/space%20" but got "data:/nospace"
+FAIL URL: Setting <sc:/nospace>.pathname = 'space ' assert_equals: expected "sc:/space%20" but got "sc:/nospace"
 PASS URL: Setting <https://example.net#nav>.search = 'lang=fr'
 PASS URL: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
 PASS URL: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
@@ -177,6 +181,10 @@
 FAIL URL: Setting <a:/>.search = '\0	
 \r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
 PASS URL: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+FAIL URL: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths assert_equals: expected "data:space" but got "data:space "
+FAIL URL: Setting <sc:space ?query>.search = '' assert_equals: expected "sc:space" but got "sc:space "
+PASS URL: Setting <data:space  ?query#fragment>.search = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS URL: Setting <sc:space  ?query#fragment>.search = ''
 PASS URL: Setting <https://example.net>.hash = 'main'
 PASS URL: Setting <https://example.net#nav>.hash = 'main'
 PASS URL: Setting <https://example.net?lang=en-US>.hash = '##nav'
@@ -193,5 +201,9 @@
 PASS URL: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
 PASS URL: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
 PASS URL: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+FAIL URL: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths assert_equals: expected "data:space" but got "data:space                                                                                                                                  "
+FAIL URL: Setting <sc:space    #fragment>.hash = '' assert_equals: expected "sc:space" but got "sc:space    "
+PASS URL: Setting <data:space  ?query#fragment>.hash = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS URL: Setting <sc:space  ?query#fragment>.hash = ''
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters.any_include=mailto-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters.any_include=mailto-expected.txt
new file mode 100644
index 0000000..ce4605f8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/idna-2008/external/wpt/url/url-setters.any_include=mailto-expected.txt
@@ -0,0 +1,10 @@
+This is a testharness.js-based test.
+PASS Loading data…
+FAIL URL: Setting <mailto:me@example.net>.protocol = 'http' Cannot-be-a-base URL doesn’t have a host, but URL in a special scheme must. assert_equals: expected "mailto:me@example.net" but got "http://me@example.net/"
+PASS URL: Setting <mailto:you@example.net>.username = 'me' Cannot-be-a-base means no username
+PASS URL: Setting <mailto:me@example.net>.password = 'secret' Cannot-be-a-base means no password
+PASS URL: Setting <mailto:me@example.net>.host = 'example.com' Cannot-be-a-base means no host
+PASS URL: Setting <mailto:me@example.net>.hostname = 'example.com' Cannot-be-a-base means no host
+PASS URL: Setting <mailto:me@example.net>.pathname = '/foo' Opaque paths cannot be set
+Harness: the test ran to completion.
+
diff --git "a/third_party/blink/web_tests/platform/mac-mac11/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/platform/mac-mac11/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
new file mode 100644
index 0000000..51a0a6df
--- /dev/null
+++ "b/third_party/blink/web_tests/platform/mac-mac11/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -0,0 +1,413 @@
+This is a testharness.js-based test.
+Found 395 tests; 251 PASS, 144 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS Loading data…
+PASS <a>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
+PASS <area>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
+PASS <a>: Setting <a://example.net>.protocol = 'b'
+PASS <area>: Setting <a://example.net>.protocol = 'b'
+PASS <a>: Setting <a://example.net>.protocol = 'B' Upper-case ASCII is lower-cased
+PASS <area>: Setting <a://example.net>.protocol = 'B' Upper-case ASCII is lower-cased
+PASS <a>: Setting <a://example.net>.protocol = 'é' Non-ASCII is rejected
+PASS <area>: Setting <a://example.net>.protocol = 'é' Non-ASCII is rejected
+PASS <a>: Setting <a://example.net>.protocol = '0b' No leading digit
+PASS <area>: Setting <a://example.net>.protocol = '0b' No leading digit
+PASS <a>: Setting <a://example.net>.protocol = '+b' No leading punctuation
+PASS <area>: Setting <a://example.net>.protocol = '+b' No leading punctuation
+PASS <a>: Setting <a://example.net>.protocol = 'bC0+-.'
+PASS <area>: Setting <a://example.net>.protocol = 'bC0+-.'
+PASS <a>: Setting <a://example.net>.protocol = 'b,c' Only some punctuation is acceptable
+PASS <area>: Setting <a://example.net>.protocol = 'b,c' Only some punctuation is acceptable
+PASS <a>: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected
+PASS <area>: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected
+PASS <a>: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file
+PASS <area>: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file
+PASS <a>: Setting <https://example.net:1234>.protocol = 'file'
+PASS <area>: Setting <https://example.net:1234>.protocol = 'file'
+PASS <a>: Setting <wss://x:x@example.net:1234>.protocol = 'file'
+PASS <area>: Setting <wss://x:x@example.net:1234>.protocol = 'file'
+FAIL <a>: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "b://example.net/"
+FAIL <area>: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "b://example.net/"
+FAIL <a>: Setting <https://example.net>.protocol = 's' assert_equals: expected "https://example.net/" but got "s://example.net/"
+FAIL <area>: Setting <https://example.net>.protocol = 's' assert_equals: expected "https://example.net/" but got "s://example.net/"
+FAIL <a>: Setting <ftp://example.net>.protocol = 'test' assert_equals: expected "ftp://example.net/" but got "test://example.net/"
+FAIL <area>: Setting <ftp://example.net>.protocol = 'test' assert_equals: expected "ftp://example.net/" but got "test://example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'https' assert_equals: expected "ssh://me@example.net" but got "https://me@example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'https' assert_equals: expected "ssh://me@example.net" but got "https://me@example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
+FAIL <a>: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
+FAIL <area>: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
+FAIL <a>: Setting <nonsense:///test>.protocol = 'https' assert_equals: expected "nonsense:///test" but got "https://test/"
+FAIL <area>: Setting <nonsense:///test>.protocol = 'https' assert_equals: expected "nonsense:///test" but got "https://test/"
+PASS <a>: Setting <http://example.net>.protocol = 'https:foo : bar' Stuff after the first ':' is ignored
+PASS <area>: Setting <http://example.net>.protocol = 'https:foo : bar' Stuff after the first ':' is ignored
+PASS <a>: Setting <data:text/html,<p>Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored
+PASS <area>: Setting <data:text/html,<p>Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored
+PASS <a>: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.
+PASS <area>: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.
+PASS <a>: Setting <unix:/run/foo.socket>.username = 'me' No host means no username
+PASS <area>: Setting <unix:/run/foo.socket>.username = 'me' No host means no username
+PASS <a>: Setting <http://example.net>.username = 'me'
+PASS <area>: Setting <http://example.net>.username = 'me'
+PASS <a>: Setting <http://:secret@example.net>.username = 'me'
+PASS <area>: Setting <http://:secret@example.net>.username = 'me'
+PASS <a>: Setting <http://me@example.net>.username = ''
+PASS <area>: Setting <http://me@example.net>.username = ''
+PASS <a>: Setting <http://me:secret@example.net>.username = ''
+PASS <area>: Setting <http://me:secret@example.net>.username = ''
+FAIL <a>: Setting <http://example.net>.username = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+FAIL <area>: Setting <http://example.net>.username = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS <a>: Setting <http://example.net>.username = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <area>: Setting <http://example.net>.username = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <a>: Setting <sc:///>.username = 'x'
+PASS <area>: Setting <sc:///>.username = 'x'
+PASS <a>: Setting <unix:/run/foo.socket>.password = 'secret' No host means no password
+PASS <area>: Setting <unix:/run/foo.socket>.password = 'secret' No host means no password
+PASS <a>: Setting <http://example.net>.password = 'secret'
+PASS <area>: Setting <http://example.net>.password = 'secret'
+PASS <a>: Setting <http://me@example.net>.password = 'secret'
+PASS <area>: Setting <http://me@example.net>.password = 'secret'
+PASS <a>: Setting <http://:secret@example.net>.password = ''
+PASS <area>: Setting <http://:secret@example.net>.password = ''
+PASS <a>: Setting <http://me:secret@example.net>.password = ''
+PASS <area>: Setting <http://me:secret@example.net>.password = ''
+FAIL <a>: Setting <http://example.net>.password = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://:%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+FAIL <area>: Setting <http://example.net>.password = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://:%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS <a>: Setting <http://example.net>.password = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <area>: Setting <http://example.net>.password = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <a>: Setting <sc:///>.password = 'x'
+PASS <area>: Setting <sc:///>.password = 'x'
+FAIL <a>: Setting <sc://x/>.host = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = ' ' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = ' ' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '@' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = '@' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = 'ß' assert_equals: expected "sc://%C3%9F/" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = 'ß' assert_equals: expected "sc://%C3%9F/" but got "sc://x/"
+PASS <a>: Setting <https://x/>.host = 'ß' IDNA Nontransitional_Processing
+PASS <area>: Setting <https://x/>.host = 'ß' IDNA Nontransitional_Processing
+PASS <a>: Setting <data:text/plain,Stuff>.host = 'example.net' Cannot-be-a-base means no host
+PASS <area>: Setting <data:text/plain,Stuff>.host = 'example.net' Cannot-be-a-base means no host
+PASS <a>: Setting <http://example.net>.host = 'example.com:8080'
+PASS <area>: Setting <http://example.net>.host = 'example.com:8080'
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com' Port number is unchanged if not specified in the new value
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com' Port number is unchanged if not specified in the new value
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified
+PASS <a>: Setting <http://example.net>.host = '' The empty host is not valid for special schemes
+PASS <area>: Setting <http://example.net>.host = '' The empty host is not valid for special schemes
+FAIL <a>: Setting <view-source+http://example.net/foo>.host = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <area>: Setting <view-source+http://example.net/foo>.host = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <a>: Setting <a:/foo>.host = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+FAIL <area>: Setting <a:/foo>.host = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+PASS <a>: Setting <http://example.net>.host = '0x7F000001:8080' IPv4 address syntax is normalized
+PASS <area>: Setting <http://example.net>.host = '0x7F000001:8080' IPv4 address syntax is normalized
+PASS <a>: Setting <http://example.net>.host = '[::0:01]:2' IPv6 address syntax is normalized
+PASS <area>: Setting <http://example.net>.host = '[::0:01]:2' IPv6 address syntax is normalized
+PASS <a>: Setting <http://example.net>.host = '[2001:db8::2]:4002' IPv6 literal address with port, crbug.com/1012416
+PASS <area>: Setting <http://example.net>.host = '[2001:db8::2]:4002' IPv6 literal address with port, crbug.com/1012416
+PASS <a>: Setting <http://example.net>.host = 'example.com:80' Default port number is removed
+PASS <area>: Setting <http://example.net>.host = 'example.com:80' Default port number is removed
+PASS <a>: Setting <https://example.net>.host = 'example.com:443' Default port number is removed
+PASS <area>: Setting <https://example.net>.host = 'example.com:443' Default port number is removed
+PASS <a>: Setting <https://example.net>.host = 'example.com:80' Default port number is only removed for the relevant scheme
+PASS <area>: Setting <https://example.net>.host = 'example.com:80' Default port number is only removed for the relevant scheme
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com:80' Port number is removed if new port is scheme default and existing URL has a non-default port
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com:80' Port number is removed if new port is scheme default and existing URL has a non-default port
+PASS <a>: Setting <http://example.net/path>.host = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.host = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.host = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <area>: Setting <view-source+http://example.net/path>.host = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <a>: Setting <view-source+http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.com:8080/path" but got "view-source+http://example.net/path"
+FAIL <area>: Setting <view-source+http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.com:8080/path" but got "view-source+http://example.net/path"
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:65535' Port numbers are 16 bit integers
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:65535' Port numbers are 16 bit integers
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.
+PASS <a>: Setting <http://example.net/>.host = '[google.com]' Broken IPv6
+PASS <area>: Setting <http://example.net/>.host = '[google.com]' Broken IPv6
+PASS <a>: Setting <http://example.net/>.host = '[::1.2.3.4x]'
+PASS <area>: Setting <http://example.net/>.host = '[::1.2.3.4x]'
+FAIL <a>: Setting <http://example.net/>.host = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <a>: Setting <http://example.net/>.host = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <a>: Setting <http://example.net/>.host = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <a>: Setting <sc://test@test/>.host = '' assert_equals: expected "test" but got ""
+FAIL <area>: Setting <sc://test@test/>.host = '' assert_equals: expected "test" but got ""
+FAIL <a>: Setting <sc://test:12/>.host = '' assert_equals: expected "test:12" but got ""
+FAIL <area>: Setting <sc://test:12/>.host = '' assert_equals: expected "test:12" but got ""
+PASS <a>: Setting <http://example.com/>.host = '///bad.com' Leading / is not stripped
+PASS <area>: Setting <http://example.com/>.host = '///bad.com' Leading / is not stripped
+FAIL <a>: Setting <sc://example.com/>.host = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <area>: Setting <sc://example.com/>.host = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <a>: Setting <sc://x/>.hostname = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.hostname = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = ' ' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = ' ' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.hostname = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '@' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = '@' assert_equals: expected "x" but got ""
+PASS <a>: Setting <data:text/plain,Stuff>.hostname = 'example.net' Cannot-be-a-base means no host
+PASS <area>: Setting <data:text/plain,Stuff>.hostname = 'example.net' Cannot-be-a-base means no host
+PASS <a>: Setting <http://example.net:8080>.hostname = 'example.com'
+PASS <area>: Setting <http://example.net:8080>.hostname = 'example.com'
+PASS <a>: Setting <http://example.net>.hostname = '' The empty host is not valid for special schemes
+PASS <area>: Setting <http://example.net>.hostname = '' The empty host is not valid for special schemes
+FAIL <a>: Setting <view-source+http://example.net/foo>.hostname = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <area>: Setting <view-source+http://example.net/foo>.hostname = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <a>: Setting <a:/foo>.hostname = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+FAIL <area>: Setting <a:/foo>.hostname = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+PASS <a>: Setting <http://example.net:8080>.hostname = '0x7F000001' IPv4 address syntax is normalized
+PASS <area>: Setting <http://example.net:8080>.hostname = '0x7F000001' IPv4 address syntax is normalized
+PASS <a>: Setting <http://example.net>.hostname = '[::0:01]' IPv6 address syntax is normalized
+PASS <area>: Setting <http://example.net>.hostname = '[::0:01]' IPv6 address syntax is normalized
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com:8080' : delimiter invalidates entire value
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com:8080' : delimiter invalidates entire value
+PASS <a>: Setting <http://example.net:8080/path>.hostname = 'example.com:' : delimiter invalidates entire value
+PASS <area>: Setting <http://example.net:8080/path>.hostname = 'example.com:' : delimiter invalidates entire value
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.hostname = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <area>: Setting <view-source+http://example.net/path>.hostname = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+PASS <a>: Setting <http://example.net/>.hostname = '[google.com]' Broken IPv6
+PASS <area>: Setting <http://example.net/>.hostname = '[google.com]' Broken IPv6
+PASS <a>: Setting <http://example.net/>.hostname = '[::1.2.3.4x]'
+PASS <area>: Setting <http://example.net/>.hostname = '[::1.2.3.4x]'
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <a>: Setting <sc://test@test/>.hostname = '' assert_equals: expected "test" but got ""
+FAIL <area>: Setting <sc://test@test/>.hostname = '' assert_equals: expected "test" but got ""
+FAIL <a>: Setting <sc://test:12/>.hostname = '' assert_equals: expected "test:12" but got ""
+FAIL <area>: Setting <sc://test:12/>.hostname = '' assert_equals: expected "test:12" but got ""
+FAIL <a>: Setting <non-spec:/.//p>.hostname = 'h' Drop /. from path assert_equals: expected "non-spec://h//p" but got "non-spec:/.//p"
+FAIL <area>: Setting <non-spec:/.//p>.hostname = 'h' Drop /. from path assert_equals: expected "non-spec://h//p" but got "non-spec:/.//p"
+FAIL <a>: Setting <non-spec:/.//p>.hostname = '' assert_equals: expected "non-spec:////p" but got "non-spec:/.//p"
+FAIL <area>: Setting <non-spec:/.//p>.hostname = '' assert_equals: expected "non-spec:////p" but got "non-spec:/.//p"
+PASS <a>: Setting <http://example.com/>.hostname = '///bad.com' Leading / is not stripped
+PASS <area>: Setting <http://example.com/>.hostname = '///bad.com' Leading / is not stripped
+FAIL <a>: Setting <sc://example.com/>.hostname = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <area>: Setting <sc://example.com/>.hostname = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+PASS <a>: Setting <http://example.net>.port = '8080'
+PASS <area>: Setting <http://example.net>.port = '8080'
+PASS <a>: Setting <http://example.net:8080>.port = '' Port number is removed if empty is the new value
+PASS <area>: Setting <http://example.net:8080>.port = '' Port number is removed if empty is the new value
+PASS <a>: Setting <http://example.net:8080>.port = '80' Default port number is removed
+PASS <area>: Setting <http://example.net:8080>.port = '80' Default port number is removed
+PASS <a>: Setting <https://example.net:4433>.port = '443' Default port number is removed
+PASS <area>: Setting <https://example.net:4433>.port = '443' Default port number is removed
+PASS <a>: Setting <https://example.net>.port = '80' Default port number is only removed for the relevant scheme
+PASS <area>: Setting <https://example.net>.port = '80' Default port number is only removed for the relevant scheme
+PASS <a>: Setting <http://example.net/path>.port = '8080/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.port = '8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.net:8080/path" but got "view-source+http://example.net/path"
+FAIL <area>: Setting <view-source+http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.net:8080/path" but got "view-source+http://example.net/path"
+PASS <a>: Setting <http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.port = '65535' Port numbers are 16 bit integers
+PASS <area>: Setting <http://example.net/path>.port = '65535' Port numbers are 16 bit integers
+FAIL <a>: Setting <http://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "http://example.net:8080/path" but got "http://example.net:0/path"
+FAIL <area>: Setting <http://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "http://example.net:8080/path" but got "http://example.net:0/path"
+FAIL <a>: Setting <non-special://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "example.net:8080" but got ""
+FAIL <area>: Setting <non-special://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "example.net:8080" but got ""
+PASS <a>: Setting <non-base:value>.port = '12'
+PASS <area>: Setting <non-base:value>.port = '12'
+PASS <a>: Setting <sc:///>.port = '12'
+PASS <area>: Setting <sc:///>.port = '12'
+FAIL <a>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+PASS <a>: Setting <data:original>.pathname = 'new value'
+PASS <area>: Setting <data:original>.pathname = 'new value'
+PASS <a>: Setting <sc:original>.pathname = 'new value'
+PASS <area>: Setting <sc:original>.pathname = 'new value'
+FAIL <a>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
+FAIL <area>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
+FAIL <a>: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
+FAIL <area>: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
+FAIL <a>: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
+FAIL <area>: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
+FAIL <a>: Setting <foo:/some/path>.pathname = 'test' Path-only URLs always have an initial slash assert_equals: expected "foo:/test" but got "foo:/some/path"
+FAIL <area>: Setting <foo:/some/path>.pathname = 'test' Path-only URLs always have an initial slash assert_equals: expected "foo:/test" but got "foo:/some/path"
+FAIL <a>: Setting <unix:/run/foo.socket?timeout=10>.pathname = '/var/log/../run/bar.socket' assert_equals: expected "unix:/var/run/bar.socket?timeout=10" but got "unix:/run/foo.socket?timeout=10"
+FAIL <area>: Setting <unix:/run/foo.socket?timeout=10>.pathname = '/var/log/../run/bar.socket' assert_equals: expected "unix:/var/run/bar.socket?timeout=10" but got "unix:/run/foo.socket?timeout=10"
+PASS <a>: Setting <https://example.net#nav>.pathname = 'home'
+PASS <area>: Setting <https://example.net#nav>.pathname = 'home'
+PASS <a>: Setting <https://example.net#nav>.pathname = '../home'
+PASS <area>: Setting <https://example.net#nav>.pathname = '../home'
+PASS <a>: Setting <http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is a segment delimiter for 'special' URLs
+PASS <area>: Setting <http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is a segment delimiter for 'special' URLs
+FAIL <a>: Setting <view-source+http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is *not* a segment delimiter for non-'special' URLs assert_equals: expected "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav" but got "view-source+http://example.net/home?lang=fr#nav"
+FAIL <area>: Setting <view-source+http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is *not* a segment delimiter for non-'special' URLs assert_equals: expected "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav" but got "view-source+http://example.net/home?lang=fr#nav"
+FAIL <a>: Setting <a:/>.pathname = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed. assert_equals: expected "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/"
+FAIL <area>: Setting <a:/>.pathname = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed. assert_equals: expected "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/"
+FAIL <a>: Setting <http://example.net>.pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, including %2E outside dotted segments. assert_equals: expected "http://example.net/%2e%2E%c3%89t%C3%A9" but got "http://example.net/..%c3%89t%C3%A9"
+FAIL <area>: Setting <http://example.net>.pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, including %2E outside dotted segments. assert_equals: expected "http://example.net/%2e%2E%c3%89t%C3%A9" but got "http://example.net/..%c3%89t%C3%A9"
+PASS <a>: Setting <http://example.net>.pathname = '?' ? needs to be encoded
+PASS <area>: Setting <http://example.net>.pathname = '?' ? needs to be encoded
+PASS <a>: Setting <http://example.net>.pathname = '#' # needs to be encoded
+PASS <area>: Setting <http://example.net>.pathname = '#' # needs to be encoded
+FAIL <a>: Setting <sc://example.net>.pathname = '?' ? needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%3F" but got "sc://example.net"
+FAIL <area>: Setting <sc://example.net>.pathname = '?' ? needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%3F" but got "sc://example.net"
+FAIL <a>: Setting <sc://example.net>.pathname = '#' # needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%23" but got "sc://example.net"
+FAIL <area>: Setting <sc://example.net>.pathname = '#' # needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%23" but got "sc://example.net"
+PASS <a>: Setting <http://example.net>.pathname = '/?é' ? doesn't mess up encoding
+PASS <area>: Setting <http://example.net>.pathname = '/?é' ? doesn't mess up encoding
+PASS <a>: Setting <http://example.net>.pathname = '/#é' # doesn't mess up encoding
+PASS <area>: Setting <http://example.net>.pathname = '/#é' # doesn't mess up encoding
+FAIL <a>: Setting <non-spec:/>.pathname = '/.//p' Serialize /. in path assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '/.//p' Serialize /. in path assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL <area>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL <a>: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020 assert_equals: expected "data:/space%20" but got "data:/nospace"
+FAIL <area>: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020 assert_equals: expected "data:/space%20" but got "data:/nospace"
+FAIL <a>: Setting <sc:/nospace>.pathname = 'space ' assert_equals: expected "sc:/space%20" but got "sc:/nospace"
+FAIL <area>: Setting <sc:/nospace>.pathname = 'space ' assert_equals: expected "sc:/space%20" but got "sc:/nospace"
+PASS <a>: Setting <https://example.net#nav>.search = 'lang=fr'
+PASS <area>: Setting <https://example.net#nav>.search = 'lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = '??lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = '??lang=fr'
+FAIL <a>: Setting <https://example.net?lang=en-US#nav>.search = '?' assert_equals: expected "https://example.net/?#nav" but got "https://example.net/#nav"
+FAIL <area>: Setting <https://example.net?lang=en-US#nav>.search = '?' assert_equals: expected "https://example.net/?#nav" but got "https://example.net/#nav"
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = ''
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = ''
+PASS <a>: Setting <https://example.net?lang=en-US>.search = ''
+PASS <area>: Setting <https://example.net?lang=en-US>.search = ''
+PASS <a>: Setting <https://example.net>.search = ''
+PASS <area>: Setting <https://example.net>.search = ''
+FAIL <a>: Setting <a:/>.search = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+FAIL <area>: Setting <a:/>.search = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+PASS <a>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <area>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <a>: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths
+PASS <area>: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths
+PASS <a>: Setting <sc:space ?query>.search = ''
+PASS <area>: Setting <sc:space ?query>.search = ''
+PASS <a>: Setting <data:space  ?query#fragment>.search = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <area>: Setting <data:space  ?query#fragment>.search = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <a>: Setting <sc:space  ?query#fragment>.search = ''
+PASS <area>: Setting <sc:space  ?query#fragment>.search = ''
+PASS <a>: Setting <https://example.net>.hash = 'main'
+PASS <area>: Setting <https://example.net>.hash = 'main'
+PASS <a>: Setting <https://example.net#nav>.hash = 'main'
+PASS <area>: Setting <https://example.net#nav>.hash = 'main'
+PASS <a>: Setting <https://example.net?lang=en-US>.hash = '##nav'
+PASS <area>: Setting <https://example.net?lang=en-US>.hash = '##nav'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = '#main'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = '#main'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = '#'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = '#'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = ''
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = ''
+PASS <a>: Setting <http://example.net>.hash = '#foo bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo"bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo"bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo<bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo<bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo>bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo>bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo`bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo`bar'
+PASS <a>: Setting <a:/>.hash = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' Simple percent-encoding; tabs and newlines are removed
+PASS <area>: Setting <a:/>.hash = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' Simple percent-encoding; tabs and newlines are removed
+PASS <a>: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <area>: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <a>: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <area>: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <a>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <area>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <a>: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths
+PASS <area>: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths
+PASS <a>: Setting <sc:space    #fragment>.hash = ''
+PASS <area>: Setting <sc:space    #fragment>.hash = ''
+PASS <a>: Setting <data:space  ?query#fragment>.hash = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <area>: Setting <data:space  ?query#fragment>.hash = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <a>: Setting <sc:space  ?query#fragment>.hash = ''
+PASS <area>: Setting <sc:space  ?query#fragment>.hash = ''
+Harness: the test ran to completion.
+
diff --git "a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
new file mode 100644
index 0000000..51a0a6df
--- /dev/null
+++ "b/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -0,0 +1,413 @@
+This is a testharness.js-based test.
+Found 395 tests; 251 PASS, 144 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS Loading data…
+PASS <a>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
+PASS <area>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
+PASS <a>: Setting <a://example.net>.protocol = 'b'
+PASS <area>: Setting <a://example.net>.protocol = 'b'
+PASS <a>: Setting <a://example.net>.protocol = 'B' Upper-case ASCII is lower-cased
+PASS <area>: Setting <a://example.net>.protocol = 'B' Upper-case ASCII is lower-cased
+PASS <a>: Setting <a://example.net>.protocol = 'é' Non-ASCII is rejected
+PASS <area>: Setting <a://example.net>.protocol = 'é' Non-ASCII is rejected
+PASS <a>: Setting <a://example.net>.protocol = '0b' No leading digit
+PASS <area>: Setting <a://example.net>.protocol = '0b' No leading digit
+PASS <a>: Setting <a://example.net>.protocol = '+b' No leading punctuation
+PASS <area>: Setting <a://example.net>.protocol = '+b' No leading punctuation
+PASS <a>: Setting <a://example.net>.protocol = 'bC0+-.'
+PASS <area>: Setting <a://example.net>.protocol = 'bC0+-.'
+PASS <a>: Setting <a://example.net>.protocol = 'b,c' Only some punctuation is acceptable
+PASS <area>: Setting <a://example.net>.protocol = 'b,c' Only some punctuation is acceptable
+PASS <a>: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected
+PASS <area>: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected
+PASS <a>: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file
+PASS <area>: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file
+PASS <a>: Setting <https://example.net:1234>.protocol = 'file'
+PASS <area>: Setting <https://example.net:1234>.protocol = 'file'
+PASS <a>: Setting <wss://x:x@example.net:1234>.protocol = 'file'
+PASS <area>: Setting <wss://x:x@example.net:1234>.protocol = 'file'
+FAIL <a>: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "b://example.net/"
+FAIL <area>: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "b://example.net/"
+FAIL <a>: Setting <https://example.net>.protocol = 's' assert_equals: expected "https://example.net/" but got "s://example.net/"
+FAIL <area>: Setting <https://example.net>.protocol = 's' assert_equals: expected "https://example.net/" but got "s://example.net/"
+FAIL <a>: Setting <ftp://example.net>.protocol = 'test' assert_equals: expected "ftp://example.net/" but got "test://example.net/"
+FAIL <area>: Setting <ftp://example.net>.protocol = 'test' assert_equals: expected "ftp://example.net/" but got "test://example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'https' assert_equals: expected "ssh://me@example.net" but got "https://me@example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'https' assert_equals: expected "ssh://me@example.net" but got "https://me@example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
+FAIL <a>: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
+FAIL <area>: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
+FAIL <a>: Setting <nonsense:///test>.protocol = 'https' assert_equals: expected "nonsense:///test" but got "https://test/"
+FAIL <area>: Setting <nonsense:///test>.protocol = 'https' assert_equals: expected "nonsense:///test" but got "https://test/"
+PASS <a>: Setting <http://example.net>.protocol = 'https:foo : bar' Stuff after the first ':' is ignored
+PASS <area>: Setting <http://example.net>.protocol = 'https:foo : bar' Stuff after the first ':' is ignored
+PASS <a>: Setting <data:text/html,<p>Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored
+PASS <area>: Setting <data:text/html,<p>Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored
+PASS <a>: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.
+PASS <area>: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.
+PASS <a>: Setting <unix:/run/foo.socket>.username = 'me' No host means no username
+PASS <area>: Setting <unix:/run/foo.socket>.username = 'me' No host means no username
+PASS <a>: Setting <http://example.net>.username = 'me'
+PASS <area>: Setting <http://example.net>.username = 'me'
+PASS <a>: Setting <http://:secret@example.net>.username = 'me'
+PASS <area>: Setting <http://:secret@example.net>.username = 'me'
+PASS <a>: Setting <http://me@example.net>.username = ''
+PASS <area>: Setting <http://me@example.net>.username = ''
+PASS <a>: Setting <http://me:secret@example.net>.username = ''
+PASS <area>: Setting <http://me:secret@example.net>.username = ''
+FAIL <a>: Setting <http://example.net>.username = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+FAIL <area>: Setting <http://example.net>.username = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS <a>: Setting <http://example.net>.username = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <area>: Setting <http://example.net>.username = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <a>: Setting <sc:///>.username = 'x'
+PASS <area>: Setting <sc:///>.username = 'x'
+PASS <a>: Setting <unix:/run/foo.socket>.password = 'secret' No host means no password
+PASS <area>: Setting <unix:/run/foo.socket>.password = 'secret' No host means no password
+PASS <a>: Setting <http://example.net>.password = 'secret'
+PASS <area>: Setting <http://example.net>.password = 'secret'
+PASS <a>: Setting <http://me@example.net>.password = 'secret'
+PASS <area>: Setting <http://me@example.net>.password = 'secret'
+PASS <a>: Setting <http://:secret@example.net>.password = ''
+PASS <area>: Setting <http://:secret@example.net>.password = ''
+PASS <a>: Setting <http://me:secret@example.net>.password = ''
+PASS <area>: Setting <http://me:secret@example.net>.password = ''
+FAIL <a>: Setting <http://example.net>.password = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://:%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+FAIL <area>: Setting <http://example.net>.password = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://:%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS <a>: Setting <http://example.net>.password = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <area>: Setting <http://example.net>.password = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <a>: Setting <sc:///>.password = 'x'
+PASS <area>: Setting <sc:///>.password = 'x'
+FAIL <a>: Setting <sc://x/>.host = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = ' ' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = ' ' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '@' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = '@' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = 'ß' assert_equals: expected "sc://%C3%9F/" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = 'ß' assert_equals: expected "sc://%C3%9F/" but got "sc://x/"
+PASS <a>: Setting <https://x/>.host = 'ß' IDNA Nontransitional_Processing
+PASS <area>: Setting <https://x/>.host = 'ß' IDNA Nontransitional_Processing
+PASS <a>: Setting <data:text/plain,Stuff>.host = 'example.net' Cannot-be-a-base means no host
+PASS <area>: Setting <data:text/plain,Stuff>.host = 'example.net' Cannot-be-a-base means no host
+PASS <a>: Setting <http://example.net>.host = 'example.com:8080'
+PASS <area>: Setting <http://example.net>.host = 'example.com:8080'
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com' Port number is unchanged if not specified in the new value
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com' Port number is unchanged if not specified in the new value
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified
+PASS <a>: Setting <http://example.net>.host = '' The empty host is not valid for special schemes
+PASS <area>: Setting <http://example.net>.host = '' The empty host is not valid for special schemes
+FAIL <a>: Setting <view-source+http://example.net/foo>.host = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <area>: Setting <view-source+http://example.net/foo>.host = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <a>: Setting <a:/foo>.host = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+FAIL <area>: Setting <a:/foo>.host = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+PASS <a>: Setting <http://example.net>.host = '0x7F000001:8080' IPv4 address syntax is normalized
+PASS <area>: Setting <http://example.net>.host = '0x7F000001:8080' IPv4 address syntax is normalized
+PASS <a>: Setting <http://example.net>.host = '[::0:01]:2' IPv6 address syntax is normalized
+PASS <area>: Setting <http://example.net>.host = '[::0:01]:2' IPv6 address syntax is normalized
+PASS <a>: Setting <http://example.net>.host = '[2001:db8::2]:4002' IPv6 literal address with port, crbug.com/1012416
+PASS <area>: Setting <http://example.net>.host = '[2001:db8::2]:4002' IPv6 literal address with port, crbug.com/1012416
+PASS <a>: Setting <http://example.net>.host = 'example.com:80' Default port number is removed
+PASS <area>: Setting <http://example.net>.host = 'example.com:80' Default port number is removed
+PASS <a>: Setting <https://example.net>.host = 'example.com:443' Default port number is removed
+PASS <area>: Setting <https://example.net>.host = 'example.com:443' Default port number is removed
+PASS <a>: Setting <https://example.net>.host = 'example.com:80' Default port number is only removed for the relevant scheme
+PASS <area>: Setting <https://example.net>.host = 'example.com:80' Default port number is only removed for the relevant scheme
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com:80' Port number is removed if new port is scheme default and existing URL has a non-default port
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com:80' Port number is removed if new port is scheme default and existing URL has a non-default port
+PASS <a>: Setting <http://example.net/path>.host = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.host = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.host = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <area>: Setting <view-source+http://example.net/path>.host = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <a>: Setting <view-source+http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.com:8080/path" but got "view-source+http://example.net/path"
+FAIL <area>: Setting <view-source+http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.com:8080/path" but got "view-source+http://example.net/path"
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:65535' Port numbers are 16 bit integers
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:65535' Port numbers are 16 bit integers
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.
+PASS <a>: Setting <http://example.net/>.host = '[google.com]' Broken IPv6
+PASS <area>: Setting <http://example.net/>.host = '[google.com]' Broken IPv6
+PASS <a>: Setting <http://example.net/>.host = '[::1.2.3.4x]'
+PASS <area>: Setting <http://example.net/>.host = '[::1.2.3.4x]'
+FAIL <a>: Setting <http://example.net/>.host = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <a>: Setting <http://example.net/>.host = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <a>: Setting <http://example.net/>.host = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <a>: Setting <sc://test@test/>.host = '' assert_equals: expected "test" but got ""
+FAIL <area>: Setting <sc://test@test/>.host = '' assert_equals: expected "test" but got ""
+FAIL <a>: Setting <sc://test:12/>.host = '' assert_equals: expected "test:12" but got ""
+FAIL <area>: Setting <sc://test:12/>.host = '' assert_equals: expected "test:12" but got ""
+PASS <a>: Setting <http://example.com/>.host = '///bad.com' Leading / is not stripped
+PASS <area>: Setting <http://example.com/>.host = '///bad.com' Leading / is not stripped
+FAIL <a>: Setting <sc://example.com/>.host = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <area>: Setting <sc://example.com/>.host = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <a>: Setting <sc://x/>.hostname = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.hostname = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = ' ' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = ' ' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.hostname = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '@' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = '@' assert_equals: expected "x" but got ""
+PASS <a>: Setting <data:text/plain,Stuff>.hostname = 'example.net' Cannot-be-a-base means no host
+PASS <area>: Setting <data:text/plain,Stuff>.hostname = 'example.net' Cannot-be-a-base means no host
+PASS <a>: Setting <http://example.net:8080>.hostname = 'example.com'
+PASS <area>: Setting <http://example.net:8080>.hostname = 'example.com'
+PASS <a>: Setting <http://example.net>.hostname = '' The empty host is not valid for special schemes
+PASS <area>: Setting <http://example.net>.hostname = '' The empty host is not valid for special schemes
+FAIL <a>: Setting <view-source+http://example.net/foo>.hostname = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <area>: Setting <view-source+http://example.net/foo>.hostname = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <a>: Setting <a:/foo>.hostname = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+FAIL <area>: Setting <a:/foo>.hostname = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+PASS <a>: Setting <http://example.net:8080>.hostname = '0x7F000001' IPv4 address syntax is normalized
+PASS <area>: Setting <http://example.net:8080>.hostname = '0x7F000001' IPv4 address syntax is normalized
+PASS <a>: Setting <http://example.net>.hostname = '[::0:01]' IPv6 address syntax is normalized
+PASS <area>: Setting <http://example.net>.hostname = '[::0:01]' IPv6 address syntax is normalized
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com:8080' : delimiter invalidates entire value
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com:8080' : delimiter invalidates entire value
+PASS <a>: Setting <http://example.net:8080/path>.hostname = 'example.com:' : delimiter invalidates entire value
+PASS <area>: Setting <http://example.net:8080/path>.hostname = 'example.com:' : delimiter invalidates entire value
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.hostname = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <area>: Setting <view-source+http://example.net/path>.hostname = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+PASS <a>: Setting <http://example.net/>.hostname = '[google.com]' Broken IPv6
+PASS <area>: Setting <http://example.net/>.hostname = '[google.com]' Broken IPv6
+PASS <a>: Setting <http://example.net/>.hostname = '[::1.2.3.4x]'
+PASS <area>: Setting <http://example.net/>.hostname = '[::1.2.3.4x]'
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <a>: Setting <sc://test@test/>.hostname = '' assert_equals: expected "test" but got ""
+FAIL <area>: Setting <sc://test@test/>.hostname = '' assert_equals: expected "test" but got ""
+FAIL <a>: Setting <sc://test:12/>.hostname = '' assert_equals: expected "test:12" but got ""
+FAIL <area>: Setting <sc://test:12/>.hostname = '' assert_equals: expected "test:12" but got ""
+FAIL <a>: Setting <non-spec:/.//p>.hostname = 'h' Drop /. from path assert_equals: expected "non-spec://h//p" but got "non-spec:/.//p"
+FAIL <area>: Setting <non-spec:/.//p>.hostname = 'h' Drop /. from path assert_equals: expected "non-spec://h//p" but got "non-spec:/.//p"
+FAIL <a>: Setting <non-spec:/.//p>.hostname = '' assert_equals: expected "non-spec:////p" but got "non-spec:/.//p"
+FAIL <area>: Setting <non-spec:/.//p>.hostname = '' assert_equals: expected "non-spec:////p" but got "non-spec:/.//p"
+PASS <a>: Setting <http://example.com/>.hostname = '///bad.com' Leading / is not stripped
+PASS <area>: Setting <http://example.com/>.hostname = '///bad.com' Leading / is not stripped
+FAIL <a>: Setting <sc://example.com/>.hostname = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <area>: Setting <sc://example.com/>.hostname = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+PASS <a>: Setting <http://example.net>.port = '8080'
+PASS <area>: Setting <http://example.net>.port = '8080'
+PASS <a>: Setting <http://example.net:8080>.port = '' Port number is removed if empty is the new value
+PASS <area>: Setting <http://example.net:8080>.port = '' Port number is removed if empty is the new value
+PASS <a>: Setting <http://example.net:8080>.port = '80' Default port number is removed
+PASS <area>: Setting <http://example.net:8080>.port = '80' Default port number is removed
+PASS <a>: Setting <https://example.net:4433>.port = '443' Default port number is removed
+PASS <area>: Setting <https://example.net:4433>.port = '443' Default port number is removed
+PASS <a>: Setting <https://example.net>.port = '80' Default port number is only removed for the relevant scheme
+PASS <area>: Setting <https://example.net>.port = '80' Default port number is only removed for the relevant scheme
+PASS <a>: Setting <http://example.net/path>.port = '8080/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.port = '8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.net:8080/path" but got "view-source+http://example.net/path"
+FAIL <area>: Setting <view-source+http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.net:8080/path" but got "view-source+http://example.net/path"
+PASS <a>: Setting <http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.port = '65535' Port numbers are 16 bit integers
+PASS <area>: Setting <http://example.net/path>.port = '65535' Port numbers are 16 bit integers
+FAIL <a>: Setting <http://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "http://example.net:8080/path" but got "http://example.net:0/path"
+FAIL <area>: Setting <http://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "http://example.net:8080/path" but got "http://example.net:0/path"
+FAIL <a>: Setting <non-special://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "example.net:8080" but got ""
+FAIL <area>: Setting <non-special://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "example.net:8080" but got ""
+PASS <a>: Setting <non-base:value>.port = '12'
+PASS <area>: Setting <non-base:value>.port = '12'
+PASS <a>: Setting <sc:///>.port = '12'
+PASS <area>: Setting <sc:///>.port = '12'
+FAIL <a>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+PASS <a>: Setting <data:original>.pathname = 'new value'
+PASS <area>: Setting <data:original>.pathname = 'new value'
+PASS <a>: Setting <sc:original>.pathname = 'new value'
+PASS <area>: Setting <sc:original>.pathname = 'new value'
+FAIL <a>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
+FAIL <area>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
+FAIL <a>: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
+FAIL <area>: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
+FAIL <a>: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
+FAIL <area>: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
+FAIL <a>: Setting <foo:/some/path>.pathname = 'test' Path-only URLs always have an initial slash assert_equals: expected "foo:/test" but got "foo:/some/path"
+FAIL <area>: Setting <foo:/some/path>.pathname = 'test' Path-only URLs always have an initial slash assert_equals: expected "foo:/test" but got "foo:/some/path"
+FAIL <a>: Setting <unix:/run/foo.socket?timeout=10>.pathname = '/var/log/../run/bar.socket' assert_equals: expected "unix:/var/run/bar.socket?timeout=10" but got "unix:/run/foo.socket?timeout=10"
+FAIL <area>: Setting <unix:/run/foo.socket?timeout=10>.pathname = '/var/log/../run/bar.socket' assert_equals: expected "unix:/var/run/bar.socket?timeout=10" but got "unix:/run/foo.socket?timeout=10"
+PASS <a>: Setting <https://example.net#nav>.pathname = 'home'
+PASS <area>: Setting <https://example.net#nav>.pathname = 'home'
+PASS <a>: Setting <https://example.net#nav>.pathname = '../home'
+PASS <area>: Setting <https://example.net#nav>.pathname = '../home'
+PASS <a>: Setting <http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is a segment delimiter for 'special' URLs
+PASS <area>: Setting <http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is a segment delimiter for 'special' URLs
+FAIL <a>: Setting <view-source+http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is *not* a segment delimiter for non-'special' URLs assert_equals: expected "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav" but got "view-source+http://example.net/home?lang=fr#nav"
+FAIL <area>: Setting <view-source+http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is *not* a segment delimiter for non-'special' URLs assert_equals: expected "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav" but got "view-source+http://example.net/home?lang=fr#nav"
+FAIL <a>: Setting <a:/>.pathname = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed. assert_equals: expected "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/"
+FAIL <area>: Setting <a:/>.pathname = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed. assert_equals: expected "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/"
+FAIL <a>: Setting <http://example.net>.pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, including %2E outside dotted segments. assert_equals: expected "http://example.net/%2e%2E%c3%89t%C3%A9" but got "http://example.net/..%c3%89t%C3%A9"
+FAIL <area>: Setting <http://example.net>.pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, including %2E outside dotted segments. assert_equals: expected "http://example.net/%2e%2E%c3%89t%C3%A9" but got "http://example.net/..%c3%89t%C3%A9"
+PASS <a>: Setting <http://example.net>.pathname = '?' ? needs to be encoded
+PASS <area>: Setting <http://example.net>.pathname = '?' ? needs to be encoded
+PASS <a>: Setting <http://example.net>.pathname = '#' # needs to be encoded
+PASS <area>: Setting <http://example.net>.pathname = '#' # needs to be encoded
+FAIL <a>: Setting <sc://example.net>.pathname = '?' ? needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%3F" but got "sc://example.net"
+FAIL <area>: Setting <sc://example.net>.pathname = '?' ? needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%3F" but got "sc://example.net"
+FAIL <a>: Setting <sc://example.net>.pathname = '#' # needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%23" but got "sc://example.net"
+FAIL <area>: Setting <sc://example.net>.pathname = '#' # needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%23" but got "sc://example.net"
+PASS <a>: Setting <http://example.net>.pathname = '/?é' ? doesn't mess up encoding
+PASS <area>: Setting <http://example.net>.pathname = '/?é' ? doesn't mess up encoding
+PASS <a>: Setting <http://example.net>.pathname = '/#é' # doesn't mess up encoding
+PASS <area>: Setting <http://example.net>.pathname = '/#é' # doesn't mess up encoding
+FAIL <a>: Setting <non-spec:/>.pathname = '/.//p' Serialize /. in path assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '/.//p' Serialize /. in path assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL <area>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL <a>: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020 assert_equals: expected "data:/space%20" but got "data:/nospace"
+FAIL <area>: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020 assert_equals: expected "data:/space%20" but got "data:/nospace"
+FAIL <a>: Setting <sc:/nospace>.pathname = 'space ' assert_equals: expected "sc:/space%20" but got "sc:/nospace"
+FAIL <area>: Setting <sc:/nospace>.pathname = 'space ' assert_equals: expected "sc:/space%20" but got "sc:/nospace"
+PASS <a>: Setting <https://example.net#nav>.search = 'lang=fr'
+PASS <area>: Setting <https://example.net#nav>.search = 'lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = '??lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = '??lang=fr'
+FAIL <a>: Setting <https://example.net?lang=en-US#nav>.search = '?' assert_equals: expected "https://example.net/?#nav" but got "https://example.net/#nav"
+FAIL <area>: Setting <https://example.net?lang=en-US#nav>.search = '?' assert_equals: expected "https://example.net/?#nav" but got "https://example.net/#nav"
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = ''
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = ''
+PASS <a>: Setting <https://example.net?lang=en-US>.search = ''
+PASS <area>: Setting <https://example.net?lang=en-US>.search = ''
+PASS <a>: Setting <https://example.net>.search = ''
+PASS <area>: Setting <https://example.net>.search = ''
+FAIL <a>: Setting <a:/>.search = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+FAIL <area>: Setting <a:/>.search = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+PASS <a>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <area>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <a>: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths
+PASS <area>: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths
+PASS <a>: Setting <sc:space ?query>.search = ''
+PASS <area>: Setting <sc:space ?query>.search = ''
+PASS <a>: Setting <data:space  ?query#fragment>.search = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <area>: Setting <data:space  ?query#fragment>.search = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <a>: Setting <sc:space  ?query#fragment>.search = ''
+PASS <area>: Setting <sc:space  ?query#fragment>.search = ''
+PASS <a>: Setting <https://example.net>.hash = 'main'
+PASS <area>: Setting <https://example.net>.hash = 'main'
+PASS <a>: Setting <https://example.net#nav>.hash = 'main'
+PASS <area>: Setting <https://example.net#nav>.hash = 'main'
+PASS <a>: Setting <https://example.net?lang=en-US>.hash = '##nav'
+PASS <area>: Setting <https://example.net?lang=en-US>.hash = '##nav'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = '#main'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = '#main'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = '#'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = '#'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = ''
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = ''
+PASS <a>: Setting <http://example.net>.hash = '#foo bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo"bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo"bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo<bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo<bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo>bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo>bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo`bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo`bar'
+PASS <a>: Setting <a:/>.hash = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' Simple percent-encoding; tabs and newlines are removed
+PASS <area>: Setting <a:/>.hash = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' Simple percent-encoding; tabs and newlines are removed
+PASS <a>: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <area>: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <a>: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <area>: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <a>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <area>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <a>: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths
+PASS <area>: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths
+PASS <a>: Setting <sc:space    #fragment>.hash = ''
+PASS <area>: Setting <sc:space    #fragment>.hash = ''
+PASS <a>: Setting <data:space  ?query#fragment>.hash = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <area>: Setting <data:space  ?query#fragment>.hash = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <a>: Setting <sc:space  ?query#fragment>.hash = ''
+PASS <area>: Setting <sc:space  ?query#fragment>.hash = ''
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/css/css-values/lh-rlh-on-root-001-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/css/css-values/lh-rlh-on-root-001-expected.txt
deleted file mode 100644
index 2ccfd9f..0000000
--- a/third_party/blink/web_tests/platform/mac/external/wpt/css/css-values/lh-rlh-on-root-001-expected.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-This is a testharness.js-based test.
-PASS lh in line-height on root
-FAIL rlh in line-height on root assert_approx_equals: the rlh unit on the root element's line-height property uses font metrics corresponding to the initial values of the font or line-height properties expected 18 +/- 1 but got 164
-PASS lh in font-size on root
-FAIL rlh in font-size on root assert_approx_equals: the rlh unit on the root element's font-size property uses font metrics corresponding to the initial values of the font or line-height properties expected 18 +/- 1 but got 16
-PASS 2lh in line-height on root
-FAIL 2rlh in line-height on root assert_approx_equals: the rlh unit on the root element's line-height property actually works as a unit and doesn't merely cause a fallback that doesn't take the number of units into account expected 36 +/- 1 but got 164
-PASS 2lh in font-size on root
-FAIL 2rlh in font-size on root assert_approx_equals: the rlh unit on the root element's font-size property actually works as a unit and doesn't merely cause a fallback that doesn't take the number of units into account expected 36 +/- 1 but got 16
-Harness: the test ran to completion.
-
diff --git "a/third_party/blink/web_tests/platform/mac/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/platform/mac/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt"
index 46eab6a..4b6701a6 100644
--- "a/third_party/blink/web_tests/platform/mac/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt"
+++ "b/third_party/blink/web_tests/platform/mac/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 186 tests; 116 PASS, 70 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 198 tests; 122 PASS, 76 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS URL: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
 PASS URL: Setting <a://example.net>.protocol = 'b'
@@ -144,6 +144,8 @@
 PASS URL: Setting <non-base:value>.port = '12'
 PASS URL: Setting <sc:///>.port = '12'
 FAIL URL: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+PASS URL: Setting <data:original>.pathname = 'new value'
+PASS URL: Setting <sc:original>.pathname = 'new value'
 FAIL URL: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
 FAIL URL: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
 FAIL URL: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
@@ -166,6 +168,8 @@
 FAIL URL: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
 FAIL URL: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
 FAIL URL: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL URL: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020 assert_equals: expected "data:/space%20" but got "data:/nospace"
+FAIL URL: Setting <sc:/nospace>.pathname = 'space ' assert_equals: expected "sc:/space%20" but got "sc:/nospace"
 PASS URL: Setting <https://example.net#nav>.search = 'lang=fr'
 PASS URL: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
 PASS URL: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
@@ -177,6 +181,10 @@
 FAIL URL: Setting <a:/>.search = '\0	
 \r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
 PASS URL: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+FAIL URL: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths assert_equals: expected "data:space" but got "data:space "
+FAIL URL: Setting <sc:space ?query>.search = '' assert_equals: expected "sc:space" but got "sc:space "
+PASS URL: Setting <data:space  ?query#fragment>.search = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS URL: Setting <sc:space  ?query#fragment>.search = ''
 PASS URL: Setting <https://example.net>.hash = 'main'
 PASS URL: Setting <https://example.net#nav>.hash = 'main'
 PASS URL: Setting <https://example.net?lang=en-US>.hash = '##nav'
@@ -193,5 +201,9 @@
 PASS URL: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
 PASS URL: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
 PASS URL: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+FAIL URL: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths assert_equals: expected "data:space" but got "data:space                                                                                                                                  "
+FAIL URL: Setting <sc:space    #fragment>.hash = '' assert_equals: expected "sc:space" but got "sc:space    "
+PASS URL: Setting <data:space  ?query#fragment>.hash = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS URL: Setting <sc:space  ?query#fragment>.hash = ''
 Harness: the test ran to completion.
 
diff --git "a/third_party/blink/web_tests/platform/mac/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/platform/mac/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt"
index 46eab6a..4b6701a6 100644
--- "a/third_party/blink/web_tests/platform/mac/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt"
+++ "b/third_party/blink/web_tests/platform/mac/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 186 tests; 116 PASS, 70 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 198 tests; 122 PASS, 76 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS URL: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
 PASS URL: Setting <a://example.net>.protocol = 'b'
@@ -144,6 +144,8 @@
 PASS URL: Setting <non-base:value>.port = '12'
 PASS URL: Setting <sc:///>.port = '12'
 FAIL URL: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+PASS URL: Setting <data:original>.pathname = 'new value'
+PASS URL: Setting <sc:original>.pathname = 'new value'
 FAIL URL: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
 FAIL URL: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
 FAIL URL: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
@@ -166,6 +168,8 @@
 FAIL URL: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
 FAIL URL: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
 FAIL URL: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL URL: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020 assert_equals: expected "data:/space%20" but got "data:/nospace"
+FAIL URL: Setting <sc:/nospace>.pathname = 'space ' assert_equals: expected "sc:/space%20" but got "sc:/nospace"
 PASS URL: Setting <https://example.net#nav>.search = 'lang=fr'
 PASS URL: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
 PASS URL: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
@@ -177,6 +181,10 @@
 FAIL URL: Setting <a:/>.search = '\0	
 \r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
 PASS URL: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+FAIL URL: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths assert_equals: expected "data:space" but got "data:space "
+FAIL URL: Setting <sc:space ?query>.search = '' assert_equals: expected "sc:space" but got "sc:space "
+PASS URL: Setting <data:space  ?query#fragment>.search = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS URL: Setting <sc:space  ?query#fragment>.search = ''
 PASS URL: Setting <https://example.net>.hash = 'main'
 PASS URL: Setting <https://example.net#nav>.hash = 'main'
 PASS URL: Setting <https://example.net?lang=en-US>.hash = '##nav'
@@ -193,5 +201,9 @@
 PASS URL: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
 PASS URL: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
 PASS URL: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+FAIL URL: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths assert_equals: expected "data:space" but got "data:space                                                                                                                                  "
+FAIL URL: Setting <sc:space    #fragment>.hash = '' assert_equals: expected "sc:space" but got "sc:space    "
+PASS URL: Setting <data:space  ?query#fragment>.hash = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS URL: Setting <sc:space  ?query#fragment>.hash = ''
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/outline/focus-layers-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/outline/focus-layers-expected.png
index fb8ca04..3ac5cdb 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/outline/focus-layers-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/outline/focus-layers-expected.png
Binary files differ
diff --git "a/third_party/blink/web_tests/platform/mac/virtual/idna-2008/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/platform/mac/virtual/idna-2008/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt"
new file mode 100644
index 0000000..46eab6a
--- /dev/null
+++ "b/third_party/blink/web_tests/platform/mac/virtual/idna-2008/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -0,0 +1,197 @@
+This is a testharness.js-based test.
+Found 186 tests; 116 PASS, 70 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS Loading data…
+PASS URL: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
+PASS URL: Setting <a://example.net>.protocol = 'b'
+PASS URL: Setting <a://example.net>.protocol = 'B' Upper-case ASCII is lower-cased
+PASS URL: Setting <a://example.net>.protocol = 'é' Non-ASCII is rejected
+PASS URL: Setting <a://example.net>.protocol = '0b' No leading digit
+PASS URL: Setting <a://example.net>.protocol = '+b' No leading punctuation
+PASS URL: Setting <a://example.net>.protocol = 'bC0+-.'
+PASS URL: Setting <a://example.net>.protocol = 'b,c' Only some punctuation is acceptable
+PASS URL: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected
+PASS URL: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file
+PASS URL: Setting <https://example.net:1234>.protocol = 'file'
+PASS URL: Setting <wss://x:x@example.net:1234>.protocol = 'file'
+FAIL URL: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "b://example.net/"
+FAIL URL: Setting <https://example.net>.protocol = 's' assert_equals: expected "https://example.net/" but got "s://example.net/"
+FAIL URL: Setting <ftp://example.net>.protocol = 'test' assert_equals: expected "ftp://example.net/" but got "test://example.net/"
+FAIL URL: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
+FAIL URL: Setting <ssh://me@example.net>.protocol = 'https' assert_equals: expected "ssh://me@example.net" but got "https://me@example.net/"
+FAIL URL: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
+FAIL URL: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
+FAIL URL: Setting <nonsense:///test>.protocol = 'https' assert_equals: expected "nonsense:///test" but got "https://test/"
+PASS URL: Setting <http://example.net>.protocol = 'https:foo : bar' Stuff after the first ':' is ignored
+PASS URL: Setting <data:text/html,<p>Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored
+PASS URL: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.
+PASS URL: Setting <unix:/run/foo.socket>.username = 'me' No host means no username
+PASS URL: Setting <http://example.net>.username = 'me'
+PASS URL: Setting <http://:secret@example.net>.username = 'me'
+PASS URL: Setting <http://me@example.net>.username = ''
+PASS URL: Setting <http://me:secret@example.net>.username = ''
+FAIL URL: Setting <http://example.net>.username = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS URL: Setting <http://example.net>.username = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS URL: Setting <sc:///>.username = 'x'
+PASS URL: Setting <unix:/run/foo.socket>.password = 'secret' No host means no password
+PASS URL: Setting <http://example.net>.password = 'secret'
+PASS URL: Setting <http://me@example.net>.password = 'secret'
+PASS URL: Setting <http://:secret@example.net>.password = ''
+PASS URL: Setting <http://me:secret@example.net>.password = ''
+FAIL URL: Setting <http://example.net>.password = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://:%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS URL: Setting <http://example.net>.password = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS URL: Setting <sc:///>.password = 'x'
+FAIL URL: Setting <sc://x/>.host = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.host = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = ' ' assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.host = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '@' assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.host = 'ß' assert_equals: expected "sc://%C3%9F/" but got "sc://x/"
+PASS URL: Setting <https://x/>.host = 'ß' IDNA Nontransitional_Processing
+PASS URL: Setting <data:text/plain,Stuff>.host = 'example.net' Cannot-be-a-base means no host
+PASS URL: Setting <http://example.net>.host = 'example.com:8080'
+PASS URL: Setting <http://example.net:8080>.host = 'example.com' Port number is unchanged if not specified in the new value
+PASS URL: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified
+PASS URL: Setting <http://example.net>.host = '' The empty host is not valid for special schemes
+FAIL URL: Setting <view-source+http://example.net/foo>.host = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL URL: Setting <a:/foo>.host = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+PASS URL: Setting <http://example.net>.host = '0x7F000001:8080' IPv4 address syntax is normalized
+PASS URL: Setting <http://example.net>.host = '[::0:01]:2' IPv6 address syntax is normalized
+PASS URL: Setting <http://example.net>.host = '[2001:db8::2]:4002' IPv6 literal address with port, crbug.com/1012416
+PASS URL: Setting <http://example.net>.host = 'example.com:80' Default port number is removed
+PASS URL: Setting <https://example.net>.host = 'example.com:443' Default port number is removed
+PASS URL: Setting <https://example.net>.host = 'example.com:80' Default port number is only removed for the relevant scheme
+PASS URL: Setting <http://example.net:8080>.host = 'example.com:80' Port number is removed if new port is scheme default and existing URL has a non-default port
+PASS URL: Setting <http://example.net/path>.host = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL URL: Setting <view-source+http://example.net/path>.host = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL URL: Setting <view-source+http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.com:8080/path" but got "view-source+http://example.net/path"
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS URL: Setting <http://example.net/path>.host = 'example.com:65535' Port numbers are 16 bit integers
+PASS URL: Setting <http://example.net/path>.host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.
+PASS URL: Setting <http://example.net/>.host = '[google.com]' Broken IPv6
+PASS URL: Setting <http://example.net/>.host = '[::1.2.3.4x]'
+FAIL URL: Setting <http://example.net/>.host = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL URL: Setting <http://example.net/>.host = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL URL: Setting <http://example.net/>.host = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL URL: Setting <sc://test@test/>.host = '' assert_equals: expected "test" but got ""
+FAIL URL: Setting <sc://test:12/>.host = '' assert_equals: expected "test:12" but got ""
+PASS URL: Setting <http://example.com/>.host = '///bad.com' Leading / is not stripped
+FAIL URL: Setting <sc://example.com/>.host = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL URL: Setting <sc://x/>.hostname = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.hostname = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = ' ' assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.hostname = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '@' assert_equals: expected "x" but got ""
+PASS URL: Setting <data:text/plain,Stuff>.hostname = 'example.net' Cannot-be-a-base means no host
+PASS URL: Setting <http://example.net:8080>.hostname = 'example.com'
+PASS URL: Setting <http://example.net>.hostname = '' The empty host is not valid for special schemes
+FAIL URL: Setting <view-source+http://example.net/foo>.hostname = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL URL: Setting <a:/foo>.hostname = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+PASS URL: Setting <http://example.net:8080>.hostname = '0x7F000001' IPv4 address syntax is normalized
+PASS URL: Setting <http://example.net>.hostname = '[::0:01]' IPv6 address syntax is normalized
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com:8080' : delimiter invalidates entire value
+PASS URL: Setting <http://example.net:8080/path>.hostname = 'example.com:' : delimiter invalidates entire value
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL URL: Setting <view-source+http://example.net/path>.hostname = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+PASS URL: Setting <http://example.net/>.hostname = '[google.com]' Broken IPv6
+PASS URL: Setting <http://example.net/>.hostname = '[::1.2.3.4x]'
+FAIL URL: Setting <http://example.net/>.hostname = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL URL: Setting <http://example.net/>.hostname = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL URL: Setting <http://example.net/>.hostname = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL URL: Setting <sc://test@test/>.hostname = '' assert_equals: expected "test" but got ""
+FAIL URL: Setting <sc://test:12/>.hostname = '' assert_equals: expected "test:12" but got ""
+FAIL URL: Setting <non-spec:/.//p>.hostname = 'h' Drop /. from path assert_equals: expected "non-spec://h//p" but got "non-spec:/.//p"
+FAIL URL: Setting <non-spec:/.//p>.hostname = '' assert_equals: expected "non-spec:////p" but got "non-spec:/.//p"
+PASS URL: Setting <http://example.com/>.hostname = '///bad.com' Leading / is not stripped
+FAIL URL: Setting <sc://example.com/>.hostname = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+PASS URL: Setting <http://example.net>.port = '8080'
+PASS URL: Setting <http://example.net:8080>.port = '' Port number is removed if empty is the new value
+PASS URL: Setting <http://example.net:8080>.port = '80' Default port number is removed
+PASS URL: Setting <https://example.net:4433>.port = '443' Default port number is removed
+PASS URL: Setting <https://example.net>.port = '80' Default port number is only removed for the relevant scheme
+PASS URL: Setting <http://example.net/path>.port = '8080/stuff' Stuff after a / delimiter is ignored
+PASS URL: Setting <http://example.net/path>.port = '8080?stuff' Stuff after a ? delimiter is ignored
+PASS URL: Setting <http://example.net/path>.port = '8080#stuff' Stuff after a # delimiter is ignored
+PASS URL: Setting <http://example.net/path>.port = '8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL URL: Setting <view-source+http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.net:8080/path" but got "view-source+http://example.net/path"
+PASS URL: Setting <http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS URL: Setting <http://example.net/path>.port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS URL: Setting <http://example.net/path>.port = '65535' Port numbers are 16 bit integers
+FAIL URL: Setting <http://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "http://example.net:8080/path" but got "http://example.net:0/path"
+FAIL URL: Setting <non-special://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "example.net:8080" but got ""
+PASS URL: Setting <non-base:value>.port = '12'
+PASS URL: Setting <sc:///>.port = '12'
+FAIL URL: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+FAIL URL: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
+FAIL URL: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
+FAIL URL: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
+FAIL URL: Setting <foo:/some/path>.pathname = 'test' Path-only URLs always have an initial slash assert_equals: expected "foo:/test" but got "foo:/some/path"
+FAIL URL: Setting <unix:/run/foo.socket?timeout=10>.pathname = '/var/log/../run/bar.socket' assert_equals: expected "unix:/var/run/bar.socket?timeout=10" but got "unix:/run/foo.socket?timeout=10"
+PASS URL: Setting <https://example.net#nav>.pathname = 'home'
+PASS URL: Setting <https://example.net#nav>.pathname = '../home'
+PASS URL: Setting <http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is a segment delimiter for 'special' URLs
+FAIL URL: Setting <view-source+http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is *not* a segment delimiter for non-'special' URLs assert_equals: expected "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav" but got "view-source+http://example.net/home?lang=fr#nav"
+FAIL URL: Setting <a:/>.pathname = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed. assert_equals: expected "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/"
+FAIL URL: Setting <http://example.net>.pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, including %2E outside dotted segments. assert_equals: expected "http://example.net/%2e%2E%c3%89t%C3%A9" but got "http://example.net/..%c3%89t%C3%A9"
+PASS URL: Setting <http://example.net>.pathname = '?' ? needs to be encoded
+PASS URL: Setting <http://example.net>.pathname = '#' # needs to be encoded
+FAIL URL: Setting <sc://example.net>.pathname = '?' ? needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%3F" but got "sc://example.net"
+FAIL URL: Setting <sc://example.net>.pathname = '#' # needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%23" but got "sc://example.net"
+PASS URL: Setting <http://example.net>.pathname = '/?é' ? doesn't mess up encoding
+PASS URL: Setting <http://example.net>.pathname = '/#é' # doesn't mess up encoding
+FAIL URL: Setting <non-spec:/>.pathname = '/.//p' Serialize /. in path assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL URL: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL URL: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL URL: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+PASS URL: Setting <https://example.net#nav>.search = 'lang=fr'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.search = '??lang=fr'
+FAIL URL: Setting <https://example.net?lang=en-US#nav>.search = '?' assert_equals: expected "https://example.net/?#nav" but got "https://example.net/#nav"
+PASS URL: Setting <https://example.net?lang=en-US#nav>.search = ''
+PASS URL: Setting <https://example.net?lang=en-US>.search = ''
+PASS URL: Setting <https://example.net>.search = ''
+FAIL URL: Setting <a:/>.search = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+PASS URL: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS URL: Setting <https://example.net>.hash = 'main'
+PASS URL: Setting <https://example.net#nav>.hash = 'main'
+PASS URL: Setting <https://example.net?lang=en-US>.hash = '##nav'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.hash = '#main'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.hash = '#'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.hash = ''
+PASS URL: Setting <http://example.net>.hash = '#foo bar'
+PASS URL: Setting <http://example.net>.hash = '#foo"bar'
+PASS URL: Setting <http://example.net>.hash = '#foo<bar'
+PASS URL: Setting <http://example.net>.hash = '#foo>bar'
+PASS URL: Setting <http://example.net>.hash = '#foo`bar'
+PASS URL: Setting <a:/>.hash = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' Simple percent-encoding; tabs and newlines are removed
+PASS URL: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS URL: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS URL: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+Harness: the test ran to completion.
+
diff --git "a/third_party/blink/web_tests/platform/mac/virtual/idna-2008/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/platform/mac/virtual/idna-2008/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt"
new file mode 100644
index 0000000..46eab6a
--- /dev/null
+++ "b/third_party/blink/web_tests/platform/mac/virtual/idna-2008/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -0,0 +1,197 @@
+This is a testharness.js-based test.
+Found 186 tests; 116 PASS, 70 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS Loading data…
+PASS URL: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.
+PASS URL: Setting <a://example.net>.protocol = 'b'
+PASS URL: Setting <a://example.net>.protocol = 'B' Upper-case ASCII is lower-cased
+PASS URL: Setting <a://example.net>.protocol = 'é' Non-ASCII is rejected
+PASS URL: Setting <a://example.net>.protocol = '0b' No leading digit
+PASS URL: Setting <a://example.net>.protocol = '+b' No leading punctuation
+PASS URL: Setting <a://example.net>.protocol = 'bC0+-.'
+PASS URL: Setting <a://example.net>.protocol = 'b,c' Only some punctuation is acceptable
+PASS URL: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected
+PASS URL: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file
+PASS URL: Setting <https://example.net:1234>.protocol = 'file'
+PASS URL: Setting <wss://x:x@example.net:1234>.protocol = 'file'
+FAIL URL: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "b://example.net/"
+FAIL URL: Setting <https://example.net>.protocol = 's' assert_equals: expected "https://example.net/" but got "s://example.net/"
+FAIL URL: Setting <ftp://example.net>.protocol = 'test' assert_equals: expected "ftp://example.net/" but got "test://example.net/"
+FAIL URL: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
+FAIL URL: Setting <ssh://me@example.net>.protocol = 'https' assert_equals: expected "ssh://me@example.net" but got "https://me@example.net/"
+FAIL URL: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
+FAIL URL: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
+FAIL URL: Setting <nonsense:///test>.protocol = 'https' assert_equals: expected "nonsense:///test" but got "https://test/"
+PASS URL: Setting <http://example.net>.protocol = 'https:foo : bar' Stuff after the first ':' is ignored
+PASS URL: Setting <data:text/html,<p>Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored
+PASS URL: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.
+PASS URL: Setting <unix:/run/foo.socket>.username = 'me' No host means no username
+PASS URL: Setting <http://example.net>.username = 'me'
+PASS URL: Setting <http://:secret@example.net>.username = 'me'
+PASS URL: Setting <http://me@example.net>.username = ''
+PASS URL: Setting <http://me:secret@example.net>.username = ''
+FAIL URL: Setting <http://example.net>.username = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS URL: Setting <http://example.net>.username = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS URL: Setting <sc:///>.username = 'x'
+PASS URL: Setting <unix:/run/foo.socket>.password = 'secret' No host means no password
+PASS URL: Setting <http://example.net>.password = 'secret'
+PASS URL: Setting <http://me@example.net>.password = 'secret'
+PASS URL: Setting <http://:secret@example.net>.password = ''
+PASS URL: Setting <http://me:secret@example.net>.password = ''
+FAIL URL: Setting <http://example.net>.password = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://:%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS URL: Setting <http://example.net>.password = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS URL: Setting <sc:///>.password = 'x'
+FAIL URL: Setting <sc://x/>.host = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.host = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = ' ' assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.host = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '@' assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.host = 'ß' assert_equals: expected "sc://%C3%9F/" but got "sc://x/"
+PASS URL: Setting <https://x/>.host = 'ß' IDNA Nontransitional_Processing
+PASS URL: Setting <data:text/plain,Stuff>.host = 'example.net' Cannot-be-a-base means no host
+PASS URL: Setting <http://example.net>.host = 'example.com:8080'
+PASS URL: Setting <http://example.net:8080>.host = 'example.com' Port number is unchanged if not specified in the new value
+PASS URL: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified
+PASS URL: Setting <http://example.net>.host = '' The empty host is not valid for special schemes
+FAIL URL: Setting <view-source+http://example.net/foo>.host = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL URL: Setting <a:/foo>.host = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+PASS URL: Setting <http://example.net>.host = '0x7F000001:8080' IPv4 address syntax is normalized
+PASS URL: Setting <http://example.net>.host = '[::0:01]:2' IPv6 address syntax is normalized
+PASS URL: Setting <http://example.net>.host = '[2001:db8::2]:4002' IPv6 literal address with port, crbug.com/1012416
+PASS URL: Setting <http://example.net>.host = 'example.com:80' Default port number is removed
+PASS URL: Setting <https://example.net>.host = 'example.com:443' Default port number is removed
+PASS URL: Setting <https://example.net>.host = 'example.com:80' Default port number is only removed for the relevant scheme
+PASS URL: Setting <http://example.net:8080>.host = 'example.com:80' Port number is removed if new port is scheme default and existing URL has a non-default port
+PASS URL: Setting <http://example.net/path>.host = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL URL: Setting <view-source+http://example.net/path>.host = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL URL: Setting <view-source+http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.com:8080/path" but got "view-source+http://example.net/path"
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS URL: Setting <http://example.net/path>.host = 'example.com:65535' Port numbers are 16 bit integers
+PASS URL: Setting <http://example.net/path>.host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.
+PASS URL: Setting <http://example.net/>.host = '[google.com]' Broken IPv6
+PASS URL: Setting <http://example.net/>.host = '[::1.2.3.4x]'
+FAIL URL: Setting <http://example.net/>.host = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL URL: Setting <http://example.net/>.host = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL URL: Setting <http://example.net/>.host = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL URL: Setting <sc://test@test/>.host = '' assert_equals: expected "test" but got ""
+FAIL URL: Setting <sc://test:12/>.host = '' assert_equals: expected "test:12" but got ""
+PASS URL: Setting <http://example.com/>.host = '///bad.com' Leading / is not stripped
+FAIL URL: Setting <sc://example.com/>.host = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL URL: Setting <sc://x/>.hostname = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.hostname = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = ' ' assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.hostname = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '@' assert_equals: expected "x" but got ""
+PASS URL: Setting <data:text/plain,Stuff>.hostname = 'example.net' Cannot-be-a-base means no host
+PASS URL: Setting <http://example.net:8080>.hostname = 'example.com'
+PASS URL: Setting <http://example.net>.hostname = '' The empty host is not valid for special schemes
+FAIL URL: Setting <view-source+http://example.net/foo>.hostname = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL URL: Setting <a:/foo>.hostname = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "a:/foo"
+PASS URL: Setting <http://example.net:8080>.hostname = '0x7F000001' IPv4 address syntax is normalized
+PASS URL: Setting <http://example.net>.hostname = '[::0:01]' IPv6 address syntax is normalized
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com:8080' : delimiter invalidates entire value
+PASS URL: Setting <http://example.net:8080/path>.hostname = 'example.com:' : delimiter invalidates entire value
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL URL: Setting <view-source+http://example.net/path>.hostname = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+PASS URL: Setting <http://example.net/>.hostname = '[google.com]' Broken IPv6
+PASS URL: Setting <http://example.net/>.hostname = '[::1.2.3.4x]'
+FAIL URL: Setting <http://example.net/>.hostname = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL URL: Setting <http://example.net/>.hostname = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL URL: Setting <http://example.net/>.hostname = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL URL: Setting <sc://test@test/>.hostname = '' assert_equals: expected "test" but got ""
+FAIL URL: Setting <sc://test:12/>.hostname = '' assert_equals: expected "test:12" but got ""
+FAIL URL: Setting <non-spec:/.//p>.hostname = 'h' Drop /. from path assert_equals: expected "non-spec://h//p" but got "non-spec:/.//p"
+FAIL URL: Setting <non-spec:/.//p>.hostname = '' assert_equals: expected "non-spec:////p" but got "non-spec:/.//p"
+PASS URL: Setting <http://example.com/>.hostname = '///bad.com' Leading / is not stripped
+FAIL URL: Setting <sc://example.com/>.hostname = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+PASS URL: Setting <http://example.net>.port = '8080'
+PASS URL: Setting <http://example.net:8080>.port = '' Port number is removed if empty is the new value
+PASS URL: Setting <http://example.net:8080>.port = '80' Default port number is removed
+PASS URL: Setting <https://example.net:4433>.port = '443' Default port number is removed
+PASS URL: Setting <https://example.net>.port = '80' Default port number is only removed for the relevant scheme
+PASS URL: Setting <http://example.net/path>.port = '8080/stuff' Stuff after a / delimiter is ignored
+PASS URL: Setting <http://example.net/path>.port = '8080?stuff' Stuff after a ? delimiter is ignored
+PASS URL: Setting <http://example.net/path>.port = '8080#stuff' Stuff after a # delimiter is ignored
+PASS URL: Setting <http://example.net/path>.port = '8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL URL: Setting <view-source+http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.net:8080/path" but got "view-source+http://example.net/path"
+PASS URL: Setting <http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS URL: Setting <http://example.net/path>.port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS URL: Setting <http://example.net/path>.port = '65535' Port numbers are 16 bit integers
+FAIL URL: Setting <http://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "http://example.net:8080/path" but got "http://example.net:0/path"
+FAIL URL: Setting <non-special://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "example.net:8080" but got ""
+PASS URL: Setting <non-base:value>.port = '12'
+PASS URL: Setting <sc:///>.port = '12'
+FAIL URL: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+FAIL URL: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
+FAIL URL: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
+FAIL URL: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
+FAIL URL: Setting <foo:/some/path>.pathname = 'test' Path-only URLs always have an initial slash assert_equals: expected "foo:/test" but got "foo:/some/path"
+FAIL URL: Setting <unix:/run/foo.socket?timeout=10>.pathname = '/var/log/../run/bar.socket' assert_equals: expected "unix:/var/run/bar.socket?timeout=10" but got "unix:/run/foo.socket?timeout=10"
+PASS URL: Setting <https://example.net#nav>.pathname = 'home'
+PASS URL: Setting <https://example.net#nav>.pathname = '../home'
+PASS URL: Setting <http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is a segment delimiter for 'special' URLs
+FAIL URL: Setting <view-source+http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is *not* a segment delimiter for non-'special' URLs assert_equals: expected "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav" but got "view-source+http://example.net/home?lang=fr#nav"
+FAIL URL: Setting <a:/>.pathname = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed. assert_equals: expected "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/"
+FAIL URL: Setting <http://example.net>.pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, including %2E outside dotted segments. assert_equals: expected "http://example.net/%2e%2E%c3%89t%C3%A9" but got "http://example.net/..%c3%89t%C3%A9"
+PASS URL: Setting <http://example.net>.pathname = '?' ? needs to be encoded
+PASS URL: Setting <http://example.net>.pathname = '#' # needs to be encoded
+FAIL URL: Setting <sc://example.net>.pathname = '?' ? needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%3F" but got "sc://example.net"
+FAIL URL: Setting <sc://example.net>.pathname = '#' # needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%23" but got "sc://example.net"
+PASS URL: Setting <http://example.net>.pathname = '/?é' ? doesn't mess up encoding
+PASS URL: Setting <http://example.net>.pathname = '/#é' # doesn't mess up encoding
+FAIL URL: Setting <non-spec:/>.pathname = '/.//p' Serialize /. in path assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL URL: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL URL: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL URL: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+PASS URL: Setting <https://example.net#nav>.search = 'lang=fr'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.search = '??lang=fr'
+FAIL URL: Setting <https://example.net?lang=en-US#nav>.search = '?' assert_equals: expected "https://example.net/?#nav" but got "https://example.net/#nav"
+PASS URL: Setting <https://example.net?lang=en-US#nav>.search = ''
+PASS URL: Setting <https://example.net?lang=en-US>.search = ''
+PASS URL: Setting <https://example.net>.search = ''
+FAIL URL: Setting <a:/>.search = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+PASS URL: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS URL: Setting <https://example.net>.hash = 'main'
+PASS URL: Setting <https://example.net#nav>.hash = 'main'
+PASS URL: Setting <https://example.net?lang=en-US>.hash = '##nav'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.hash = '#main'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.hash = '#'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.hash = ''
+PASS URL: Setting <http://example.net>.hash = '#foo bar'
+PASS URL: Setting <http://example.net>.hash = '#foo"bar'
+PASS URL: Setting <http://example.net>.hash = '#foo<bar'
+PASS URL: Setting <http://example.net>.hash = '#foo>bar'
+PASS URL: Setting <http://example.net>.hash = '#foo`bar'
+PASS URL: Setting <a:/>.hash = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' Simple percent-encoding; tabs and newlines are removed
+PASS URL: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS URL: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS URL: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/css/css-values/lh-rlh-on-root-001-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/css/css-values/lh-rlh-on-root-001-expected.txt
deleted file mode 100644
index 1a2135c..0000000
--- a/third_party/blink/web_tests/platform/win/external/wpt/css/css-values/lh-rlh-on-root-001-expected.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-This is a testharness.js-based test.
-PASS lh in line-height on root
-FAIL rlh in line-height on root assert_approx_equals: the rlh unit on the root element's line-height property uses font metrics corresponding to the initial values of the font or line-height properties expected 20 +/- 1 but got 166
-PASS lh in font-size on root
-FAIL rlh in font-size on root assert_approx_equals: the rlh unit on the root element's font-size property uses font metrics corresponding to the initial values of the font or line-height properties expected 20 +/- 1 but got 16
-PASS 2lh in line-height on root
-FAIL 2rlh in line-height on root assert_approx_equals: the rlh unit on the root element's line-height property actually works as a unit and doesn't merely cause a fallback that doesn't take the number of units into account expected 40 +/- 1 but got 166
-PASS 2lh in font-size on root
-FAIL 2rlh in font-size on root assert_approx_equals: the rlh unit on the root element's font-size property actually works as a unit and doesn't merely cause a fallback that doesn't take the number of units into account expected 40 +/- 1 but got 16
-Harness: the test ran to completion.
-
diff --git "a/third_party/blink/web_tests/platform/win/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/platform/win/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
index 95e8a39..899d274 100644
--- "a/third_party/blink/web_tests/platform/win/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
+++ "b/third_party/blink/web_tests/platform/win/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 371 tests; 211 PASS, 160 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 395 tests; 231 PASS, 164 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 FAIL <a>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged. assert_equals: expected "a://example.net" but got "file:///A://example.net"
 FAIL <area>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged. assert_equals: expected "a://example.net" but got "file:///A://example.net"
@@ -287,6 +287,10 @@
 PASS <area>: Setting <sc:///>.port = '12'
 FAIL <a>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
 FAIL <area>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+PASS <a>: Setting <data:original>.pathname = 'new value'
+PASS <area>: Setting <data:original>.pathname = 'new value'
+PASS <a>: Setting <sc:original>.pathname = 'new value'
+PASS <area>: Setting <sc:original>.pathname = 'new value'
 FAIL <a>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
 FAIL <area>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
 FAIL <a>: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
@@ -331,6 +335,10 @@
 FAIL <area>: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
 FAIL <a>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
 FAIL <area>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL <a>: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020 assert_equals: expected "data:/space%20" but got "data:/nospace"
+FAIL <area>: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020 assert_equals: expected "data:/space%20" but got "data:/nospace"
+FAIL <a>: Setting <sc:/nospace>.pathname = 'space ' assert_equals: expected "sc:/space%20" but got "sc:/nospace"
+FAIL <area>: Setting <sc:/nospace>.pathname = 'space ' assert_equals: expected "sc:/space%20" but got "sc:/nospace"
 PASS <a>: Setting <https://example.net#nav>.search = 'lang=fr'
 PASS <area>: Setting <https://example.net#nav>.search = 'lang=fr'
 PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
@@ -353,6 +361,14 @@
 \r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "file:///A:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
 PASS <a>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
 PASS <area>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <a>: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths
+PASS <area>: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths
+PASS <a>: Setting <sc:space ?query>.search = ''
+PASS <area>: Setting <sc:space ?query>.search = ''
+PASS <a>: Setting <data:space  ?query#fragment>.search = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <area>: Setting <data:space  ?query#fragment>.search = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <a>: Setting <sc:space  ?query#fragment>.search = ''
+PASS <area>: Setting <sc:space  ?query#fragment>.search = ''
 PASS <a>: Setting <https://example.net>.hash = 'main'
 PASS <area>: Setting <https://example.net>.hash = 'main'
 PASS <a>: Setting <https://example.net#nav>.hash = 'main'
@@ -385,5 +401,13 @@
 PASS <area>: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
 PASS <a>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
 PASS <area>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <a>: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths
+PASS <area>: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths
+PASS <a>: Setting <sc:space    #fragment>.hash = ''
+PASS <area>: Setting <sc:space    #fragment>.hash = ''
+PASS <a>: Setting <data:space  ?query#fragment>.hash = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <area>: Setting <data:space  ?query#fragment>.hash = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS <a>: Setting <sc:space  ?query#fragment>.hash = ''
+PASS <area>: Setting <sc:space  ?query#fragment>.hash = ''
 Harness: the test ran to completion.
 
diff --git "a/third_party/blink/web_tests/platform/win/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/platform/win/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt"
index e16696b..e299f86 100644
--- "a/third_party/blink/web_tests/platform/win/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt"
+++ "b/third_party/blink/web_tests/platform/win/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 186 tests; 106 PASS, 80 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 198 tests; 112 PASS, 86 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 FAIL URL: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged. assert_equals: expected "a://example.net" but got "file:///A://example.net"
 FAIL URL: Setting <a://example.net>.protocol = 'b' assert_equals: expected "b://example.net" but got "file:///B:///A://example.net"
@@ -144,6 +144,8 @@
 PASS URL: Setting <non-base:value>.port = '12'
 PASS URL: Setting <sc:///>.port = '12'
 FAIL URL: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+PASS URL: Setting <data:original>.pathname = 'new value'
+PASS URL: Setting <sc:original>.pathname = 'new value'
 FAIL URL: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
 FAIL URL: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
 FAIL URL: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
@@ -166,6 +168,8 @@
 FAIL URL: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
 FAIL URL: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
 FAIL URL: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL URL: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020 assert_equals: expected "data:/space%20" but got "data:/nospace"
+FAIL URL: Setting <sc:/nospace>.pathname = 'space ' assert_equals: expected "sc:/space%20" but got "sc:/nospace"
 PASS URL: Setting <https://example.net#nav>.search = 'lang=fr'
 PASS URL: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
 PASS URL: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
@@ -177,6 +181,10 @@
 FAIL URL: Setting <a:/>.search = '\0	
 \r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "file:///A:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
 PASS URL: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+FAIL URL: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths assert_equals: expected "data:space" but got "data:space "
+FAIL URL: Setting <sc:space ?query>.search = '' assert_equals: expected "sc:space" but got "sc:space "
+PASS URL: Setting <data:space  ?query#fragment>.search = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS URL: Setting <sc:space  ?query#fragment>.search = ''
 PASS URL: Setting <https://example.net>.hash = 'main'
 PASS URL: Setting <https://example.net#nav>.hash = 'main'
 PASS URL: Setting <https://example.net?lang=en-US>.hash = '##nav'
@@ -193,5 +201,9 @@
 PASS URL: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
 PASS URL: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
 PASS URL: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+FAIL URL: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths assert_equals: expected "data:space" but got "data:space                                                                                                                                  "
+FAIL URL: Setting <sc:space    #fragment>.hash = '' assert_equals: expected "sc:space" but got "sc:space    "
+PASS URL: Setting <data:space  ?query#fragment>.hash = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS URL: Setting <sc:space  ?query#fragment>.hash = ''
 Harness: the test ran to completion.
 
diff --git "a/third_party/blink/web_tests/platform/win/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/platform/win/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt"
index e16696b..e299f86 100644
--- "a/third_party/blink/web_tests/platform/win/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt"
+++ "b/third_party/blink/web_tests/platform/win/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 186 tests; 106 PASS, 80 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 198 tests; 112 PASS, 86 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 FAIL URL: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged. assert_equals: expected "a://example.net" but got "file:///A://example.net"
 FAIL URL: Setting <a://example.net>.protocol = 'b' assert_equals: expected "b://example.net" but got "file:///B:///A://example.net"
@@ -144,6 +144,8 @@
 PASS URL: Setting <non-base:value>.port = '12'
 PASS URL: Setting <sc:///>.port = '12'
 FAIL URL: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+PASS URL: Setting <data:original>.pathname = 'new value'
+PASS URL: Setting <sc:original>.pathname = 'new value'
 FAIL URL: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
 FAIL URL: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
 FAIL URL: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
@@ -166,6 +168,8 @@
 FAIL URL: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
 FAIL URL: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
 FAIL URL: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL URL: Setting <data:/nospace>.pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020 assert_equals: expected "data:/space%20" but got "data:/nospace"
+FAIL URL: Setting <sc:/nospace>.pathname = 'space ' assert_equals: expected "sc:/space%20" but got "sc:/nospace"
 PASS URL: Setting <https://example.net#nav>.search = 'lang=fr'
 PASS URL: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
 PASS URL: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
@@ -177,6 +181,10 @@
 FAIL URL: Setting <a:/>.search = '\0	
 \r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "file:///A:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
 PASS URL: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+FAIL URL: Setting <data:space ?query>.search = '' Drop trailing spaces from trailing opaque paths assert_equals: expected "data:space" but got "data:space "
+FAIL URL: Setting <sc:space ?query>.search = '' assert_equals: expected "sc:space" but got "sc:space "
+PASS URL: Setting <data:space  ?query#fragment>.search = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS URL: Setting <sc:space  ?query#fragment>.search = ''
 PASS URL: Setting <https://example.net>.hash = 'main'
 PASS URL: Setting <https://example.net#nav>.hash = 'main'
 PASS URL: Setting <https://example.net?lang=en-US>.hash = '##nav'
@@ -193,5 +201,9 @@
 PASS URL: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
 PASS URL: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
 PASS URL: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+FAIL URL: Setting <data:space                                                                                                                                  #fragment>.hash = '' Drop trailing spaces from trailing opaque paths assert_equals: expected "data:space" but got "data:space                                                                                                                                  "
+FAIL URL: Setting <sc:space    #fragment>.hash = '' assert_equals: expected "sc:space" but got "sc:space    "
+PASS URL: Setting <data:space  ?query#fragment>.hash = '' Do not drop trailing spaces from non-trailing opaque paths
+PASS URL: Setting <sc:space  ?query#fragment>.hash = ''
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/outline/focus-layers-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/outline/focus-layers-expected.png
index db9099b..07c01fa8 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/outline/focus-layers-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/outline/focus-layers-expected.png
Binary files differ
diff --git "a/third_party/blink/web_tests/platform/win/virtual/idna-2008/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/platform/win/virtual/idna-2008/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
new file mode 100644
index 0000000..95e8a39
--- /dev/null
+++ "b/third_party/blink/web_tests/platform/win/virtual/idna-2008/external/wpt/url/url-setters-a-area.window_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -0,0 +1,389 @@
+This is a testharness.js-based test.
+Found 371 tests; 211 PASS, 160 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS Loading data…
+FAIL <a>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged. assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL <area>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged. assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL <a>: Setting <a://example.net>.protocol = 'b' assert_equals: expected "b://example.net" but got "file:///B:///A://example.net"
+FAIL <area>: Setting <a://example.net>.protocol = 'b' assert_equals: expected "b://example.net" but got "file:///B:///A://example.net"
+FAIL <a>: Setting <a://example.net>.protocol = 'B' Upper-case ASCII is lower-cased assert_equals: expected "b://example.net" but got "file:///B:///A://example.net"
+FAIL <area>: Setting <a://example.net>.protocol = 'B' Upper-case ASCII is lower-cased assert_equals: expected "b://example.net" but got "file:///B:///A://example.net"
+FAIL <a>: Setting <a://example.net>.protocol = 'é' Non-ASCII is rejected assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL <area>: Setting <a://example.net>.protocol = 'é' Non-ASCII is rejected assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL <a>: Setting <a://example.net>.protocol = '0b' No leading digit assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL <area>: Setting <a://example.net>.protocol = '0b' No leading digit assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL <a>: Setting <a://example.net>.protocol = '+b' No leading punctuation assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL <area>: Setting <a://example.net>.protocol = '+b' No leading punctuation assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL <a>: Setting <a://example.net>.protocol = 'bC0+-.' assert_equals: expected "bc0+-.://example.net" but got "bc0+-.:///A://example.net"
+FAIL <area>: Setting <a://example.net>.protocol = 'bC0+-.' assert_equals: expected "bc0+-.://example.net" but got "bc0+-.:///A://example.net"
+FAIL <a>: Setting <a://example.net>.protocol = 'b,c' Only some punctuation is acceptable assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL <area>: Setting <a://example.net>.protocol = 'b,c' Only some punctuation is acceptable assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL <a>: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL <area>: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected assert_equals: expected "a://example.net" but got "file:///A://example.net"
+PASS <a>: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file
+PASS <area>: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file
+PASS <a>: Setting <https://example.net:1234>.protocol = 'file'
+PASS <area>: Setting <https://example.net:1234>.protocol = 'file'
+PASS <a>: Setting <wss://x:x@example.net:1234>.protocol = 'file'
+PASS <area>: Setting <wss://x:x@example.net:1234>.protocol = 'file'
+FAIL <a>: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "file:///B://example.net/"
+FAIL <area>: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "file:///B://example.net/"
+FAIL <a>: Setting <https://example.net>.protocol = 's' assert_equals: expected "https://example.net/" but got "file:///S://example.net/"
+FAIL <area>: Setting <https://example.net>.protocol = 's' assert_equals: expected "https://example.net/" but got "file:///S://example.net/"
+FAIL <a>: Setting <ftp://example.net>.protocol = 'test' assert_equals: expected "ftp://example.net/" but got "test://example.net/"
+FAIL <area>: Setting <ftp://example.net>.protocol = 'test' assert_equals: expected "ftp://example.net/" but got "test://example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'https' assert_equals: expected "ssh://me@example.net" but got "https://me@example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'https' assert_equals: expected "ssh://me@example.net" but got "https://me@example.net/"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
+FAIL <a>: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
+FAIL <area>: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
+FAIL <a>: Setting <nonsense:///test>.protocol = 'https' assert_equals: expected "nonsense:///test" but got "https://test/"
+FAIL <area>: Setting <nonsense:///test>.protocol = 'https' assert_equals: expected "nonsense:///test" but got "https://test/"
+PASS <a>: Setting <http://example.net>.protocol = 'https:foo : bar' Stuff after the first ':' is ignored
+PASS <area>: Setting <http://example.net>.protocol = 'https:foo : bar' Stuff after the first ':' is ignored
+PASS <a>: Setting <data:text/html,<p>Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored
+PASS <area>: Setting <data:text/html,<p>Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored
+PASS <a>: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.
+PASS <area>: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.
+PASS <a>: Setting <unix:/run/foo.socket>.username = 'me' No host means no username
+PASS <area>: Setting <unix:/run/foo.socket>.username = 'me' No host means no username
+PASS <a>: Setting <http://example.net>.username = 'me'
+PASS <area>: Setting <http://example.net>.username = 'me'
+PASS <a>: Setting <http://:secret@example.net>.username = 'me'
+PASS <area>: Setting <http://:secret@example.net>.username = 'me'
+PASS <a>: Setting <http://me@example.net>.username = ''
+PASS <area>: Setting <http://me@example.net>.username = ''
+PASS <a>: Setting <http://me:secret@example.net>.username = ''
+PASS <area>: Setting <http://me:secret@example.net>.username = ''
+FAIL <a>: Setting <http://example.net>.username = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+FAIL <area>: Setting <http://example.net>.username = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS <a>: Setting <http://example.net>.username = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <area>: Setting <http://example.net>.username = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <a>: Setting <sc:///>.username = 'x'
+PASS <area>: Setting <sc:///>.username = 'x'
+PASS <a>: Setting <unix:/run/foo.socket>.password = 'secret' No host means no password
+PASS <area>: Setting <unix:/run/foo.socket>.password = 'secret' No host means no password
+PASS <a>: Setting <http://example.net>.password = 'secret'
+PASS <area>: Setting <http://example.net>.password = 'secret'
+PASS <a>: Setting <http://me@example.net>.password = 'secret'
+PASS <area>: Setting <http://me@example.net>.password = 'secret'
+PASS <a>: Setting <http://:secret@example.net>.password = ''
+PASS <area>: Setting <http://:secret@example.net>.password = ''
+PASS <a>: Setting <http://me:secret@example.net>.password = ''
+PASS <area>: Setting <http://me:secret@example.net>.password = ''
+FAIL <a>: Setting <http://example.net>.password = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://:%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+FAIL <area>: Setting <http://example.net>.password = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://:%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS <a>: Setting <http://example.net>.password = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <area>: Setting <http://example.net>.password = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS <a>: Setting <sc:///>.password = 'x'
+PASS <area>: Setting <sc:///>.password = 'x'
+FAIL <a>: Setting <sc://x/>.host = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = ' ' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = ' ' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.host = '@' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.host = '@' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.host = 'ß' assert_equals: expected "sc://%C3%9F/" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.host = 'ß' assert_equals: expected "sc://%C3%9F/" but got "sc://x/"
+PASS <a>: Setting <https://x/>.host = 'ß' IDNA Nontransitional_Processing
+PASS <area>: Setting <https://x/>.host = 'ß' IDNA Nontransitional_Processing
+PASS <a>: Setting <data:text/plain,Stuff>.host = 'example.net' Cannot-be-a-base means no host
+PASS <area>: Setting <data:text/plain,Stuff>.host = 'example.net' Cannot-be-a-base means no host
+PASS <a>: Setting <http://example.net>.host = 'example.com:8080'
+PASS <area>: Setting <http://example.net>.host = 'example.com:8080'
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com' Port number is unchanged if not specified in the new value
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com' Port number is unchanged if not specified in the new value
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified
+PASS <a>: Setting <http://example.net>.host = '' The empty host is not valid for special schemes
+PASS <area>: Setting <http://example.net>.host = '' The empty host is not valid for special schemes
+FAIL <a>: Setting <view-source+http://example.net/foo>.host = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <area>: Setting <view-source+http://example.net/foo>.host = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <a>: Setting <a:/foo>.host = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "file://example.net/A:/foo"
+FAIL <area>: Setting <a:/foo>.host = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "file://example.net/A:/foo"
+PASS <a>: Setting <http://example.net>.host = '0x7F000001:8080' IPv4 address syntax is normalized
+PASS <area>: Setting <http://example.net>.host = '0x7F000001:8080' IPv4 address syntax is normalized
+PASS <a>: Setting <http://example.net>.host = '[::0:01]:2' IPv6 address syntax is normalized
+PASS <area>: Setting <http://example.net>.host = '[::0:01]:2' IPv6 address syntax is normalized
+PASS <a>: Setting <http://example.net>.host = '[2001:db8::2]:4002' IPv6 literal address with port, crbug.com/1012416
+PASS <area>: Setting <http://example.net>.host = '[2001:db8::2]:4002' IPv6 literal address with port, crbug.com/1012416
+PASS <a>: Setting <http://example.net>.host = 'example.com:80' Default port number is removed
+PASS <area>: Setting <http://example.net>.host = 'example.com:80' Default port number is removed
+PASS <a>: Setting <https://example.net>.host = 'example.com:443' Default port number is removed
+PASS <area>: Setting <https://example.net>.host = 'example.com:443' Default port number is removed
+PASS <a>: Setting <https://example.net>.host = 'example.com:80' Default port number is only removed for the relevant scheme
+PASS <area>: Setting <https://example.net>.host = 'example.com:80' Default port number is only removed for the relevant scheme
+PASS <a>: Setting <http://example.net:8080>.host = 'example.com:80' Port number is removed if new port is scheme default and existing URL has a non-default port
+PASS <area>: Setting <http://example.net:8080>.host = 'example.com:80' Port number is removed if new port is scheme default and existing URL has a non-default port
+PASS <a>: Setting <http://example.net/path>.host = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.host = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.host = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.host = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <area>: Setting <view-source+http://example.net/path>.host = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <a>: Setting <view-source+http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.com:8080/path" but got "view-source+http://example.net/path"
+FAIL <area>: Setting <view-source+http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.com:8080/path" but got "view-source+http://example.net/path"
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:65535' Port numbers are 16 bit integers
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:65535' Port numbers are 16 bit integers
+PASS <a>: Setting <http://example.net/path>.host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.
+PASS <area>: Setting <http://example.net/path>.host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.
+PASS <a>: Setting <http://example.net/>.host = '[google.com]' Broken IPv6
+PASS <area>: Setting <http://example.net/>.host = '[google.com]' Broken IPv6
+PASS <a>: Setting <http://example.net/>.host = '[::1.2.3.4x]'
+PASS <area>: Setting <http://example.net/>.host = '[::1.2.3.4x]'
+FAIL <a>: Setting <http://example.net/>.host = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <a>: Setting <http://example.net/>.host = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <a>: Setting <http://example.net/>.host = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <area>: Setting <http://example.net/>.host = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <a>: Setting <sc://test@test/>.host = '' assert_equals: expected "test" but got ""
+FAIL <area>: Setting <sc://test@test/>.host = '' assert_equals: expected "test" but got ""
+FAIL <a>: Setting <sc://test:12/>.host = '' assert_equals: expected "test:12" but got ""
+FAIL <area>: Setting <sc://test:12/>.host = '' assert_equals: expected "test:12" but got ""
+PASS <a>: Setting <http://example.com/>.host = '///bad.com' Leading / is not stripped
+PASS <area>: Setting <http://example.com/>.host = '///bad.com' Leading / is not stripped
+FAIL <a>: Setting <sc://example.com/>.host = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <area>: Setting <sc://example.com/>.host = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <a>: Setting <sc://x/>.hostname = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.hostname = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = ' ' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = ' ' assert_equals: expected "x" but got ""
+FAIL <a>: Setting <sc://x/>.hostname = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.hostname = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL <a>: Setting <sc://x/>.hostname = '@' assert_equals: expected "x" but got ""
+FAIL <area>: Setting <sc://x/>.hostname = '@' assert_equals: expected "x" but got ""
+PASS <a>: Setting <data:text/plain,Stuff>.hostname = 'example.net' Cannot-be-a-base means no host
+PASS <area>: Setting <data:text/plain,Stuff>.hostname = 'example.net' Cannot-be-a-base means no host
+PASS <a>: Setting <http://example.net:8080>.hostname = 'example.com'
+PASS <area>: Setting <http://example.net:8080>.hostname = 'example.com'
+PASS <a>: Setting <http://example.net>.hostname = '' The empty host is not valid for special schemes
+PASS <area>: Setting <http://example.net>.hostname = '' The empty host is not valid for special schemes
+FAIL <a>: Setting <view-source+http://example.net/foo>.hostname = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <area>: Setting <view-source+http://example.net/foo>.hostname = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL <a>: Setting <a:/foo>.hostname = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "file://example.net/A:/foo"
+FAIL <area>: Setting <a:/foo>.hostname = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "file://example.net/A:/foo"
+PASS <a>: Setting <http://example.net:8080>.hostname = '0x7F000001' IPv4 address syntax is normalized
+PASS <area>: Setting <http://example.net:8080>.hostname = '0x7F000001' IPv4 address syntax is normalized
+PASS <a>: Setting <http://example.net>.hostname = '[::0:01]' IPv6 address syntax is normalized
+PASS <area>: Setting <http://example.net>.hostname = '[::0:01]' IPv6 address syntax is normalized
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com:8080' : delimiter invalidates entire value
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com:8080' : delimiter invalidates entire value
+PASS <a>: Setting <http://example.net:8080/path>.hostname = 'example.com:' : delimiter invalidates entire value
+PASS <area>: Setting <http://example.net:8080/path>.hostname = 'example.com:' : delimiter invalidates entire value
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.hostname = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.hostname = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.hostname = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL <area>: Setting <view-source+http://example.net/path>.hostname = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+PASS <a>: Setting <http://example.net/>.hostname = '[google.com]' Broken IPv6
+PASS <area>: Setting <http://example.net/>.hostname = '[google.com]' Broken IPv6
+PASS <a>: Setting <http://example.net/>.hostname = '[::1.2.3.4x]'
+PASS <area>: Setting <http://example.net/>.hostname = '[::1.2.3.4x]'
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL <a>: Setting <http://example.net/>.hostname = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <area>: Setting <http://example.net/>.hostname = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL <a>: Setting <sc://test@test/>.hostname = '' assert_equals: expected "test" but got ""
+FAIL <area>: Setting <sc://test@test/>.hostname = '' assert_equals: expected "test" but got ""
+FAIL <a>: Setting <sc://test:12/>.hostname = '' assert_equals: expected "test:12" but got ""
+FAIL <area>: Setting <sc://test:12/>.hostname = '' assert_equals: expected "test:12" but got ""
+FAIL <a>: Setting <non-spec:/.//p>.hostname = 'h' Drop /. from path assert_equals: expected "non-spec://h//p" but got "non-spec:/.//p"
+FAIL <area>: Setting <non-spec:/.//p>.hostname = 'h' Drop /. from path assert_equals: expected "non-spec://h//p" but got "non-spec:/.//p"
+FAIL <a>: Setting <non-spec:/.//p>.hostname = '' assert_equals: expected "non-spec:////p" but got "non-spec:/.//p"
+FAIL <area>: Setting <non-spec:/.//p>.hostname = '' assert_equals: expected "non-spec:////p" but got "non-spec:/.//p"
+PASS <a>: Setting <http://example.com/>.hostname = '///bad.com' Leading / is not stripped
+PASS <area>: Setting <http://example.com/>.hostname = '///bad.com' Leading / is not stripped
+FAIL <a>: Setting <sc://example.com/>.hostname = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL <area>: Setting <sc://example.com/>.hostname = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+PASS <a>: Setting <http://example.net>.port = '8080'
+PASS <area>: Setting <http://example.net>.port = '8080'
+PASS <a>: Setting <http://example.net:8080>.port = '' Port number is removed if empty is the new value
+PASS <area>: Setting <http://example.net:8080>.port = '' Port number is removed if empty is the new value
+PASS <a>: Setting <http://example.net:8080>.port = '80' Default port number is removed
+PASS <area>: Setting <http://example.net:8080>.port = '80' Default port number is removed
+PASS <a>: Setting <https://example.net:4433>.port = '443' Default port number is removed
+PASS <area>: Setting <https://example.net:4433>.port = '443' Default port number is removed
+PASS <a>: Setting <https://example.net>.port = '80' Default port number is only removed for the relevant scheme
+PASS <area>: Setting <https://example.net>.port = '80' Default port number is only removed for the relevant scheme
+PASS <a>: Setting <http://example.net/path>.port = '8080/stuff' Stuff after a / delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080/stuff' Stuff after a / delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080?stuff' Stuff after a ? delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080?stuff' Stuff after a ? delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080#stuff' Stuff after a # delimiter is ignored
+PASS <area>: Setting <http://example.net/path>.port = '8080#stuff' Stuff after a # delimiter is ignored
+PASS <a>: Setting <http://example.net/path>.port = '8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS <area>: Setting <http://example.net/path>.port = '8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL <a>: Setting <view-source+http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.net:8080/path" but got "view-source+http://example.net/path"
+FAIL <area>: Setting <view-source+http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.net:8080/path" but got "view-source+http://example.net/path"
+PASS <a>: Setting <http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <area>: Setting <http://example.net/path>.port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS <a>: Setting <http://example.net/path>.port = '65535' Port numbers are 16 bit integers
+PASS <area>: Setting <http://example.net/path>.port = '65535' Port numbers are 16 bit integers
+FAIL <a>: Setting <http://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "http://example.net:8080/path" but got "http://example.net:0/path"
+FAIL <area>: Setting <http://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "http://example.net:8080/path" but got "http://example.net:0/path"
+FAIL <a>: Setting <non-special://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "example.net:8080" but got ""
+FAIL <area>: Setting <non-special://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "example.net:8080" but got ""
+PASS <a>: Setting <non-base:value>.port = '12'
+PASS <area>: Setting <non-base:value>.port = '12'
+PASS <a>: Setting <sc:///>.port = '12'
+PASS <area>: Setting <sc:///>.port = '12'
+FAIL <a>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+FAIL <area>: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+FAIL <a>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
+FAIL <area>: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
+FAIL <a>: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
+FAIL <area>: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
+FAIL <a>: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
+FAIL <area>: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
+FAIL <a>: Setting <foo:/some/path>.pathname = 'test' Path-only URLs always have an initial slash assert_equals: expected "foo:/test" but got "foo:/some/path"
+FAIL <area>: Setting <foo:/some/path>.pathname = 'test' Path-only URLs always have an initial slash assert_equals: expected "foo:/test" but got "foo:/some/path"
+FAIL <a>: Setting <unix:/run/foo.socket?timeout=10>.pathname = '/var/log/../run/bar.socket' assert_equals: expected "unix:/var/run/bar.socket?timeout=10" but got "unix:/run/foo.socket?timeout=10"
+FAIL <area>: Setting <unix:/run/foo.socket?timeout=10>.pathname = '/var/log/../run/bar.socket' assert_equals: expected "unix:/var/run/bar.socket?timeout=10" but got "unix:/run/foo.socket?timeout=10"
+PASS <a>: Setting <https://example.net#nav>.pathname = 'home'
+PASS <area>: Setting <https://example.net#nav>.pathname = 'home'
+PASS <a>: Setting <https://example.net#nav>.pathname = '../home'
+PASS <area>: Setting <https://example.net#nav>.pathname = '../home'
+PASS <a>: Setting <http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is a segment delimiter for 'special' URLs
+PASS <area>: Setting <http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is a segment delimiter for 'special' URLs
+FAIL <a>: Setting <view-source+http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is *not* a segment delimiter for non-'special' URLs assert_equals: expected "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav" but got "view-source+http://example.net/home?lang=fr#nav"
+FAIL <area>: Setting <view-source+http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is *not* a segment delimiter for non-'special' URLs assert_equals: expected "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav" but got "view-source+http://example.net/home?lang=fr#nav"
+FAIL <a>: Setting <a:/>.pathname = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed. assert_equals: expected "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" but got "file:///A:/"
+FAIL <area>: Setting <a:/>.pathname = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed. assert_equals: expected "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" but got "file:///A:/"
+FAIL <a>: Setting <http://example.net>.pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, including %2E outside dotted segments. assert_equals: expected "http://example.net/%2e%2E%c3%89t%C3%A9" but got "http://example.net/..%c3%89t%C3%A9"
+FAIL <area>: Setting <http://example.net>.pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, including %2E outside dotted segments. assert_equals: expected "http://example.net/%2e%2E%c3%89t%C3%A9" but got "http://example.net/..%c3%89t%C3%A9"
+PASS <a>: Setting <http://example.net>.pathname = '?' ? needs to be encoded
+PASS <area>: Setting <http://example.net>.pathname = '?' ? needs to be encoded
+PASS <a>: Setting <http://example.net>.pathname = '#' # needs to be encoded
+PASS <area>: Setting <http://example.net>.pathname = '#' # needs to be encoded
+FAIL <a>: Setting <sc://example.net>.pathname = '?' ? needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%3F" but got "sc://example.net"
+FAIL <area>: Setting <sc://example.net>.pathname = '?' ? needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%3F" but got "sc://example.net"
+FAIL <a>: Setting <sc://example.net>.pathname = '#' # needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%23" but got "sc://example.net"
+FAIL <area>: Setting <sc://example.net>.pathname = '#' # needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%23" but got "sc://example.net"
+PASS <a>: Setting <http://example.net>.pathname = '/?é' ? doesn't mess up encoding
+PASS <area>: Setting <http://example.net>.pathname = '/?é' ? doesn't mess up encoding
+PASS <a>: Setting <http://example.net>.pathname = '/#é' # doesn't mess up encoding
+PASS <area>: Setting <http://example.net>.pathname = '/#é' # doesn't mess up encoding
+FAIL <a>: Setting <non-spec:/>.pathname = '/.//p' Serialize /. in path assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '/.//p' Serialize /. in path assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <area>: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL <a>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+FAIL <area>: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+PASS <a>: Setting <https://example.net#nav>.search = 'lang=fr'
+PASS <area>: Setting <https://example.net#nav>.search = 'lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = '??lang=fr'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = '??lang=fr'
+FAIL <a>: Setting <https://example.net?lang=en-US#nav>.search = '?' assert_equals: expected "https://example.net/?#nav" but got "https://example.net/#nav"
+FAIL <area>: Setting <https://example.net?lang=en-US#nav>.search = '?' assert_equals: expected "https://example.net/?#nav" but got "https://example.net/#nav"
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.search = ''
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.search = ''
+PASS <a>: Setting <https://example.net?lang=en-US>.search = ''
+PASS <area>: Setting <https://example.net?lang=en-US>.search = ''
+PASS <a>: Setting <https://example.net>.search = ''
+PASS <area>: Setting <https://example.net>.search = ''
+FAIL <a>: Setting <a:/>.search = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "file:///A:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+FAIL <area>: Setting <a:/>.search = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "file:///A:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+PASS <a>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <area>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <a>: Setting <https://example.net>.hash = 'main'
+PASS <area>: Setting <https://example.net>.hash = 'main'
+PASS <a>: Setting <https://example.net#nav>.hash = 'main'
+PASS <area>: Setting <https://example.net#nav>.hash = 'main'
+PASS <a>: Setting <https://example.net?lang=en-US>.hash = '##nav'
+PASS <area>: Setting <https://example.net?lang=en-US>.hash = '##nav'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = '#main'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = '#main'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = '#'
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = '#'
+PASS <a>: Setting <https://example.net?lang=en-US#nav>.hash = ''
+PASS <area>: Setting <https://example.net?lang=en-US#nav>.hash = ''
+PASS <a>: Setting <http://example.net>.hash = '#foo bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo"bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo"bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo<bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo<bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo>bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo>bar'
+PASS <a>: Setting <http://example.net>.hash = '#foo`bar'
+PASS <area>: Setting <http://example.net>.hash = '#foo`bar'
+FAIL <a>: Setting <a:/>.hash = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' Simple percent-encoding; tabs and newlines are removed assert_equals: expected "a:/#%00%01%1F%20!%22#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "file:///A:/#%00%01%1F%20!%22#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+FAIL <area>: Setting <a:/>.hash = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' Simple percent-encoding; tabs and newlines are removed assert_equals: expected "a:/#%00%01%1F%20!%22#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "file:///A:/#%00%01%1F%20!%22#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+PASS <a>: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <area>: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <a>: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <area>: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS <a>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS <area>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+Harness: the test ran to completion.
+
diff --git "a/third_party/blink/web_tests/platform/win/virtual/idna-2008/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/platform/win/virtual/idna-2008/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt"
new file mode 100644
index 0000000..e16696b
--- /dev/null
+++ "b/third_party/blink/web_tests/platform/win/virtual/idna-2008/external/wpt/url/url-setters.any.worker_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -0,0 +1,197 @@
+This is a testharness.js-based test.
+Found 186 tests; 106 PASS, 80 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS Loading data…
+FAIL URL: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged. assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL URL: Setting <a://example.net>.protocol = 'b' assert_equals: expected "b://example.net" but got "file:///B:///A://example.net"
+FAIL URL: Setting <a://example.net>.protocol = 'B' Upper-case ASCII is lower-cased assert_equals: expected "b://example.net" but got "file:///B:///A://example.net"
+FAIL URL: Setting <a://example.net>.protocol = 'é' Non-ASCII is rejected assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL URL: Setting <a://example.net>.protocol = '0b' No leading digit assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL URL: Setting <a://example.net>.protocol = '+b' No leading punctuation assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL URL: Setting <a://example.net>.protocol = 'bC0+-.' assert_equals: expected "bc0+-.://example.net" but got "bc0+-.:///A://example.net"
+FAIL URL: Setting <a://example.net>.protocol = 'b,c' Only some punctuation is acceptable assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL URL: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected assert_equals: expected "a://example.net" but got "file:///A://example.net"
+PASS URL: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file
+PASS URL: Setting <https://example.net:1234>.protocol = 'file'
+PASS URL: Setting <wss://x:x@example.net:1234>.protocol = 'file'
+FAIL URL: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "file:///B://example.net/"
+FAIL URL: Setting <https://example.net>.protocol = 's' assert_equals: expected "https://example.net/" but got "file:///S://example.net/"
+FAIL URL: Setting <ftp://example.net>.protocol = 'test' assert_equals: expected "ftp://example.net/" but got "test://example.net/"
+FAIL URL: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
+FAIL URL: Setting <ssh://me@example.net>.protocol = 'https' assert_equals: expected "ssh://me@example.net" but got "https://me@example.net/"
+FAIL URL: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
+FAIL URL: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
+FAIL URL: Setting <nonsense:///test>.protocol = 'https' assert_equals: expected "nonsense:///test" but got "https://test/"
+PASS URL: Setting <http://example.net>.protocol = 'https:foo : bar' Stuff after the first ':' is ignored
+PASS URL: Setting <data:text/html,<p>Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored
+PASS URL: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.
+PASS URL: Setting <unix:/run/foo.socket>.username = 'me' No host means no username
+PASS URL: Setting <http://example.net>.username = 'me'
+PASS URL: Setting <http://:secret@example.net>.username = 'me'
+PASS URL: Setting <http://me@example.net>.username = ''
+PASS URL: Setting <http://me:secret@example.net>.username = ''
+FAIL URL: Setting <http://example.net>.username = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS URL: Setting <http://example.net>.username = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS URL: Setting <sc:///>.username = 'x'
+PASS URL: Setting <unix:/run/foo.socket>.password = 'secret' No host means no password
+PASS URL: Setting <http://example.net>.password = 'secret'
+PASS URL: Setting <http://me@example.net>.password = 'secret'
+PASS URL: Setting <http://:secret@example.net>.password = ''
+PASS URL: Setting <http://me:secret@example.net>.password = ''
+FAIL URL: Setting <http://example.net>.password = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://:%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS URL: Setting <http://example.net>.password = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS URL: Setting <sc:///>.password = 'x'
+FAIL URL: Setting <sc://x/>.host = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.host = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = ' ' assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.host = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '@' assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.host = 'ß' assert_equals: expected "sc://%C3%9F/" but got "sc://x/"
+PASS URL: Setting <https://x/>.host = 'ß' IDNA Nontransitional_Processing
+PASS URL: Setting <data:text/plain,Stuff>.host = 'example.net' Cannot-be-a-base means no host
+PASS URL: Setting <http://example.net>.host = 'example.com:8080'
+PASS URL: Setting <http://example.net:8080>.host = 'example.com' Port number is unchanged if not specified in the new value
+PASS URL: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified
+PASS URL: Setting <http://example.net>.host = '' The empty host is not valid for special schemes
+FAIL URL: Setting <view-source+http://example.net/foo>.host = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL URL: Setting <a:/foo>.host = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "file://example.net/A:/foo"
+PASS URL: Setting <http://example.net>.host = '0x7F000001:8080' IPv4 address syntax is normalized
+PASS URL: Setting <http://example.net>.host = '[::0:01]:2' IPv6 address syntax is normalized
+PASS URL: Setting <http://example.net>.host = '[2001:db8::2]:4002' IPv6 literal address with port, crbug.com/1012416
+PASS URL: Setting <http://example.net>.host = 'example.com:80' Default port number is removed
+PASS URL: Setting <https://example.net>.host = 'example.com:443' Default port number is removed
+PASS URL: Setting <https://example.net>.host = 'example.com:80' Default port number is only removed for the relevant scheme
+PASS URL: Setting <http://example.net:8080>.host = 'example.com:80' Port number is removed if new port is scheme default and existing URL has a non-default port
+PASS URL: Setting <http://example.net/path>.host = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL URL: Setting <view-source+http://example.net/path>.host = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL URL: Setting <view-source+http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.com:8080/path" but got "view-source+http://example.net/path"
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS URL: Setting <http://example.net/path>.host = 'example.com:65535' Port numbers are 16 bit integers
+PASS URL: Setting <http://example.net/path>.host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.
+PASS URL: Setting <http://example.net/>.host = '[google.com]' Broken IPv6
+PASS URL: Setting <http://example.net/>.host = '[::1.2.3.4x]'
+FAIL URL: Setting <http://example.net/>.host = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL URL: Setting <http://example.net/>.host = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL URL: Setting <http://example.net/>.host = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL URL: Setting <sc://test@test/>.host = '' assert_equals: expected "test" but got ""
+FAIL URL: Setting <sc://test:12/>.host = '' assert_equals: expected "test:12" but got ""
+PASS URL: Setting <http://example.com/>.host = '///bad.com' Leading / is not stripped
+FAIL URL: Setting <sc://example.com/>.host = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL URL: Setting <sc://x/>.hostname = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.hostname = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = ' ' assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.hostname = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '@' assert_equals: expected "x" but got ""
+PASS URL: Setting <data:text/plain,Stuff>.hostname = 'example.net' Cannot-be-a-base means no host
+PASS URL: Setting <http://example.net:8080>.hostname = 'example.com'
+PASS URL: Setting <http://example.net>.hostname = '' The empty host is not valid for special schemes
+FAIL URL: Setting <view-source+http://example.net/foo>.hostname = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL URL: Setting <a:/foo>.hostname = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "file://example.net/A:/foo"
+PASS URL: Setting <http://example.net:8080>.hostname = '0x7F000001' IPv4 address syntax is normalized
+PASS URL: Setting <http://example.net>.hostname = '[::0:01]' IPv6 address syntax is normalized
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com:8080' : delimiter invalidates entire value
+PASS URL: Setting <http://example.net:8080/path>.hostname = 'example.com:' : delimiter invalidates entire value
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL URL: Setting <view-source+http://example.net/path>.hostname = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+PASS URL: Setting <http://example.net/>.hostname = '[google.com]' Broken IPv6
+PASS URL: Setting <http://example.net/>.hostname = '[::1.2.3.4x]'
+FAIL URL: Setting <http://example.net/>.hostname = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL URL: Setting <http://example.net/>.hostname = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL URL: Setting <http://example.net/>.hostname = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL URL: Setting <sc://test@test/>.hostname = '' assert_equals: expected "test" but got ""
+FAIL URL: Setting <sc://test:12/>.hostname = '' assert_equals: expected "test:12" but got ""
+FAIL URL: Setting <non-spec:/.//p>.hostname = 'h' Drop /. from path assert_equals: expected "non-spec://h//p" but got "non-spec:/.//p"
+FAIL URL: Setting <non-spec:/.//p>.hostname = '' assert_equals: expected "non-spec:////p" but got "non-spec:/.//p"
+PASS URL: Setting <http://example.com/>.hostname = '///bad.com' Leading / is not stripped
+FAIL URL: Setting <sc://example.com/>.hostname = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+PASS URL: Setting <http://example.net>.port = '8080'
+PASS URL: Setting <http://example.net:8080>.port = '' Port number is removed if empty is the new value
+PASS URL: Setting <http://example.net:8080>.port = '80' Default port number is removed
+PASS URL: Setting <https://example.net:4433>.port = '443' Default port number is removed
+PASS URL: Setting <https://example.net>.port = '80' Default port number is only removed for the relevant scheme
+PASS URL: Setting <http://example.net/path>.port = '8080/stuff' Stuff after a / delimiter is ignored
+PASS URL: Setting <http://example.net/path>.port = '8080?stuff' Stuff after a ? delimiter is ignored
+PASS URL: Setting <http://example.net/path>.port = '8080#stuff' Stuff after a # delimiter is ignored
+PASS URL: Setting <http://example.net/path>.port = '8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL URL: Setting <view-source+http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.net:8080/path" but got "view-source+http://example.net/path"
+PASS URL: Setting <http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS URL: Setting <http://example.net/path>.port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS URL: Setting <http://example.net/path>.port = '65535' Port numbers are 16 bit integers
+FAIL URL: Setting <http://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "http://example.net:8080/path" but got "http://example.net:0/path"
+FAIL URL: Setting <non-special://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "example.net:8080" but got ""
+PASS URL: Setting <non-base:value>.port = '12'
+PASS URL: Setting <sc:///>.port = '12'
+FAIL URL: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+FAIL URL: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
+FAIL URL: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
+FAIL URL: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
+FAIL URL: Setting <foo:/some/path>.pathname = 'test' Path-only URLs always have an initial slash assert_equals: expected "foo:/test" but got "foo:/some/path"
+FAIL URL: Setting <unix:/run/foo.socket?timeout=10>.pathname = '/var/log/../run/bar.socket' assert_equals: expected "unix:/var/run/bar.socket?timeout=10" but got "unix:/run/foo.socket?timeout=10"
+PASS URL: Setting <https://example.net#nav>.pathname = 'home'
+PASS URL: Setting <https://example.net#nav>.pathname = '../home'
+PASS URL: Setting <http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is a segment delimiter for 'special' URLs
+FAIL URL: Setting <view-source+http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is *not* a segment delimiter for non-'special' URLs assert_equals: expected "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav" but got "view-source+http://example.net/home?lang=fr#nav"
+FAIL URL: Setting <a:/>.pathname = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed. assert_equals: expected "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" but got "file:///A:/"
+FAIL URL: Setting <http://example.net>.pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, including %2E outside dotted segments. assert_equals: expected "http://example.net/%2e%2E%c3%89t%C3%A9" but got "http://example.net/..%c3%89t%C3%A9"
+PASS URL: Setting <http://example.net>.pathname = '?' ? needs to be encoded
+PASS URL: Setting <http://example.net>.pathname = '#' # needs to be encoded
+FAIL URL: Setting <sc://example.net>.pathname = '?' ? needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%3F" but got "sc://example.net"
+FAIL URL: Setting <sc://example.net>.pathname = '#' # needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%23" but got "sc://example.net"
+PASS URL: Setting <http://example.net>.pathname = '/?é' ? doesn't mess up encoding
+PASS URL: Setting <http://example.net>.pathname = '/#é' # doesn't mess up encoding
+FAIL URL: Setting <non-spec:/>.pathname = '/.//p' Serialize /. in path assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL URL: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL URL: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL URL: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+PASS URL: Setting <https://example.net#nav>.search = 'lang=fr'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.search = '??lang=fr'
+FAIL URL: Setting <https://example.net?lang=en-US#nav>.search = '?' assert_equals: expected "https://example.net/?#nav" but got "https://example.net/#nav"
+PASS URL: Setting <https://example.net?lang=en-US#nav>.search = ''
+PASS URL: Setting <https://example.net?lang=en-US>.search = ''
+PASS URL: Setting <https://example.net>.search = ''
+FAIL URL: Setting <a:/>.search = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "file:///A:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+PASS URL: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS URL: Setting <https://example.net>.hash = 'main'
+PASS URL: Setting <https://example.net#nav>.hash = 'main'
+PASS URL: Setting <https://example.net?lang=en-US>.hash = '##nav'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.hash = '#main'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.hash = '#'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.hash = ''
+PASS URL: Setting <http://example.net>.hash = '#foo bar'
+PASS URL: Setting <http://example.net>.hash = '#foo"bar'
+PASS URL: Setting <http://example.net>.hash = '#foo<bar'
+PASS URL: Setting <http://example.net>.hash = '#foo>bar'
+PASS URL: Setting <http://example.net>.hash = '#foo`bar'
+FAIL URL: Setting <a:/>.hash = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' Simple percent-encoding; tabs and newlines are removed assert_equals: expected "a:/#%00%01%1F%20!%22#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "file:///A:/#%00%01%1F%20!%22#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+PASS URL: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS URL: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS URL: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+Harness: the test ran to completion.
+
diff --git "a/third_party/blink/web_tests/platform/win/virtual/idna-2008/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt" "b/third_party/blink/web_tests/platform/win/virtual/idna-2008/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt"
new file mode 100644
index 0000000..e16696b
--- /dev/null
+++ "b/third_party/blink/web_tests/platform/win/virtual/idna-2008/external/wpt/url/url-setters.any_exclude=\050file_javascript_mailto\051-expected.txt"
@@ -0,0 +1,197 @@
+This is a testharness.js-based test.
+Found 186 tests; 106 PASS, 80 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS Loading data…
+FAIL URL: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged. assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL URL: Setting <a://example.net>.protocol = 'b' assert_equals: expected "b://example.net" but got "file:///B:///A://example.net"
+FAIL URL: Setting <a://example.net>.protocol = 'B' Upper-case ASCII is lower-cased assert_equals: expected "b://example.net" but got "file:///B:///A://example.net"
+FAIL URL: Setting <a://example.net>.protocol = 'é' Non-ASCII is rejected assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL URL: Setting <a://example.net>.protocol = '0b' No leading digit assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL URL: Setting <a://example.net>.protocol = '+b' No leading punctuation assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL URL: Setting <a://example.net>.protocol = 'bC0+-.' assert_equals: expected "bc0+-.://example.net" but got "bc0+-.:///A://example.net"
+FAIL URL: Setting <a://example.net>.protocol = 'b,c' Only some punctuation is acceptable assert_equals: expected "a://example.net" but got "file:///A://example.net"
+FAIL URL: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected assert_equals: expected "a://example.net" but got "file:///A://example.net"
+PASS URL: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file
+PASS URL: Setting <https://example.net:1234>.protocol = 'file'
+PASS URL: Setting <wss://x:x@example.net:1234>.protocol = 'file'
+FAIL URL: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "file:///B://example.net/"
+FAIL URL: Setting <https://example.net>.protocol = 's' assert_equals: expected "https://example.net/" but got "file:///S://example.net/"
+FAIL URL: Setting <ftp://example.net>.protocol = 'test' assert_equals: expected "ftp://example.net/" but got "test://example.net/"
+FAIL URL: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
+FAIL URL: Setting <ssh://me@example.net>.protocol = 'https' assert_equals: expected "ssh://me@example.net" but got "https://me@example.net/"
+FAIL URL: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
+FAIL URL: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
+FAIL URL: Setting <nonsense:///test>.protocol = 'https' assert_equals: expected "nonsense:///test" but got "https://test/"
+PASS URL: Setting <http://example.net>.protocol = 'https:foo : bar' Stuff after the first ':' is ignored
+PASS URL: Setting <data:text/html,<p>Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored
+PASS URL: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.
+PASS URL: Setting <unix:/run/foo.socket>.username = 'me' No host means no username
+PASS URL: Setting <http://example.net>.username = 'me'
+PASS URL: Setting <http://:secret@example.net>.username = 'me'
+PASS URL: Setting <http://me@example.net>.username = ''
+PASS URL: Setting <http://me:secret@example.net>.username = ''
+FAIL URL: Setting <http://example.net>.username = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS URL: Setting <http://example.net>.username = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS URL: Setting <sc:///>.username = 'x'
+PASS URL: Setting <unix:/run/foo.socket>.password = 'secret' No host means no password
+PASS URL: Setting <http://example.net>.password = 'secret'
+PASS URL: Setting <http://me@example.net>.password = 'secret'
+PASS URL: Setting <http://:secret@example.net>.password = ''
+PASS URL: Setting <http://me:secret@example.net>.password = ''
+FAIL URL: Setting <http://example.net>.password = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set. assert_equals: expected "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/" but got "http://:%00%01%09%0A%0D%1F%20!%22%23$%&%27()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/"
+PASS URL: Setting <http://example.net>.password = '%c3%89té' Bytes already percent-encoded are left as-is.
+PASS URL: Setting <sc:///>.password = 'x'
+FAIL URL: Setting <sc://x/>.host = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.host = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = ' ' assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.host = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.host = '@' assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.host = 'ß' assert_equals: expected "sc://%C3%9F/" but got "sc://x/"
+PASS URL: Setting <https://x/>.host = 'ß' IDNA Nontransitional_Processing
+PASS URL: Setting <data:text/plain,Stuff>.host = 'example.net' Cannot-be-a-base means no host
+PASS URL: Setting <http://example.net>.host = 'example.com:8080'
+PASS URL: Setting <http://example.net:8080>.host = 'example.com' Port number is unchanged if not specified in the new value
+PASS URL: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified
+PASS URL: Setting <http://example.net>.host = '' The empty host is not valid for special schemes
+FAIL URL: Setting <view-source+http://example.net/foo>.host = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL URL: Setting <a:/foo>.host = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "file://example.net/A:/foo"
+PASS URL: Setting <http://example.net>.host = '0x7F000001:8080' IPv4 address syntax is normalized
+PASS URL: Setting <http://example.net>.host = '[::0:01]:2' IPv6 address syntax is normalized
+PASS URL: Setting <http://example.net>.host = '[2001:db8::2]:4002' IPv6 literal address with port, crbug.com/1012416
+PASS URL: Setting <http://example.net>.host = 'example.com:80' Default port number is removed
+PASS URL: Setting <https://example.net>.host = 'example.com:443' Default port number is removed
+PASS URL: Setting <https://example.net>.host = 'example.com:80' Default port number is only removed for the relevant scheme
+PASS URL: Setting <http://example.net:8080>.host = 'example.com:80' Port number is removed if new port is scheme default and existing URL has a non-default port
+PASS URL: Setting <http://example.net/path>.host = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored
+PASS URL: Setting <http://example.net/path>.host = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL URL: Setting <view-source+http://example.net/path>.host = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+FAIL URL: Setting <view-source+http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.com:8080/path" but got "view-source+http://example.net/path"
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS URL: Setting <http://example.net/path>.host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS URL: Setting <http://example.net/path>.host = 'example.com:65535' Port numbers are 16 bit integers
+PASS URL: Setting <http://example.net/path>.host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.
+PASS URL: Setting <http://example.net/>.host = '[google.com]' Broken IPv6
+PASS URL: Setting <http://example.net/>.host = '[::1.2.3.4x]'
+FAIL URL: Setting <http://example.net/>.host = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL URL: Setting <http://example.net/>.host = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL URL: Setting <http://example.net/>.host = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL URL: Setting <sc://test@test/>.host = '' assert_equals: expected "test" but got ""
+FAIL URL: Setting <sc://test:12/>.host = '' assert_equals: expected "test:12" but got ""
+PASS URL: Setting <http://example.com/>.host = '///bad.com' Leading / is not stripped
+FAIL URL: Setting <sc://example.com/>.host = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+FAIL URL: Setting <sc://x/>.hostname = '\0' Non-special scheme assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.hostname = '	' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '
+' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '\r' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = ' ' assert_equals: expected "x" but got ""
+FAIL URL: Setting <sc://x/>.hostname = '#' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '/' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '?' assert_equals: expected "sc:///" but got "sc://x/"
+FAIL URL: Setting <sc://x/>.hostname = '@' assert_equals: expected "x" but got ""
+PASS URL: Setting <data:text/plain,Stuff>.hostname = 'example.net' Cannot-be-a-base means no host
+PASS URL: Setting <http://example.net:8080>.hostname = 'example.com'
+PASS URL: Setting <http://example.net>.hostname = '' The empty host is not valid for special schemes
+FAIL URL: Setting <view-source+http://example.net/foo>.hostname = '' The empty host is OK for non-special schemes assert_equals: expected "view-source+http:///foo" but got "view-source+http://example.net/foo"
+FAIL URL: Setting <a:/foo>.hostname = 'example.net' Path-only URLs can gain a host assert_equals: expected "a://example.net/foo" but got "file://example.net/A:/foo"
+PASS URL: Setting <http://example.net:8080>.hostname = '0x7F000001' IPv4 address syntax is normalized
+PASS URL: Setting <http://example.net>.hostname = '[::0:01]' IPv6 address syntax is normalized
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com:8080' : delimiter invalidates entire value
+PASS URL: Setting <http://example.net:8080/path>.hostname = 'example.com:' : delimiter invalidates entire value
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com/stuff' Stuff after a / delimiter is ignored
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com#stuff' Stuff after a # delimiter is ignored
+PASS URL: Setting <http://example.net/path>.hostname = 'example.com\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL URL: Setting <view-source+http://example.net/path>.hostname = 'example.com\stuff' \ is not a delimiter for non-special schemes, but still forbidden in hosts assert_equals: expected "example.net" but got ""
+PASS URL: Setting <http://example.net/>.hostname = '[google.com]' Broken IPv6
+PASS URL: Setting <http://example.net/>.hostname = '[::1.2.3.4x]'
+FAIL URL: Setting <http://example.net/>.hostname = '[::1.2.3.]' assert_equals: expected "http://example.net/" but got "http://[::102:3]/"
+FAIL URL: Setting <http://example.net/>.hostname = '[::1.2.]' assert_equals: expected "http://example.net/" but got "http://[::100:2]/"
+FAIL URL: Setting <http://example.net/>.hostname = '[::1.]' assert_equals: expected "http://example.net/" but got "http://[::1]/"
+FAIL URL: Setting <sc://test@test/>.hostname = '' assert_equals: expected "test" but got ""
+FAIL URL: Setting <sc://test:12/>.hostname = '' assert_equals: expected "test:12" but got ""
+FAIL URL: Setting <non-spec:/.//p>.hostname = 'h' Drop /. from path assert_equals: expected "non-spec://h//p" but got "non-spec:/.//p"
+FAIL URL: Setting <non-spec:/.//p>.hostname = '' assert_equals: expected "non-spec:////p" but got "non-spec:/.//p"
+PASS URL: Setting <http://example.com/>.hostname = '///bad.com' Leading / is not stripped
+FAIL URL: Setting <sc://example.com/>.hostname = '///bad.com' Leading / is not stripped assert_equals: expected "sc:///" but got "sc://example.com/"
+PASS URL: Setting <http://example.net>.port = '8080'
+PASS URL: Setting <http://example.net:8080>.port = '' Port number is removed if empty is the new value
+PASS URL: Setting <http://example.net:8080>.port = '80' Default port number is removed
+PASS URL: Setting <https://example.net:4433>.port = '443' Default port number is removed
+PASS URL: Setting <https://example.net>.port = '80' Default port number is only removed for the relevant scheme
+PASS URL: Setting <http://example.net/path>.port = '8080/stuff' Stuff after a / delimiter is ignored
+PASS URL: Setting <http://example.net/path>.port = '8080?stuff' Stuff after a ? delimiter is ignored
+PASS URL: Setting <http://example.net/path>.port = '8080#stuff' Stuff after a # delimiter is ignored
+PASS URL: Setting <http://example.net/path>.port = '8080\stuff' Stuff after a \ delimiter is ignored for special schemes
+FAIL URL: Setting <view-source+http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error assert_equals: expected "view-source+http://example.net:8080/path" but got "view-source+http://example.net/path"
+PASS URL: Setting <http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS URL: Setting <http://example.net/path>.port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error
+PASS URL: Setting <http://example.net/path>.port = '65535' Port numbers are 16 bit integers
+FAIL URL: Setting <http://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "http://example.net:8080/path" but got "http://example.net:0/path"
+FAIL URL: Setting <non-special://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error assert_equals: expected "example.net:8080" but got ""
+PASS URL: Setting <non-base:value>.port = '12'
+PASS URL: Setting <sc:///>.port = '12'
+FAIL URL: Setting <sc://x/>.port = '12' assert_equals: expected "sc://x:12/" but got "sc://x/"
+FAIL URL: Setting <foo://somehost/some/path>.pathname = '' Non-special URLs can have their paths erased assert_equals: expected "foo://somehost" but got "foo://somehost/some/path"
+FAIL URL: Setting <foo:///some/path>.pathname = '' Non-special URLs with an empty host can have their paths erased assert_equals: expected "foo://" but got "foo:///some/path"
+FAIL URL: Setting <foo:/some/path>.pathname = '' Path-only URLs cannot have their paths erased assert_equals: expected "foo:/" but got "foo:/some/path"
+FAIL URL: Setting <foo:/some/path>.pathname = 'test' Path-only URLs always have an initial slash assert_equals: expected "foo:/test" but got "foo:/some/path"
+FAIL URL: Setting <unix:/run/foo.socket?timeout=10>.pathname = '/var/log/../run/bar.socket' assert_equals: expected "unix:/var/run/bar.socket?timeout=10" but got "unix:/run/foo.socket?timeout=10"
+PASS URL: Setting <https://example.net#nav>.pathname = 'home'
+PASS URL: Setting <https://example.net#nav>.pathname = '../home'
+PASS URL: Setting <http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is a segment delimiter for 'special' URLs
+FAIL URL: Setting <view-source+http://example.net/home?lang=fr#nav>.pathname = '\a\%2E\b\%2e.\c' \ is *not* a segment delimiter for non-'special' URLs assert_equals: expected "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav" but got "view-source+http://example.net/home?lang=fr#nav"
+FAIL URL: Setting <a:/>.pathname = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed. assert_equals: expected "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" but got "file:///A:/"
+FAIL URL: Setting <http://example.net>.pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, including %2E outside dotted segments. assert_equals: expected "http://example.net/%2e%2E%c3%89t%C3%A9" but got "http://example.net/..%c3%89t%C3%A9"
+PASS URL: Setting <http://example.net>.pathname = '?' ? needs to be encoded
+PASS URL: Setting <http://example.net>.pathname = '#' # needs to be encoded
+FAIL URL: Setting <sc://example.net>.pathname = '?' ? needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%3F" but got "sc://example.net"
+FAIL URL: Setting <sc://example.net>.pathname = '#' # needs to be encoded, non-special scheme assert_equals: expected "sc://example.net/%23" but got "sc://example.net"
+PASS URL: Setting <http://example.net>.pathname = '/?é' ? doesn't mess up encoding
+PASS URL: Setting <http://example.net>.pathname = '/#é' # doesn't mess up encoding
+FAIL URL: Setting <non-spec:/>.pathname = '/.//p' Serialize /. in path assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL URL: Setting <non-spec:/>.pathname = '/..//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL URL: Setting <non-spec:/>.pathname = '//p' assert_equals: expected "non-spec:/.//p" but got "non-spec:/"
+FAIL URL: Setting <non-spec:/.//>.pathname = 'p' Drop /. from path assert_equals: expected "non-spec:/p" but got "non-spec:/.//"
+PASS URL: Setting <https://example.net#nav>.search = 'lang=fr'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.search = '??lang=fr'
+FAIL URL: Setting <https://example.net?lang=en-US#nav>.search = '?' assert_equals: expected "https://example.net/?#nav" but got "https://example.net/#nav"
+PASS URL: Setting <https://example.net?lang=en-US#nav>.search = ''
+PASS URL: Setting <https://example.net?lang=en-US>.search = ''
+PASS URL: Setting <https://example.net>.search = ''
+FAIL URL: Setting <a:/>.search = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "file:///A:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+PASS URL: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
+PASS URL: Setting <https://example.net>.hash = 'main'
+PASS URL: Setting <https://example.net#nav>.hash = 'main'
+PASS URL: Setting <https://example.net?lang=en-US>.hash = '##nav'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.hash = '#main'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.hash = '#'
+PASS URL: Setting <https://example.net?lang=en-US#nav>.hash = ''
+PASS URL: Setting <http://example.net>.hash = '#foo bar'
+PASS URL: Setting <http://example.net>.hash = '#foo"bar'
+PASS URL: Setting <http://example.net>.hash = '#foo<bar'
+PASS URL: Setting <http://example.net>.hash = '#foo>bar'
+PASS URL: Setting <http://example.net>.hash = '#foo`bar'
+FAIL URL: Setting <a:/>.hash = '\0	
+\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' Simple percent-encoding; tabs and newlines are removed assert_equals: expected "a:/#%00%01%1F%20!%22#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "file:///A:/#%00%01%1F%20!%22#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+PASS URL: Setting <http://example.net>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS URL: Setting <non-spec:/>.hash = 'a\0b' Percent-encode NULLs in fragment
+PASS URL: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/idna-2008/external/wpt/url/url-setters-a-area.window_include=mailto-expected.txt b/third_party/blink/web_tests/virtual/idna-2008/external/wpt/url/url-setters-a-area.window_include=mailto-expected.txt
new file mode 100644
index 0000000..7138439
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/idna-2008/external/wpt/url/url-setters-a-area.window_include=mailto-expected.txt
@@ -0,0 +1,16 @@
+This is a testharness.js-based test.
+PASS Loading data…
+FAIL <a>: Setting <mailto:me@example.net>.protocol = 'http' Cannot-be-a-base URL doesn’t have a host, but URL in a special scheme must. assert_equals: expected "mailto:me@example.net" but got "http://me@example.net/"
+FAIL <area>: Setting <mailto:me@example.net>.protocol = 'http' Cannot-be-a-base URL doesn’t have a host, but URL in a special scheme must. assert_equals: expected "mailto:me@example.net" but got "http://me@example.net/"
+PASS <a>: Setting <mailto:you@example.net>.username = 'me' Cannot-be-a-base means no username
+PASS <area>: Setting <mailto:you@example.net>.username = 'me' Cannot-be-a-base means no username
+PASS <a>: Setting <mailto:me@example.net>.password = 'secret' Cannot-be-a-base means no password
+PASS <area>: Setting <mailto:me@example.net>.password = 'secret' Cannot-be-a-base means no password
+PASS <a>: Setting <mailto:me@example.net>.host = 'example.com' Cannot-be-a-base means no host
+PASS <area>: Setting <mailto:me@example.net>.host = 'example.com' Cannot-be-a-base means no host
+PASS <a>: Setting <mailto:me@example.net>.hostname = 'example.com' Cannot-be-a-base means no host
+PASS <area>: Setting <mailto:me@example.net>.hostname = 'example.com' Cannot-be-a-base means no host
+PASS <a>: Setting <mailto:me@example.net>.pathname = '/foo' Cannot-be-a-base don’t have a path
+PASS <area>: Setting <mailto:me@example.net>.pathname = '/foo' Cannot-be-a-base don’t have a path
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/idna-2008/external/wpt/url/url-setters.any.worker_include=mailto-expected.txt b/third_party/blink/web_tests/virtual/idna-2008/external/wpt/url/url-setters.any.worker_include=mailto-expected.txt
new file mode 100644
index 0000000..af68c2a
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/idna-2008/external/wpt/url/url-setters.any.worker_include=mailto-expected.txt
@@ -0,0 +1,10 @@
+This is a testharness.js-based test.
+PASS Loading data…
+FAIL URL: Setting <mailto:me@example.net>.protocol = 'http' Cannot-be-a-base URL doesn’t have a host, but URL in a special scheme must. assert_equals: expected "mailto:me@example.net" but got "http://me@example.net/"
+PASS URL: Setting <mailto:you@example.net>.username = 'me' Cannot-be-a-base means no username
+PASS URL: Setting <mailto:me@example.net>.password = 'secret' Cannot-be-a-base means no password
+PASS URL: Setting <mailto:me@example.net>.host = 'example.com' Cannot-be-a-base means no host
+PASS URL: Setting <mailto:me@example.net>.hostname = 'example.com' Cannot-be-a-base means no host
+PASS URL: Setting <mailto:me@example.net>.pathname = '/foo' Cannot-be-a-base don’t have a path
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/idna-2008/external/wpt/url/url-setters.any_include=mailto-expected.txt b/third_party/blink/web_tests/virtual/idna-2008/external/wpt/url/url-setters.any_include=mailto-expected.txt
new file mode 100644
index 0000000..af68c2a
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/idna-2008/external/wpt/url/url-setters.any_include=mailto-expected.txt
@@ -0,0 +1,10 @@
+This is a testharness.js-based test.
+PASS Loading data…
+FAIL URL: Setting <mailto:me@example.net>.protocol = 'http' Cannot-be-a-base URL doesn’t have a host, but URL in a special scheme must. assert_equals: expected "mailto:me@example.net" but got "http://me@example.net/"
+PASS URL: Setting <mailto:you@example.net>.username = 'me' Cannot-be-a-base means no username
+PASS URL: Setting <mailto:me@example.net>.password = 'secret' Cannot-be-a-base means no password
+PASS URL: Setting <mailto:me@example.net>.host = 'example.com' Cannot-be-a-base means no host
+PASS URL: Setting <mailto:me@example.net>.hostname = 'example.com' Cannot-be-a-base means no host
+PASS URL: Setting <mailto:me@example.net>.pathname = '/foo' Cannot-be-a-base don’t have a path
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/wpt_internal/cache_storage/padding.https.html.ini b/third_party/blink/web_tests/wpt_internal/cache_storage/padding.https.html.ini
deleted file mode 100644
index a067ca4..0000000
--- a/third_party/blink/web_tests/wpt_internal/cache_storage/padding.https.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[padding.https.html]
-  [Code cache padding should be stable.]
-    expected:
-      if product == "chrome": [FAIL, PASS]
diff --git a/third_party/blink/web_tests/wpt_internal/forms/file/file-input-webkitdirectory-key-enter.html.ini b/third_party/blink/web_tests/wpt_internal/forms/file/file-input-webkitdirectory-key-enter.html.ini
index 08c4c451..f94a6ac 100644
--- a/third_party/blink/web_tests/wpt_internal/forms/file/file-input-webkitdirectory-key-enter.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/forms/file/file-input-webkitdirectory-key-enter.html.ini
@@ -1,4 +1,6 @@
 [file-input-webkitdirectory-key-enter.html]
+  expected:
+    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
   [pressing Enter with focus on a webkitdirectory file input element launches a file chooser]
     expected:
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/wpt_internal/html/interaction/focus/the-autofocus-attribute/object-fallback.html.ini b/third_party/blink/web_tests/wpt_internal/html/interaction/focus/the-autofocus-attribute/object-fallback.html.ini
index c9cf564..4e85ae1 100644
--- a/third_party/blink/web_tests/wpt_internal/html/interaction/focus/the-autofocus-attribute/object-fallback.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/html/interaction/focus/the-autofocus-attribute/object-fallback.html.ini
@@ -1,4 +1,6 @@
 [object-fallback.html]
+  expected:
+    if os == "win": [OK, TIMEOUT]
   [An autofocus element in an OBJECT with a loaded frame should not be processed]
     expected:
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/wpt_internal/view-transition-on-navigation/reload-crash.html.ini b/third_party/blink/web_tests/wpt_internal/view-transition-on-navigation/reload-crash.html.ini
new file mode 100644
index 0000000..6bc5922
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/view-transition-on-navigation/reload-crash.html.ini
@@ -0,0 +1,3 @@
+[reload-crash.html]
+  expected:
+    if product == "chrome": [PASS, ERROR]
diff --git a/third_party/blink/web_tests/wpt_internal/view-transition-on-navigation/root-and-nested-element-transition.html.ini b/third_party/blink/web_tests/wpt_internal/view-transition-on-navigation/root-and-nested-element-transition.html.ini
index eab0b68..26d0e98 100644
--- a/third_party/blink/web_tests/wpt_internal/view-transition-on-navigation/root-and-nested-element-transition.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/view-transition-on-navigation/root-and-nested-element-transition.html.ini
@@ -1,4 +1,2 @@
 [root-and-nested-element-transition.html]
-  expected:
-    if product == "chrome": ERROR
-    FAIL
+  expected: FAIL
diff --git a/third_party/blink/web_tests/wpt_internal/view-transition-on-navigation/root-element-transition.html.ini b/third_party/blink/web_tests/wpt_internal/view-transition-on-navigation/root-element-transition.html.ini
index b61af8a..d0ce9d2 100644
--- a/third_party/blink/web_tests/wpt_internal/view-transition-on-navigation/root-element-transition.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/view-transition-on-navigation/root-element-transition.html.ini
@@ -1,4 +1,4 @@
 [root-element-transition.html]
   expected:
-    if product == "chrome": [FAIL, ERROR]
+    if product == "chrome": ERROR
     FAIL
diff --git a/third_party/blink/web_tests/wpt_internal/webxr/ar/ar_hittestsource_lifetimes.https.html.ini b/third_party/blink/web_tests/wpt_internal/webxr/ar/ar_hittestsource_lifetimes.https.html.ini
index 04334ce..bc8ee3c 100644
--- a/third_party/blink/web_tests/wpt_internal/webxr/ar/ar_hittestsource_lifetimes.https.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/webxr/ar/ar_hittestsource_lifetimes.https.html.ini
@@ -1,4 +1,6 @@
 [ar_hittestsource_lifetimes.https.html]
+  expected:
+    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
   [Ensures hit test source cancellation propagates to the device when manually cancelled. - webgl]
     expected:
       if product == "chrome": FAIL
diff --git a/tools/flags/list_flags.py b/tools/flags/list_flags.py
index 6d44ccb..ecd3e69 100755
--- a/tools/flags/list_flags.py
+++ b/tools/flags/list_flags.py
@@ -79,6 +79,41 @@
   return unused_flags
 
 
+def filter_by_owner(flags, owner):
+  """Filter by owner flag.
+
+  Only support single owner.
+  TODO(zhagnwenyu): Support filter by multiple owners.
+
+  Need exact match and need to include @google.com or @chromium.org in the
+  argument. This is because the owner with ldap only is extended with
+  @chromium.org automatically via resolve_owners function.
+  TODO(zhangwenyu): Support filter by ldap.
+
+  >>> f1 = {'name': 'f_1', 'owners': ['b@g.com']}
+  >>> f1['resolved_owners'] = ['b@g.com']
+  >>> f2 = {'name': 'f_2', 'owners': ['z']}
+  >>> f2['resolved_owners'] = ['z@c.org']
+
+  >>> filter_by_owner([f1, f2], 'b@g.com')
+  [{'name': 'f_1', 'owners': ['b@g.com'], 'resolved_owners': ['b@g.com']}]
+  >>> filter_by_owner([f1, f2], 'z@c.org')
+  [{'name': 'f_2', 'owners': ['z'], 'resolved_owners': ['z@c.org']}]
+  >>> filter_by_owner([f1, f2], 'z') # Filter by ldap not supported.
+  []
+  >>> filter_by_owner([f1, f2], 'b@g.co') # Need exact match.
+  []
+  >>> filter_by_owner([f1, f2], 'b@g.com,z@c.org') # Multi owners not supported.
+  []
+  """
+
+  filtered_flags = []
+  for f in flags:
+    if any([owner == o for o in f['resolved_owners']]):
+      filtered_flags.append(f)
+  return filtered_flags
+
+
 def print_flags(flags, verbose):
   """Prints the supplied list of flags.
 
@@ -117,6 +152,7 @@
   group.add_argument('-n', '--never-expires', action='store_true')
   group.add_argument('-e', '--expired-by', type=int)
   group.add_argument('-u', '--find-unused', action='store_true')
+  group.add_argument('-o', '--has-owner', type=str)
   parser.add_argument('-v', '--verbose', action='store_true')
   parser.add_argument('--testonly', action='store_true')
   args = parser.parse_args()
@@ -132,6 +168,10 @@
   if args.find_unused:
     flags = find_unused(flags)
   flags = resolve_owners(flags)
+  # Filter by owner after resolving owners completed, so it understands
+  # owners file.
+  if args.has_owner:
+    flags = filter_by_owner(flags, args.has_owner)
   print_flags(flags, args.verbose)
 
 
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 0e118d4..0631b848 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -1060,9 +1060,9 @@
     },
 
     'tryserver.chromium.cft': {
-      'linux-rel-cft': 'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange_code_coverage_do_typecheck_chrome_for_testing',
-      'mac-rel-cft': 'gpu_tests_release_trybot_no_symbols_mac_code_coverage_chrome_for_testing',
-      'win-rel-cft': 'gpu_tests_release_trybot_resource_allowlisting_code_coverage_chrome_for_testing',
+      'linux-rel-cft': 'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange_do_typecheck_chrome_for_testing',
+      'mac-rel-cft': 'gpu_tests_release_trybot_no_symbols_mac_chrome_for_testing',
+      'win-rel-cft': 'gpu_tests_release_trybot_resource_allowlisting_chrome_for_testing',
     },
 
     'tryserver.chromium.chromiumos': {
@@ -2793,16 +2793,16 @@
       'gpu_tests', 'release_trybot_minimal_symbols_reclient',
     ],
 
+    'gpu_tests_release_trybot_no_symbols_mac_chrome_for_testing': [
+      'gpu_tests', 'release_trybot', 'no_symbols',
+      'chrome_for_testing',
+    ],
+
     'gpu_tests_release_trybot_no_symbols_mac_code_coverage': [
       'gpu_tests', 'release_trybot', 'no_symbols',
       'use_clang_coverage', 'partial_code_coverage_instrumentation'
     ],
 
-    'gpu_tests_release_trybot_no_symbols_mac_code_coverage_chrome_for_testing': [
-      'gpu_tests', 'release_trybot', 'no_symbols',
-      'use_clang_coverage', 'chrome_for_testing',
-    ],
-
     # Keep in sync with
     # gpu_tests_release_trybot_no_symbols_use_dummy_lastchange.
     'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange_code_coverage': [
@@ -2818,16 +2818,16 @@
       'use_clang_coverage', 'partial_code_coverage_instrumentation', 'devtools_do_typecheck',
     ],
 
-    'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange_code_coverage_do_typecheck_chrome_for_testing': [
-      'gpu_tests', 'release_trybot', 'no_symbols', 'use_dummy_lastchange',
-      'use_clang_coverage', 'devtools_do_typecheck', 'chrome_for_testing',
-    ],
-
     'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange_code_coverage_do_typecheck_reclient': [
       'gpu_tests', 'release_trybot_reclient', 'no_symbols', 'use_dummy_lastchange',
       'use_clang_coverage', 'partial_code_coverage_instrumentation', 'devtools_do_typecheck',
     ],
 
+    'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange_do_typecheck_chrome_for_testing': [
+      'gpu_tests', 'release_trybot', 'no_symbols', 'use_dummy_lastchange',
+      'devtools_do_typecheck', 'chrome_for_testing',
+    ],
+
     'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange_do_typecheck_reclient': [
       'gpu_tests', 'release_trybot_reclient', 'no_symbols', 'use_dummy_lastchange',
       'devtools_do_typecheck',
@@ -2857,16 +2857,16 @@
     # TODO(crbug.com/1004523) Delete this once coverage mode is enabled on the
     # standard Windows trybot and the dedicated coverage trybot is no longer
     # needed.
+    'gpu_tests_release_trybot_resource_allowlisting_chrome_for_testing': [
+      'gpu_tests', 'release_trybot', 'no_resource_allowlisting',
+      'chrome_for_testing',
+    ],
+
     'gpu_tests_release_trybot_resource_allowlisting_code_coverage': [
       'gpu_tests', 'release_trybot', 'no_resource_allowlisting',
       'use_clang_coverage', 'partial_code_coverage_instrumentation',
     ],
 
-    'gpu_tests_release_trybot_resource_allowlisting_code_coverage_chrome_for_testing': [
-      'gpu_tests', 'release_trybot', 'no_resource_allowlisting',
-      'use_clang_coverage', 'chrome_for_testing',
-    ],
-
     'gpu_tests_release_trybot_resource_allowlisting_code_coverage_reclient': [
       'gpu_tests', 'release_trybot_reclient', 'no_resource_allowlisting',
       'use_clang_coverage', 'partial_code_coverage_instrumentation',
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.cft.json b/tools/mb/mb_config_expectations/tryserver.chromium.cft.json
index e200dfc3..2ab7155478 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.cft.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.cft.json
@@ -9,7 +9,6 @@
       "is_debug": false,
       "proprietary_codecs": true,
       "symbol_level": 0,
-      "use_clang_coverage": true,
       "use_dummy_lastchange": true,
       "use_goma": true
     }
@@ -23,7 +22,6 @@
       "is_debug": false,
       "proprietary_codecs": true,
       "symbol_level": 0,
-      "use_clang_coverage": true,
       "use_goma": true
     }
   },
@@ -37,7 +35,6 @@
       "is_debug": false,
       "proprietary_codecs": true,
       "symbol_level": 0,
-      "use_clang_coverage": true,
       "use_goma": true
     }
   }
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 6985d5e..6281aca 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -35504,6 +35504,7 @@
   <int value="1746" label="PDFVIEWERPRIVATE_ISALLOWEDLOCALFILEACCESS"/>
   <int value="1747" label="DECLARATIVENETREQUEST_UPDATESTATICRULES"/>
   <int value="1748" label="FILEMANAGERPRIVATEINTERNAL_SEARCHFILES"/>
+  <int value="1749" label="SYSTEMLOG_ADD"/>
 </enum>
 
 <enum name="ExtensionIconState">
@@ -36139,6 +36140,7 @@
   <int value="243" label="kWebRequestAuthProvider"/>
   <int value="244" label="kChromeOSTelemetryNetworkInformation"/>
   <int value="245" label="kPdfViewerPrivate"/>
+  <int value="246" label="kSystemLog"/>
 </enum>
 
 <enum name="ExtensionPointEnableState">
@@ -60978,6 +60980,7 @@
   <int value="103932290" label="show-autofill-type-predictions"/>
   <int value="105046382" label="ParallelDownloading:disabled"/>
   <int value="105284154" label="PromiseIcons:enabled"/>
+  <int value="106235373" label="LauncherSystemInfoAnswerCards:enabled"/>
   <int value="106744400" label="OmniboxModernizeVisualUpdate:enabled"/>
   <int value="106840653" label="mus"/>
   <int value="107358678" label="GalleryAppPdfEditNotification:enabled"/>
@@ -62612,6 +62615,7 @@
   <int value="1073699828" label="ScrollUpdateOptimizations:enabled"/>
   <int value="1074359194" label="UseSuggestionsEvenIfFew:enabled"/>
   <int value="1074427701" label="NewPrintPreviewLayout:enabled"/>
+  <int value="1075191614" label="LauncherSystemInfoAnswerCards:disabled"/>
   <int value="1075637651" label="disable-tablet-splitview"/>
   <int value="1075862390" label="LauncherItemSuggest:enabled"/>
   <int value="1076335895" label="CrosPrivacyHubV0:enabled"/>
diff --git a/tools/metrics/histograms/metadata/accessibility/histograms.xml b/tools/metrics/histograms/metadata/accessibility/histograms.xml
index a5bba219..72923ed0 100644
--- a/tools/metrics/histograms/metadata/accessibility/histograms.xml
+++ b/tools/metrics/histograms/metadata/accessibility/histograms.xml
@@ -2177,7 +2177,7 @@
 </histogram>
 
 <histogram name="DomDistiller.Time.ViewingReaderModePage" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>mdjones@chromium.org</owner>
   <summary>
     Records the amount of time a user spent on a Reader Mode Page.
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml
index 83981cf..7a79a98b 100644
--- a/tools/metrics/histograms/metadata/android/histograms.xml
+++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -187,7 +187,7 @@
 </histogram>
 
 <histogram name="Android.AdaptiveToolbarButton.Clicked"
-    enum="AdaptiveToolbarButtonVariant" expires_after="2023-04-30">
+    enum="AdaptiveToolbarButtonVariant" expires_after="2023-07-02">
   <owner>bttk@chromium.org</owner>
   <owner>chrome-segmentation-platform@google.com</owner>
   <summary>
@@ -197,7 +197,7 @@
 </histogram>
 
 <histogram name="Android.AdaptiveToolbarButton.SessionVariant"
-    enum="AdaptiveToolbarButtonVariant" expires_after="2023-04-30">
+    enum="AdaptiveToolbarButtonVariant" expires_after="2023-07-02">
   <owner>bttk@chromium.org</owner>
   <owner>chrome-segmentation-platform@google.com</owner>
   <summary>
@@ -241,7 +241,7 @@
 </histogram>
 
 <histogram name="Android.AdaptiveToolbarButton.SettingsToggle.Startup"
-    enum="BooleanEnabled" expires_after="2023-04-30">
+    enum="BooleanEnabled" expires_after="2023-07-02">
   <owner>shaktisahu@chromium.org</owner>
   <owner>chrome-segmentation-platform@google.com</owner>
   <summary>
@@ -543,7 +543,7 @@
 </histogram>
 
 <histogram name="Android.BackPress.Intercept" enum="BackPressConsumer"
-    expires_after="M114">
+    expires_after="2023-07-02">
   <owner>lazzzis@chromium.org</owner>
   <owner>src/chrome/browser/back_press/android/OWNERS</owner>
   <summary>
@@ -552,7 +552,7 @@
 </histogram>
 
 <histogram name="Android.BackPress.MinimizeAppAndCloseTab"
-    enum="MinimizeAppAndCloseTabType" expires_after="M114">
+    enum="MinimizeAppAndCloseTabType" expires_after="2023-07-02">
   <owner>lazzzis@chromium.org</owner>
   <owner>src/chrome/browser/back_press/android/OWNERS</owner>
   <summary>
@@ -2189,7 +2189,7 @@
 </histogram>
 
 <histogram name="Android.MultiInstance.NumActivities" units="activities"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>jinsukkim@chromium.org</owner>
   <owner>twellington@chromium.org</owner>
   <owner>clank-app-team@google.com</owner>
@@ -2204,7 +2204,7 @@
 </histogram>
 
 <histogram name="Android.MultiInstance.NumInstances" units="instances"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>jinsukkim@chromium.org</owner>
   <owner>twellington@chromium.org</owner>
   <owner>clank-app-team@google.com</owner>
@@ -3072,7 +3072,7 @@
 </histogram>
 
 <histogram name="Android.PlayServices.Version" units="versioncode"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>twellington@chromium.org</owner>
   <owner>tedchoc@chromium.org</owner>
   <summary>
@@ -3200,7 +3200,7 @@
 </histogram>
 
 <histogram name="Android.Rotation.BeginToRendererFrameActivation" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>jonross@chromium.org</owner>
   <owner>graphics-dev@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/apps/histograms.xml b/tools/metrics/histograms/metadata/apps/histograms.xml
index 2447cb6..0886ed09 100644
--- a/tools/metrics/histograms/metadata/apps/histograms.xml
+++ b/tools/metrics/histograms/metadata/apps/histograms.xml
@@ -166,7 +166,7 @@
 </variants>
 
 <histogram name="AppManagement.AppDetailViews" enum="AppManagementUserAction"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
 <!-- Name completed by histogram_suffixes name="AppType" -->
 
   <owner>jshikaram@chromium.org</owner>
@@ -550,7 +550,7 @@
 </histogram>
 
 <histogram name="Apps.AppList.GameProvider.SearchStatus"
-    enum="GameProviderSearchStatus" expires_after="2023-04-30">
+    enum="GameProviderSearchStatus" expires_after="2023-07-02">
   <owner>wrong@chromium.org</owner>
   <owner>amandadeacon@chromium.org</owner>
   <summary>
@@ -630,7 +630,7 @@
 </histogram>
 
 <histogram name="Apps.AppList.ItemSuggestCache.UpdateCacheLatency" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>wrong@chromium.org</owner>
   <owner>tby@chromium.org</owner>
   <owner>thanhdng@chromium.org</owner>
@@ -1024,7 +1024,7 @@
 </histogram>
 
 <histogram name="Apps.AppList.SortDiscoveryDurationAfterEducationNudge"
-    units="ms" expires_after="2023-06-25">
+    units="ms" expires_after="2023-07-02">
   <owner>andrewxu@chromium.org</owner>
   <owner>tbarzic@chromium.org</owner>
   <summary>
@@ -1489,7 +1489,7 @@
 </histogram>
 
 <histogram name="Apps.AppListLauncherClickedSearchQueryLength"
-    units="characters" expires_after="2023-04-30">
+    units="characters" expires_after="2023-07-02">
   <owner>wrong@chromium.org</owner>
   <owner>tby@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/arc/histograms.xml b/tools/metrics/histograms/metadata/arc/histograms.xml
index 6ef39eda..97aa7121 100644
--- a/tools/metrics/histograms/metadata/arc/histograms.xml
+++ b/tools/metrics/histograms/metadata/arc/histograms.xml
@@ -259,7 +259,7 @@
   </summary>
 </histogram>
 
-<histogram name="Arc.AndroidBootTime" units="ms" expires_after="2023-04-30">
+<histogram name="Arc.AndroidBootTime" units="ms" expires_after="2023-07-02">
   <owner>khmel@google.com</owner>
   <owner>arc-performance@google.com</owner>
   <summary>The time elapsed for booting up the ARC instance.</summary>
@@ -829,7 +829,7 @@
 </histogram>
 
 <histogram name="Arc.ClipboardDragDrop" enum="ArcClipboardDragDropEvent"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>yhanada@google.com</owner>
   <owner>arc-framework@google.com</owner>
   <summary>The number of clipboard and drag-and-drop events.</summary>
@@ -1073,7 +1073,7 @@
 </histogram>
 
 <histogram name="Arc.DataRestore.Status" enum="ArcDataRestoreStatus"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>khmel@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -1195,7 +1195,7 @@
 </histogram>
 
 <histogram name="Arc.FirstAppLaunchDelay.TimeDelta" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>khmel@google.com</owner>
   <owner>arc-performance@google.com</owner>
   <summary>
@@ -1209,7 +1209,7 @@
 </histogram>
 
 <histogram name="Arc.FirstAppLaunchDelay.TimeDeltaUntilAppLaunch" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>khmel@google.com</owner>
   <owner>alanding@google.com</owner>
   <summary>
@@ -2026,7 +2026,7 @@
 </histogram>
 
 <histogram name="Arc.Runtime.Performance.Generic.FirstFrameRendered" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>khmel@google.com</owner>
   <owner>alanding@google.com</owner>
   <summary>
@@ -2047,7 +2047,7 @@
 </histogram>
 
 <histogram name="Arc.Runtime.Performance.Generic.Jankiness" units="%"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>khmel@google.com</owner>
   <owner>alanding@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index 1a0b856..86a317d 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -1386,7 +1386,7 @@
 </histogram>
 
 <histogram name="Ash.DarkTheme.SystemTray.IsDarkModeEnabled" enum="Boolean"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>minch@chromium.org</owner>
   <owner>changmar@chromium.org</owner>
   <summary>
@@ -1472,7 +1472,7 @@
 </histogram>
 
 <histogram name="Ash.Desks.AssignToAllDesksSource"
-    enum="DesksAssignToAllDesksSource" expires_after="2023-04-30">
+    enum="DesksAssignToAllDesksSource" expires_after="2023-07-02">
   <owner>zxdan@chromium.org</owner>
   <owner>janetmac@chromium.org</owner>
   <summary>
@@ -1544,7 +1544,7 @@
 </histogram>
 
 <histogram name="Ash.Desks.ConsecutiveDailyVisits" units="days"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>afakhry@chromium.org</owner>
   <owner>janetmac@chromium.org</owner>
   <summary>
@@ -1662,7 +1662,7 @@
 </histogram>
 
 <histogram name="Ash.Desks.NumberOfDeskTraversals" units="units"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>afakhry@chromium.org</owner>
   <owner>sammiequon@chromium.org</owner>
   <owner>tclaiborne@chromium.org</owner>
@@ -2547,7 +2547,7 @@
 </histogram>
 
 <histogram name="Ash.Glanceables.SignoutScreenshotDuration" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>jamescook@chromium.org</owner>
   <owner>tbarzic@chromium.org</owner>
   <summary>
@@ -2590,7 +2590,7 @@
 </histogram>
 
 <histogram name="Ash.HotseatTransition.Drag.PresentationTime" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>anasalazar@chromium.org</owner>
   <owner>newcomer@chromium.org</owner>
   <summary>
@@ -2817,7 +2817,7 @@
 </histogram>
 
 <histogram name="Ash.Login.Login.AuthMethod.Used.TabletMode" enum="AuthMethod"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>emaamari@google.com</owner>
   <owner>cros-lurs@google.com</owner>
   <summary>
@@ -2945,7 +2945,7 @@
 </histogram>
 
 <histogram name="Ash.Media.CameraPrivacySwitch.Event"
-    enum="CameraPrivacySwitchEvent" expires_after="2023-05-01">
+    enum="CameraPrivacySwitchEvent" expires_after="2023-07-02">
   <owner>tbarzic@chromium.org</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -2963,7 +2963,7 @@
 </histogram>
 
 <histogram name="Ash.Media.CameraPrivacySwitch.TimeFromNotificationToOff"
-    units="5 seconds" expires_after="2023-05-01">
+    units="5 seconds" expires_after="2023-07-02">
   <owner>tbarzic@chromium.org</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -3064,7 +3064,7 @@
 </histogram>
 
 <histogram name="Ash.NightLight.AutoNightLightNotificationState"
-    enum="AshAutoNightLightNotificationState" expires_after="2023-05-01">
+    enum="AshAutoNightLightNotificationState" expires_after="2023-07-02">
   <owner>afakhry@chromium.org</owner>
   <owner>tclaiborne@chromium.org</owner>
   <summary>
@@ -3086,7 +3086,7 @@
 </histogram>
 
 <histogram name="Ash.NightLight.ScheduleType" enum="AshNightLightScheduleType"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>afakhry@chromium.org</owner>
   <owner>tclaiborne@chromium.org</owner>
   <summary>
@@ -3130,7 +3130,7 @@
 </histogram>
 
 <histogram name="Ash.Notification.CountOfNotificationsInOneGroup"
-    units="Notifications" expires_after="2023-04-30">
+    units="Notifications" expires_after="2023-07-02">
   <owner>leandre@chromium.org</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -4714,7 +4714,7 @@
 </histogram>
 
 <histogram name="Ash.SplitView.TimeInMultiDisplaySplitView" units="ms"
-    expires_after="2023-04-23">
+    expires_after="2023-07-02">
   <owner>amusbach@chromium.org</owner>
   <owner>xdai@chromium.org</owner>
   <summary>
@@ -4934,7 +4934,7 @@
 </histogram>
 
 <histogram name="Ash.SwipeHomeToOverviewGesture"
-    enum="SwipeHomeToOverviewResult" expires_after="2023-05-01">
+    enum="SwipeHomeToOverviewResult" expires_after="2023-07-02">
   <owner>andrewxu@chromium.org</owner>
   <owner>tbarzic@chromium.org</owner>
   <summary>
@@ -4966,7 +4966,7 @@
 </histogram>
 
 <histogram name="Ash.TabDrag.PresentationTime" units="ms"
-    expires_after="2023-04-23">
+    expires_after="2023-07-02">
 <!-- Name completed by histogram_suffixes
      name="TabletOrClamshellMode" -->
 
@@ -5601,7 +5601,7 @@
 </histogram>
 
 <histogram name="Ash.WindowCycleController.Items" units="items"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>sammiequon@chromium.org</owner>
   <owner>tclaiborne@chromium.org</owner>
   <owner>xdai@chromium.org</owner>
@@ -5624,7 +5624,7 @@
 </histogram>
 
 <histogram name="Ash.WindowCycleController.SwitchMode" enum="AltTabMode"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>afakhry@chromium.org</owner>
   <owner>xdai@chromium.org</owner>
   <owner>tclaiborne@chromium.org</owner>
@@ -5740,7 +5740,7 @@
 </histogram>
 
 <histogram name="Ash.Wm.WindowSnapActionSource" enum="WindowSnapActionSource"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>xdai@chromium.org</owner>
   <owner>nupurjain@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/assistant/histograms.xml b/tools/metrics/histograms/metadata/assistant/histograms.xml
index da3b3ee8..8a200f3e 100644
--- a/tools/metrics/histograms/metadata/assistant/histograms.xml
+++ b/tools/metrics/histograms/metadata/assistant/histograms.xml
@@ -35,7 +35,7 @@
 </variants>
 
 <histogram name="Assistant.BetterOnboarding.Click"
-    enum="AssistantBetterOnboardingType" expires_after="2023-05-01">
+    enum="AssistantBetterOnboardingType" expires_after="2023-07-02">
   <owner>xiaohuic@chromium.org</owner>
   <owner>croissant-eng@chromium.org</owner>
   <summary>
@@ -105,7 +105,7 @@
 </histogram>
 
 <histogram name="Assistant.Interaction.Resolution"
-    enum="AssistantInteractionResolution" expires_after="2023-05-01">
+    enum="AssistantInteractionResolution" expires_after="2023-07-02">
   <owner>xiaohuic@chromium.org</owner>
   <owner>croissant-eng@chromium.org</owner>
   <summary>
@@ -179,7 +179,7 @@
 </histogram>
 
 <histogram name="Assistant.QuerySource" enum="AssistantQuerySource"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>xiaohuic@chromium.org</owner>
   <owner>croissant-eng@chromium.org</owner>
   <summary>
@@ -189,7 +189,7 @@
 </histogram>
 
 <histogram name="Assistant.ServiceEnabledUserCount" enum="BooleanEnabled"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>xiaohuic@chromium.org</owner>
   <owner>croissant-eng@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/auto/histograms.xml b/tools/metrics/histograms/metadata/auto/histograms.xml
index f8bb063a..cb472ea 100644
--- a/tools/metrics/histograms/metadata/auto/histograms.xml
+++ b/tools/metrics/histograms/metadata/auto/histograms.xml
@@ -329,7 +329,7 @@
 </histogram>
 
 <histogram name="AutoScreenBrightness.MissingAlsWhenBrightnessChanged"
-    enum="BooleanError" expires_after="2023-04-30">
+    enum="BooleanError" expires_after="2023-07-02">
   <owner>wrong@chromium.org</owner>
   <owner>tby@chromium.org</owner>
   <owner>thanhdng@chromium.org</owner>
@@ -339,7 +339,7 @@
 </histogram>
 
 <histogram name="AutoScreenBrightness.MissingPriorUserBrightnessRequest"
-    enum="BooleanError" expires_after="2023-04-30">
+    enum="BooleanError" expires_after="2023-07-02">
   <owner>wrong@chromium.org</owner>
   <owner>tby@chromium.org</owner>
   <owner>thanhdng@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml
index a6bf05cc..d5553ed 100644
--- a/tools/metrics/histograms/metadata/autofill/histograms.xml
+++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -2979,7 +2979,7 @@
 </histogram>
 
 <histogram name="Autofill.ProfileImport.NewProfileDecision"
-    enum="AutofillProfileImportDecision" expires_after="2023-04-30">
+    enum="AutofillProfileImportDecision" expires_after="2023-07-02">
   <owner>koerber@google.com</owner>
   <owner>src/components/autofill/OWNERS</owner>
   <summary>
@@ -3026,7 +3026,7 @@
 
 <histogram
     name="Autofill.ProfileImport.NewProfileWithComplementedCountryDecision"
-    enum="AutofillProfileImportDecision" expires_after="2023-04-30">
+    enum="AutofillProfileImportDecision" expires_after="2023-07-02">
   <owner>fleimgruber@google.com</owner>
   <owner>chrome-autofill-team@google.com</owner>
   <summary>
@@ -3078,7 +3078,7 @@
 </histogram>
 
 <histogram name="Autofill.ProfileImport.ProfileImportType"
-    enum="AutofillProfileImportType" expires_after="2023-04-30">
+    enum="AutofillProfileImportType" expires_after="2023-07-02">
   <owner>koerber@google.com</owner>
   <owner>src/components/autofill/OWNERS</owner>
   <summary>
@@ -3101,7 +3101,7 @@
 
 <histogram
     name="Autofill.ProfileImport.SilentUpdatesWithRemovedPhoneNumberProfileImportType"
-    enum="AutofillSilentUpdatesProfileImportType" expires_after="2023-04-30">
+    enum="AutofillSilentUpdatesProfileImportType" expires_after="2023-07-02">
   <owner>fleimgruber@google.com</owner>
   <owner>chrome-autofill-team@google.com</owner>
   <summary>
@@ -3158,7 +3158,7 @@
 </histogram>
 
 <histogram name="Autofill.ProfileImport.UpdateProfileDecision"
-    enum="AutofillProfileImportDecision" expires_after="2023-04-30">
+    enum="AutofillProfileImportDecision" expires_after="2023-07-02">
   <owner>koerber@google.com</owner>
   <owner>src/components/autofill/OWNERS</owner>
   <summary>
@@ -3674,7 +3674,7 @@
 </histogram>
 
 <histogram name="Autofill.StoredCreditCardCount.Server.WithVirtualCardMetadata"
-    units="units" expires_after="2023-05-01">
+    units="units" expires_after="2023-07-02">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -4073,7 +4073,7 @@
 </histogram>
 
 <histogram name="Autofill.UnmaskPrompt.GetRealPanDuration" units="ms"
-    expires_after="2023-04-01">
+    expires_after="2023-07-02">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml
index 977b27aa..eeacb1be 100644
--- a/tools/metrics/histograms/metadata/blink/histograms.xml
+++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -1304,7 +1304,7 @@
 </histogram>
 
 <histogram name="Blink.Frame.GetCanonicalUrlRendererTime" units="microseconds"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>carlosk@chromium.org</owner>
   <owner>harringtond@chromium.org</owner>
   <owner>feed@chromium.org</owner>
@@ -3240,7 +3240,7 @@
 </histogram>
 
 <histogram base="true" name="Blink.UserDrivenDocumentUpdate.UpdateTime"
-    units="microseconds" expires_after="2023-04-30">
+    units="microseconds" expires_after="2023-07-02">
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePreFCPSuffixes" -->
 
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePostFCPSuffixes" -->
diff --git a/tools/metrics/histograms/metadata/bluetooth/histograms.xml b/tools/metrics/histograms/metadata/bluetooth/histograms.xml
index 8e28ce5..b5d5d1e4 100644
--- a/tools/metrics/histograms/metadata/bluetooth/histograms.xml
+++ b/tools/metrics/histograms/metadata/bluetooth/histograms.xml
@@ -298,7 +298,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.AccountKey.Write.TotalTime"
-    units="ms" expires_after="2023-04-30">
+    units="ms" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -313,7 +313,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.ConfirmPasskey.Latency" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -325,7 +325,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.ConnectDevice.Result"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -339,7 +339,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.CreateScanFilter.Result"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -352,7 +352,7 @@
 
 <histogram
     name="Bluetooth.ChromeOS.FastPair.DeviceMetadataFetcher.Get.HttpResponseError"
-    enum="HttpResponseCode" expires_after="2023-04-30">
+    enum="HttpResponseCode" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -375,7 +375,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.DeviceMetadataFetcher.Result"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -386,7 +386,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.Discovered.Version"
-    enum="FastPairVersion" expires_after="2023-04-30">
+    enum="FastPairVersion" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -568,7 +568,7 @@
 
 <histogram
     name="Bluetooth.ChromeOS.FastPair.FastPairDataEncryptor.CreateResult"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -603,7 +603,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.FastPairRepository.Cache.Result"
-    enum="Boolean" expires_after="2023-04-30">
+    enum="Boolean" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -616,7 +616,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.FootprintsFetcher.Delete.Result"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -629,7 +629,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.FootprintsFetcher.Get.Result"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -642,7 +642,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.FootprintsFetcher.Post.Result"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -728,7 +728,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.GattConnection.Result"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -740,7 +740,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.Handshake.FailureReason"
-    enum="FastPairHandshakeFailureReason" expires_after="2023-04-30">
+    enum="FastPairHandshakeFailureReason" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -752,7 +752,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.Handshake.Result"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -790,7 +790,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.KeyBasedPairing.DecryptResult"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -855,7 +855,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.KeyBasedPairing.Write.Result"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -867,7 +867,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.KeyGenerationResult"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -880,7 +880,7 @@
 
 <histogram
     name="Bluetooth.ChromeOS.FastPair.MessageStream.ConnectToService.ErrorReason"
-    enum="BluetoothSocketErrorReason" expires_after="2023-04-30">
+    enum="BluetoothSocketErrorReason" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -894,7 +894,7 @@
 
 <histogram
     name="Bluetooth.ChromeOS.FastPair.MessageStream.ConnectToService.Result"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -907,7 +907,7 @@
 
 <histogram
     name="Bluetooth.ChromeOS.FastPair.MessageStream.ConnectToService.TotalConnectTime"
-    units="ms" expires_after="2023-04-30">
+    units="ms" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -919,7 +919,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.MessageStream.Receive.ErrorReason"
-    enum="BluetoothConnectToServiceError" expires_after="2023-04-30">
+    enum="BluetoothConnectToServiceError" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -932,7 +932,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.MessageStream.Receive.Result"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -945,7 +945,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.NavigateToSettings.Result"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -1025,7 +1025,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.PairingMethod"
-    enum="FastPairPairingMethod" expires_after="2023-04-30">
+    enum="FastPairPairingMethod" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -1040,7 +1040,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.PairRetry.Count" units="count"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -1053,7 +1053,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.Passkey.Decrypt.Result"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -1115,7 +1115,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.Passkey.Write.Result"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -1297,7 +1297,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.RetroactivePairing.Result"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -1309,7 +1309,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.SavedDevices.DeviceCount"
-    units="devices" expires_after="2023-04-30">
+    units="devices" expires_after="2023-07-02">
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1321,7 +1321,7 @@
 
 <histogram
     name="Bluetooth.ChromeOS.FastPair.SavedDevices.GetSavedDevices.Result"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1333,7 +1333,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.SavedDevices.Remove.Result"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1345,7 +1345,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.SavedDevices.TotalUxLoadTime"
-    units="ms" expires_after="2023-04-30">
+    units="ms" expires_after="2023-07-02">
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1363,7 +1363,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.SavedDevices.UiEvent"
-    enum="FastPairSavedDevicesUiEvent" expires_after="2023-04-30">
+    enum="FastPairSavedDevicesUiEvent" expires_after="2023-07-02">
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1402,7 +1402,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.Scanner.StartSession.Result"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -1414,7 +1414,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.TotalGattConnectionTime"
-    units="ms" expires_after="2023-04-30">
+    units="ms" expires_after="2023-07-02">
   <owner>shanefitz@google.com</owner>
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -1680,7 +1680,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ConnectedDeviceCount" units="devices"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>adlr@chromium.org</owner>
   <summary>
     Counts the number of simulataneously connected Bluetooth devices. Used to
@@ -1701,7 +1701,7 @@
 
 <histogram name="Bluetooth.Linux.ConnectToService.Bonded.FailureReason"
     enum="BluetoothDeviceConnectToServiceFailureReason"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>hansenmichael@google.com</owner>
   <owner>nearby-share-chromeos-eng@google.com</owner>
   <summary>
@@ -1713,7 +1713,7 @@
 
 <histogram name="Bluetooth.Linux.ConnectToService.FailureReason"
     enum="BluetoothDeviceConnectToServiceFailureReason"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>hansenmichael@google.com</owner>
   <owner>nearby-share-chromeos-eng@google.com</owner>
   <summary>
@@ -1724,7 +1724,7 @@
 
 <histogram name="Bluetooth.Linux.ConnectToServiceInsecurelyResult"
     enum="BluetoothAdapterConnectToServiceInsecurelyResult"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>hansenmichael@google.com</owner>
   <owner>nearby-share-chromeos-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/browser/histograms.xml b/tools/metrics/histograms/metadata/browser/histograms.xml
index ef09566..808d962 100644
--- a/tools/metrics/histograms/metadata/browser/histograms.xml
+++ b/tools/metrics/histograms/metadata/browser/histograms.xml
@@ -661,7 +661,7 @@
 </histogram>
 
 <histogram name="Browser.WindowCount.Guest" units="units"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>rhalavati@chromium.org</owner>
   <owner>chrome-privacy-core@google.com</owner>
   <summary>
@@ -673,7 +673,7 @@
 </histogram>
 
 <histogram name="Browser.WindowCount.Incognito" units="units"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>rhalavati@chromium.org</owner>
   <owner>chrome-privacy-core@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml
index ac68b1d3..c243813 100644
--- a/tools/metrics/histograms/metadata/chromeos/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -596,7 +596,7 @@
 </histogram>
 
 <histogram name="ChromeOS.CWP.CollectPerf"
-    enum="ChromeOSProfileCollectionStatus" expires_after="2023-05-01">
+    enum="ChromeOSProfileCollectionStatus" expires_after="2023-07-02">
   <owner>aalexand@google.com</owner>
   <owner>gmx@chromium.org</owner>
   <owner>cwp-team@google.com</owner>
@@ -631,7 +631,7 @@
 </histogram>
 
 <histogram name="ChromeOS.CWP.ParseCPUFrequencies"
-    enum="ChromeOSParseCPUFrequencyStatus" expires_after="2023-05-01">
+    enum="ChromeOSParseCPUFrequencyStatus" expires_after="2023-07-02">
   <owner>gmx@chromium.org</owner>
   <owner>cwp-team@google.com</owner>
   <summary>
@@ -995,7 +995,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Gaia.Done.ElapsedTime" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>bchikhaoui@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -1036,7 +1036,7 @@
 </histogram>
 
 <histogram base="true" name="ChromeOS.HardwareVerifier.Report"
-    enum="HardwareVerifierQualificationStatus" expires_after="2023-04-30">
+    enum="HardwareVerifierQualificationStatus" expires_after="2023-07-02">
 <!-- Name completed by histogram_suffixes name="HardwareVerifierSupportCategory" -->
 
   <owner>itspeter@chromium.org</owner>
@@ -1049,7 +1049,7 @@
 </histogram>
 
 <histogram name="ChromeOS.HardwareVerifier.Report.IsCompliant" enum="Boolean"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>itspeter@chromium.org</owner>
   <owner>stimim@chromium.org</owner>
   <owner>chromeos-runtime-probe@google.com</owner>
@@ -1067,7 +1067,7 @@
 </histogram>
 
 <histogram name="ChromeOS.HardwareVerifier.TimeToProbe" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>itspeter@chromium.org</owner>
   <owner>stimim@chromium.org</owner>
   <owner>chromeos-runtime-probe@google.com</owner>
@@ -1085,6 +1085,8 @@
     of a survey and when a user answers any question on a HaTS survey.
   </summary>
   <token key="Survey">
+    <variant name="General"/>
+    <variant name="Performance"/>
     <variant name="Stability"/>
   </token>
 </histogram>
@@ -1183,7 +1185,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Intents.IntentPickerAction"
-    enum="IntentPickerDialogAction" expires_after="2023-06-25">
+    enum="IntentPickerDialogAction" expires_after="2023-07-02">
   <owner>tsergeant@chromium.org</owner>
   <owner>chromeos-apps-foundation-team@google.com</owner>
   <summary>
@@ -1254,7 +1256,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Intents.LinkCapturingEvent2"
-    enum="LinkCapturingEvent" expires_after="2023-06-25">
+    enum="LinkCapturingEvent" expires_after="2023-07-02">
   <owner>vpao@google.com</owner>
   <owner>chromeos-apps-foundation-team@google.com</owner>
   <summary>
@@ -1806,7 +1808,7 @@
 </histogram>
 
 <histogram name="ChromeOS.SAML.Provider" enum="ChromeOSSamlProvider"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>mslus@chromium.org</owner>
   <owner>mohammedabdon@chromium.org</owner>
   <summary>Records SAML provider when SAML login flow is used.</summary>
diff --git a/tools/metrics/histograms/metadata/commerce/histograms.xml b/tools/metrics/histograms/metadata/commerce/histograms.xml
index d7715dd..87738fbc 100644
--- a/tools/metrics/histograms/metadata/commerce/histograms.xml
+++ b/tools/metrics/histograms/metadata/commerce/histograms.xml
@@ -530,7 +530,7 @@
 </histogram>
 
 <histogram name="Commerce.Subscriptions.UntrackResult"
-    enum="ShoppingSubscriptionsRequestStatus" expires_after="2023-04-25">
+    enum="ShoppingSubscriptionsRequestStatus" expires_after="2023-07-02">
   <owner>zhiyuancai@chromium.org</owner>
   <owner>ayman@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/compositing/histograms.xml b/tools/metrics/histograms/metadata/compositing/histograms.xml
index 1b9198b..ca359d596 100644
--- a/tools/metrics/histograms/metadata/compositing/histograms.xml
+++ b/tools/metrics/histograms/metadata/compositing/histograms.xml
@@ -183,7 +183,7 @@
 </histogram>
 
 <histogram name="Compositing.DirectRenderer.PartialSwap.RootDamage" units="%"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>vasilyt@chromium.org</owner>
   <owner>backer@chromium.org</owner>
   <summary>
@@ -734,7 +734,7 @@
 </histogram>
 
 <histogram name="Compositing.SurfaceAggregator.AggregateUs"
-    units="microseconds" expires_after="2023-04-30">
+    units="microseconds" expires_after="2023-07-02">
   <owner>kylechar@chromium.org</owner>
   <owner>graphics-dev@chromium.org</owner>
   <summary>
@@ -760,7 +760,7 @@
 </histogram>
 
 <histogram name="Compositing.SurfaceAggregator.CopyUs" units="microseconds"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>kylechar@chromium.org</owner>
   <owner>jonross@chromium.org</owner>
   <summary>
@@ -955,7 +955,7 @@
 </histogram>
 
 <histogram name="Graphics.Smoothness.95pctPercentDroppedFrames_1sWindow"
-    units="%" expires_after="2023-04-30">
+    units="%" expires_after="2023-07-02">
   <owner>jonross@chromium.org</owner>
   <owner>graphics-dev@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/content/histograms.xml b/tools/metrics/histograms/metadata/content/histograms.xml
index f234464..d5ed9d2d 100644
--- a/tools/metrics/histograms/metadata/content/histograms.xml
+++ b/tools/metrics/histograms/metadata/content/histograms.xml
@@ -971,7 +971,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.ContentAgeOnLoad.BlockingRefresh"
-    units="ms" expires_after="2023-04-30">
+    units="ms" expires_after="2023-07-02">
   <owner>carlosk@chromium.org</owner>
   <owner>harringtond@chromium.org</owner>
   <owner>feed@chromium.org</owner>
@@ -985,7 +985,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.ContentAgeOnLoad.NotRefreshed"
-    units="ms" expires_after="2023-04-30">
+    units="ms" expires_after="2023-07-02">
   <owner>carlosk@chromium.org</owner>
   <owner>harringtond@chromium.org</owner>
   <owner>feed@chromium.org</owner>
@@ -1068,7 +1068,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.ContentLifetime.InvalidAge" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>birnie@google.com</owner>
   <owner>feed@chromium.org</owner>
   <summary>
@@ -1124,7 +1124,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.DisplayStatusOnOpen"
-    enum="ContentSuggestionsDisplayStatus" expires_after="2023-04-30">
+    enum="ContentSuggestionsDisplayStatus" expires_after="2023-07-02">
   <owner>carlosk@chromium.org</owner>
   <owner>harringtond@chromium.org</owner>
   <owner>feed@chromium.org</owner>
@@ -1137,7 +1137,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.ImageFetchStatus"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2023-04-30">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2023-07-02">
   <owner>harringtond@chromium.org</owner>
   <owner>feed@chromium.org</owner>
   <summary>
@@ -1148,7 +1148,7 @@
 </histogram>
 
 <histogram base="true" name="ContentSuggestions.Feed.LoadStepLatency"
-    units="ms" expires_after="2023-04-30">
+    units="ms" expires_after="2023-07-02">
   <owner>harringtond@chromium.org</owner>
   <owner>feed@chromium.org</owner>
   <summary>
@@ -1162,7 +1162,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.LoadStreamStatus.LoadMore"
-    enum="FeedLoadStreamStatus" expires_after="2023-04-30">
+    enum="FeedLoadStreamStatus" expires_after="2023-07-02">
   <owner>harringtond@chromium.org</owner>
   <owner>carlosk@chromium.org</owner>
   <owner>feed@chromium.org</owner>
@@ -1242,7 +1242,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.Network.ResponseSizeKB" units="KB"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>carlosk@chromium.org</owner>
   <owner>harringtond@chromium.org</owner>
   <owner>feed@chromium.org</owner>
@@ -1530,7 +1530,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.TimeSpentInFeed" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>carlosk@chromium.org</owner>
   <owner>harringtond@chromium.org</owner>
   <owner>feed@chromium.org</owner>
@@ -1616,7 +1616,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.UploadActionsStatus"
-    enum="FeedUploadActionsStatus" expires_after="2023-04-30">
+    enum="FeedUploadActionsStatus" expires_after="2023-07-02">
   <owner>iwells@chromium.org</owner>
   <owner>harringtond@chromium.org</owner>
   <owner>feed@chromium.org</owner>
@@ -1628,7 +1628,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.UploadVisibilityLog" enum="Boolean"
-    expires_after="2023-06-25">
+    expires_after="2023-07-02">
   <owner>freedjm@google.com</owner>
   <owner>feed@chromium.org</owner>
   <summary>
@@ -1650,7 +1650,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.UserActions" enum="FeedUserActionType"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>harringtond@chromium.org</owner>
   <owner>carlosk@chromium.org</owner>
   <owner>feed@chromium.org</owner>
@@ -1750,7 +1750,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.UserSettingsOnStart"
-    enum="FeedUserSettingsOnStart" expires_after="2023-04-30">
+    enum="FeedUserSettingsOnStart" expires_after="2023-07-02">
   <owner>carlosk@chromium.org</owner>
   <owner>harringtond@chromium.org</owner>
   <owner>feed@chromium.org</owner>
@@ -1787,7 +1787,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.VisibilityLoggingEnabled"
-    enum="Boolean" expires_after="2023-04-30">
+    enum="Boolean" expires_after="2023-07-02">
   <owner>freedjm@google.com</owner>
   <owner>feed@chromium.org</owner>
   <summary>
@@ -1825,7 +1825,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.WebFeed.FollowCount.Engaged"
-    units="follows" expires_after="2023-06-25">
+    units="follows" expires_after="2023-07-02">
   <owner>harringtond@chromium.org</owner>
   <owner>feed@chromium.org</owner>
   <summary>
@@ -1859,7 +1859,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.WebFeed.FollowUriResult"
-    enum="WebFeedSubscriptionRequestStatus" expires_after="2023-04-30">
+    enum="WebFeedSubscriptionRequestStatus" expires_after="2023-07-02">
   <owner>harringtond@chromium.org</owner>
   <owner>feed@chromium.org</owner>
   <summary>
@@ -1914,7 +1914,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.WebFeed.NewFollow.IsRecommended"
-    enum="Boolean" expires_after="2023-04-30">
+    enum="Boolean" expires_after="2023-07-02">
   <owner>harringtond@chromium.org</owner>
   <owner>feed@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/cookie/histograms.xml b/tools/metrics/histograms/metadata/cookie/histograms.xml
index 46d05046..5585c8aa 100644
--- a/tools/metrics/histograms/metadata/cookie/histograms.xml
+++ b/tools/metrics/histograms/metadata/cookie/histograms.xml
@@ -265,7 +265,7 @@
 </histogram>
 
 <histogram name="Cookie.DaysSinceRefreshForRetrieval" units="days"
-    expires_after="M114">
+    expires_after="2023-07-02">
   <owner>arichiv@chromium.org</owner>
   <owner>bingler@chromium.org</owner>
   <summary>
@@ -289,7 +289,7 @@
   </summary>
 </histogram>
 
-<histogram name="Cookie.DomainSet" enum="Boolean" expires_after="2023-04-30">
+<histogram name="Cookie.DomainSet" enum="Boolean" expires_after="2023-07-02">
   <owner>bingler@chromium.org</owner>
   <owner>miketaylr@chromium.org</owner>
   <summary>
@@ -300,7 +300,7 @@
 </histogram>
 
 <histogram name="Cookie.DoubleUnderscorePrefixedName" enum="Boolean"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>bingler@chromium.org</owner>
   <owner>miketaylr@chromium.org</owner>
   <summary>
@@ -563,7 +563,7 @@
 </histogram>
 
 <histogram name="Cookie.NameOrValueHtab" enum="Boolean"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>bingler@chromium.org</owner>
   <owner>awillia@chromium.org</owner>
   <summary>
@@ -575,7 +575,7 @@
   </summary>
 </histogram>
 
-<histogram name="Cookie.NumKeys" units="keys" expires_after="2023-04-30">
+<histogram name="Cookie.NumKeys" units="keys" expires_after="2023-07-02">
   <owner>cfredric@chromium.org</owner>
   <owner>kaustubhag@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/cras/histograms.xml b/tools/metrics/histograms/metadata/cras/histograms.xml
index 8d1bbe60..2b2d8a65 100644
--- a/tools/metrics/histograms/metadata/cras/histograms.xml
+++ b/tools/metrics/histograms/metadata/cras/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="Cras.A2dp100msFailureOverStream" units="units"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>hychao@chromium.org</owner>
   <owner>chromeos-audio@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/crostini/histograms.xml b/tools/metrics/histograms/metadata/crostini/histograms.xml
index f743625..b57fde1 100644
--- a/tools/metrics/histograms/metadata/crostini/histograms.xml
+++ b/tools/metrics/histograms/metadata/crostini/histograms.xml
@@ -295,7 +295,7 @@
 </histogram>
 
 <histogram name="Crostini.Restarter.Started" enum="BooleanAttempted"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>davidmunro@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -305,7 +305,7 @@
 </histogram>
 
 <histogram name="Crostini.RestarterResult" enum="CrostiniResult"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>davidmunro@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -316,7 +316,7 @@
 </histogram>
 
 <histogram name="Crostini.RestarterResult.Installer" enum="CrostiniResult"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>timloh@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/cryptohome/histograms.xml b/tools/metrics/histograms/metadata/cryptohome/histograms.xml
index 5d43cdc..dc498c2 100644
--- a/tools/metrics/histograms/metadata/cryptohome/histograms.xml
+++ b/tools/metrics/histograms/metadata/cryptohome/histograms.xml
@@ -267,7 +267,7 @@
 </histogram>
 
 <histogram name="Cryptohome.Error.DevUnexpectedState"
-    enum="CryptohomeErrorLocation" expires_after="2023-05-01">
+    enum="CryptohomeErrorLocation" expires_after="2023-07-02">
   <owner>zuan@chromium.org</owner>
   <owner>cros-hwsec+uma@chromium.org</owner>
   <summary>
@@ -296,7 +296,7 @@
 </histogram>
 
 <histogram name="Cryptohome.Error.HashedStack" enum="CryptohomeErrorHashed"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>zuan@chromium.org</owner>
   <owner>cros-hwsec+uma@chromium.org</owner>
   <summary>
@@ -323,7 +323,7 @@
 </histogram>
 
 <histogram name="Cryptohome.Error.LeafErrorWithoutTPM"
-    enum="CryptohomeErrorLocation" expires_after="2023-05-01">
+    enum="CryptohomeErrorLocation" expires_after="2023-07-02">
   <owner>zuan@chromium.org</owner>
   <owner>cros-hwsec+uma@chromium.org</owner>
   <summary>
@@ -351,7 +351,7 @@
 </histogram>
 
 <histogram name="Cryptohome.Error.LeafErrorWithTPM"
-    enum="CryptohomeErrorLocationWithTPMError" expires_after="2023-05-01">
+    enum="CryptohomeErrorLocationWithTPMError" expires_after="2023-07-02">
   <owner>zuan@chromium.org</owner>
   <owner>cros-hwsec+uma@chromium.org</owner>
   <summary>
@@ -926,7 +926,7 @@
 </histogram>
 
 <histogram name="Cryptohome.UssExperiment.FetchUssExperimentConfigRetries"
-    units="retries" expires_after="2023-04-29">
+    units="retries" expires_after="2023-07-02">
   <owner>hcyang@google.com</owner>
   <owner>cros-hwsec+uma@chromium.org</owner>
   <summary>
@@ -939,7 +939,7 @@
 </histogram>
 
 <histogram name="Cryptohome.UssExperiment.FetchUssExperimentConfigStatus"
-    enum="CryptohomeFetchUssExperimentConfigStatus" expires_after="2023-04-29">
+    enum="CryptohomeFetchUssExperimentConfigStatus" expires_after="2023-07-02">
   <owner>hcyang@google.com</owner>
   <owner>cros-hwsec+uma@chromium.org</owner>
   <summary>
@@ -952,7 +952,7 @@
 </histogram>
 
 <histogram name="Cryptohome.UssExperiment.UssExperimentFlag"
-    enum="CryptohomeUssExperimentFlag" expires_after="2023-04-29">
+    enum="CryptohomeUssExperimentFlag" expires_after="2023-07-02">
   <owner>hcyang@google.com</owner>
   <owner>cros-hwsec+uma@chromium.org</owner>
   <summary>
@@ -1021,7 +1021,7 @@
 </histogram>
 
 <histogram name="Cryptohome.WrappingKeyDerivation.Mount"
-    enum="WrappingKeyDerivation" expires_after="2023-05-01">
+    enum="WrappingKeyDerivation" expires_after="2023-07-02">
   <owner>tnagel@chromium.org</owner>
   <owner>zauri@chromium.org</owner>
   <owner>cros-hwsec+uma@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/custom_tabs/histograms.xml b/tools/metrics/histograms/metadata/custom_tabs/histograms.xml
index 5fc35dd..0b3fdb5 100644
--- a/tools/metrics/histograms/metadata/custom_tabs/histograms.xml
+++ b/tools/metrics/histograms/metadata/custom_tabs/histograms.xml
@@ -244,7 +244,7 @@
 </histogram>
 
 <histogram name="CustomTabs.DetachedResourceRequest.FinalStatus"
-    enum="NetErrorCodes" expires_after="2023-04-30">
+    enum="NetErrorCodes" expires_after="2023-07-02">
   <owner>lizeb@chromium.org</owner>
   <owner>cct-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/dev/histograms.xml b/tools/metrics/histograms/metadata/dev/histograms.xml
index 35ff093..b7d88e7 100644
--- a/tools/metrics/histograms/metadata/dev/histograms.xml
+++ b/tools/metrics/histograms/metadata/dev/histograms.xml
@@ -343,7 +343,7 @@
 </histogram>
 
 <histogram name="DevTools.RecordingExported" enum="DevToolsRecordingExported"
-    expires_after="2023-04-16">
+    expires_after="2023-07-02">
   <owner>alexrudenko@chromium.org</owner>
   <owner>mathias@chromium.org</owner>
   <owner>yangguo@chromium.org</owner>
@@ -359,7 +359,7 @@
 </histogram>
 
 <histogram name="DevTools.RecordingReplaySpeed"
-    enum="DevToolsRecordingReplaySpeed" expires_after="2023-05-03">
+    enum="DevToolsRecordingReplaySpeed" expires_after="2023-07-02">
   <owner>ergunsh@chromium.org</owner>
   <owner>alexrudenko@chromium.org</owner>
   <owner>mathias@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/download/histograms.xml b/tools/metrics/histograms/metadata/download/histograms.xml
index 1f477fe..5e594ed 100644
--- a/tools/metrics/histograms/metadata/download/histograms.xml
+++ b/tools/metrics/histograms/metadata/download/histograms.xml
@@ -95,7 +95,7 @@
 </histogram>
 
 <histogram name="Download.Bubble.DragInfo" enum="Download.DragInfo"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -294,7 +294,7 @@
 </histogram>
 
 <histogram name="Download.DangerousDialog.Events"
-    enum="DangerousDownloadDialogEvent" expires_after="2023-04-30">
+    enum="DangerousDownloadDialogEvent" expires_after="2023-07-02">
   <owner>qinmin@chromium.org</owner>
   <summary>
     Records user interactions with the dangerous download dialog on Android.
@@ -1014,7 +1014,7 @@
 </histogram>
 
 <histogram name="Download.Retry.InterruptReason" enum="InterruptReason"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>thefrog@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1297,7 +1297,7 @@
 </histogram>
 
 <histogram name="Download.Session.TotalDurationIncludingBubbleTime" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/enterprise/histograms.xml b/tools/metrics/histograms/metadata/enterprise/histograms.xml
index 4034955..dac75ef 100644
--- a/tools/metrics/histograms/metadata/enterprise/histograms.xml
+++ b/tools/metrics/histograms/metadata/enterprise/histograms.xml
@@ -444,7 +444,7 @@
 </histogram>
 
 <histogram name="Enterprise.CloudReportingBasicRequestSize" units="KB"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>zmin@chromium.org</owner>
   <owner>pastarmovj@chromium.org</owner>
   <summary>
@@ -475,7 +475,7 @@
 </histogram>
 
 <histogram name="Enterprise.CloudReportingResponse"
-    enum="EnterpriseCloudReportingResponse" expires_after="2023-04-30">
+    enum="EnterpriseCloudReportingResponse" expires_after="2023-07-02">
   <owner>zmin@chromium.org</owner>
   <owner>pastarmovj@chromium.org</owner>
   <summary>
@@ -544,7 +544,7 @@
 </histogram>
 
 <histogram name="Enterprise.DevicePolicyRefresh3"
-    enum="EnterprisePolicyRefresh" expires_after="2023-04-30">
+    enum="EnterprisePolicyRefresh" expires_after="2023-07-02">
   <owner>asumaneev@google.com</owner>
   <owner>managed-platforms@google.com</owner>
   <summary>
@@ -640,7 +640,7 @@
 </histogram>
 
 <histogram name="Enterprise.DeviceRemoteCommand.Received"
-    enum="RemoteCommandReceivedStatus" expires_after="2023-04-30">
+    enum="RemoteCommandReceivedStatus" expires_after="2023-07-02">
   <owner>asumaneev@google.com</owner>
   <owner>managed-platforms@google.com</owner>
   <summary>
@@ -1664,7 +1664,7 @@
 <histogram
     name="Enterprise.EnrollmentAttestationBased.EnrollmentCertificateStatus.InitialAttempt"
     enum="EnrollmentAttestationBasedCertificateStatus"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>asumaneev@google.com</owner>
   <owner>chromeos-commercial-remote-management@google.com</owner>
   <summary>
@@ -1993,7 +1993,7 @@
 
 <histogram
     name="Enterprise.FCMInvalidationService.PolicyInvalidationsRegistrationResult"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>asumaneev@google.com</owner>
   <owner>managed-platforms@google.com</owner>
   <summary>
@@ -2333,7 +2333,7 @@
 </histogram>
 
 <histogram name="Enterprise.PolicyInvalidations"
-    enum="EnterprisePolicyInvalidations" expires_after="2023-04-30">
+    enum="EnterprisePolicyInvalidations" expires_after="2023-07-02">
   <owner>asumaneev@google.com</owner>
   <owner>managed-platforms@google.com</owner>
   <summary>
@@ -2442,7 +2442,7 @@
 </histogram>
 
 <histogram name="Enterprise.ProfileSeparation.DasherPolicyFetch.HttpResponse"
-    enum="HttpResponseCode" expires_after="2023-05-01">
+    enum="HttpResponseCode" expires_after="2023-07-02">
   <owner>ydago@chromium.org</owner>
   <owner>zmin@chromium.org</owner>
   <summary>
@@ -2868,7 +2868,7 @@
 </histogram>
 
 <histogram name="EnterpriseCheck.IsFullyManaged2" enum="IsFullyManagedBoolean"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>twellington@google.com</owner>
   <owner>tedchcoc@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/extensions/histograms.xml b/tools/metrics/histograms/metadata/extensions/histograms.xml
index d34734c..f345187 100644
--- a/tools/metrics/histograms/metadata/extensions/histograms.xml
+++ b/tools/metrics/histograms/metadata/extensions/histograms.xml
@@ -136,7 +136,7 @@
 </histogram>
 
 <histogram name="Extensions.ActiveScriptController.PermittedExtensions"
-    units="Extension Count" expires_after="2023-04-30">
+    units="Extension Count" expires_after="2023-07-02">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -829,7 +829,7 @@
 </histogram>
 
 <histogram name="Extensions.DevTools.UserIsInDeveloperMode"
-    enum="InDeveloperMode" expires_after="2023-04-30">
+    enum="InDeveloperMode" expires_after="2023-07-02">
   <owner>ghazale@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -1880,7 +1880,7 @@
 </histogram>
 
 <histogram name="Extensions.Functions.SucceededTotalExecutionTime" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -1893,7 +1893,7 @@
 </histogram>
 
 <histogram name="Extensions.Functions.SynchronousExecutionTime" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
index 3122b9a..66199c0 100644
--- a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
+++ b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
@@ -305,7 +305,7 @@
 </histogram>
 
 <histogram name="InProductHelp.Db.TotalEvents" units="events"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>nyquist@chromium.org</owner>
   <summary>
     Records the total number of event records in the database for in-product
diff --git a/tools/metrics/histograms/metadata/file/histograms.xml b/tools/metrics/histograms/metadata/file/histograms.xml
index 8caf1c1..707453b 100644
--- a/tools/metrics/histograms/metadata/file/histograms.xml
+++ b/tools/metrics/histograms/metadata/file/histograms.xml
@@ -143,7 +143,7 @@
 </histogram>
 
 <histogram name="FileBrowser.ChangeDirectory.RootType"
-    enum="FileManagerRootType" expires_after="2023-04-30">
+    enum="FileManagerRootType" expires_after="2023-07-02">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -261,6 +261,9 @@
 
 <histogram name="FileBrowser.DriveDuplicateFinder.LongComputeHash" units="ms"
     expires_after="M108">
+  <obsolete>
+    Became obsolete on 2022-08-18 as this feature is no longer in existence.
+  </obsolete>
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -361,7 +364,7 @@
 </histogram>
 
 <histogram name="FileBrowser.Glitch" enum="FileManagerGlitch"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>majewski@chromium.org</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -389,6 +392,9 @@
 
 <histogram name="FileBrowser.ImportController.DeviceYanked" enum="Boolean"
     expires_after="M108">
+  <obsolete>
+    Became obsolete on 2022-08-18 as this feature is no longer in existence.
+  </obsolete>
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -399,6 +405,9 @@
 
 <histogram name="FileBrowser.ImportController.ImportCancelled"
     enum="BooleanCanceled" expires_after="M108">
+  <obsolete>
+    Became obsolete on 2022-08-18 as this feature is no longer in existence.
+  </obsolete>
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -491,6 +500,9 @@
 
 <histogram name="FileBrowser.MediaImport.Cancelled" enum="BooleanCanceled"
     expires_after="M108">
+  <obsolete>
+    Became obsolete on 2022-08-18 as this feature is no longer in existence.
+  </obsolete>
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -514,6 +526,9 @@
 
 <histogram name="FileBrowser.MediaImport.ErrorCount" units="count"
     expires_after="M108">
+  <obsolete>
+    Became obsolete on 2022-08-18 as this feature is no longer in existence.
+  </obsolete>
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -523,6 +538,9 @@
 
 <histogram name="FileBrowser.MediaImport.ImportCount" units="count"
     expires_after="M108">
+  <obsolete>
+    Became obsolete on 2022-08-18 as this feature is no longer in existence.
+  </obsolete>
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -533,6 +551,9 @@
 
 <histogram name="FileBrowser.MediaImport.ImportMB" units="MBytes"
     expires_after="M108">
+  <obsolete>
+    Became obsolete on 2022-08-18 as this feature is no longer in existence.
+  </obsolete>
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -543,6 +564,9 @@
 
 <histogram name="FileBrowser.MediaImport.Started" enum="BooleanAttempted"
     expires_after="M108">
+  <obsolete>
+    Became obsolete on 2022-08-18 as this feature is no longer in existence.
+  </obsolete>
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -561,7 +585,7 @@
 </histogram>
 
 <histogram name="FileBrowser.Notification.Show"
-    enum="FileManagerNotificationType" expires_after="2023-04-30">
+    enum="FileManagerNotificationType" expires_after="2023-07-02">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -690,7 +714,7 @@
 </histogram>
 
 <histogram name="FileBrowser.Recent.LoadArcMedia" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -700,7 +724,7 @@
 </histogram>
 
 <histogram name="FileBrowser.Recent.LoadCrostini" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -720,7 +744,7 @@
 </histogram>
 
 <histogram name="FileBrowser.Recent.LoadDrive" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -730,7 +754,7 @@
 </histogram>
 
 <histogram name="FileBrowser.Recent.LoadTotal" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -772,7 +796,7 @@
 </histogram>
 
 <histogram name="FileBrowser.ToggleFileListType" enum="FileManagerListType"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/gpu/histograms.xml b/tools/metrics/histograms/metadata/gpu/histograms.xml
index 6a7ff972..a30f462b 100644
--- a/tools/metrics/histograms/metadata/gpu/histograms.xml
+++ b/tools/metrics/histograms/metadata/gpu/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="ConfigureDisplays.External.Modeset.AttemptSucceeded"
-    enum="BooleanSuccess" expires_after="2023-05-01">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>gildekel@chromium.org</owner>
   <owner>seanpaul@chromium.org</owner>
   <owner>chromeos-gfx-display@chromium.org</owner>
@@ -37,7 +37,7 @@
 </histogram>
 
 <histogram name="ConfigureDisplays.External.Modeset.FinalStatus"
-    enum="BooleanSuccess" expires_after="2023-05-01">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>gildekel@chromium.org</owner>
   <owner>seanpaul@chromium.org</owner>
   <owner>chromeos-gfx-display@chromium.org</owner>
@@ -142,7 +142,7 @@
 </histogram>
 
 <histogram name="ConfigureDisplays.Modeset.MstExternalDisplaysCount"
-    units="count" expires_after="2023-05-01">
+    units="count" expires_after="2023-07-02">
   <owner>gildekel@chromium.org</owner>
   <owner>seanpaul@chromium.org</owner>
   <owner>chromeos-gfx-display@chromium.org</owner>
@@ -154,7 +154,7 @@
 </histogram>
 
 <histogram name="ConfigureDisplays.Modeset.MstExternalDisplaysPercentage"
-    units="%" expires_after="2023-05-01">
+    units="%" expires_after="2023-07-02">
   <owner>gildekel@chromium.org</owner>
   <owner>seanpaul@chromium.org</owner>
   <owner>chromeos-gfx-display@chromium.org</owner>
@@ -166,7 +166,7 @@
 </histogram>
 
 <histogram name="ConfigureDisplays.Modeset.TotalExternalDisplaysCount"
-    units="count" expires_after="2023-05-01">
+    units="count" expires_after="2023-07-02">
   <owner>gildekel@chromium.org</owner>
   <owner>seanpaul@chromium.org</owner>
   <owner>chromeos-gfx-display@chromium.org</owner>
@@ -212,7 +212,7 @@
 </histogram>
 
 <histogram name="Display.External.BlockZeroSerialNumberType"
-    enum="BlockZeroSerialNumberType" expires_after="2023-05-01">
+    enum="BlockZeroSerialNumberType" expires_after="2023-07-02">
   <owner>gildekel@chromium.org</owner>
   <owner>seanpaul@chromium.org</owner>
   <owner>chromeos-gfx-display@google.com</owner>
@@ -245,7 +245,7 @@
 </histogram>
 
 <histogram name="Display.MultipleDisplays.GenerateId.CollisionDetection"
-    enum="BooleanDisplayIdCollision" expires_after="2023-05-01">
+    enum="BooleanDisplayIdCollision" expires_after="2023-07-02">
   <owner>gildekel@chromium.org</owner>
   <owner>seanpaul@chromium.org</owner>
   <owner>chromeos-gfx-display@google.com</owner>
@@ -259,7 +259,7 @@
 </histogram>
 
 <histogram name="Display.ParseEdidFailure" enum="ParseEdidFailure"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>gildekel@chromium.org</owner>
   <owner>sashamcintosh@chromium.org</owner>
   <owner>seanpaul@chromium.org</owner>
@@ -1143,7 +1143,7 @@
 </histogram>
 
 <histogram name="GPU.ProcessLifetimeEvents.HardwareAccelerated"
-    enum="GPUProcessLifetimeEvent" expires_after="2023-04-30">
+    enum="GPUProcessLifetimeEvent" expires_after="2023-07-02">
   <owner>vmiura@chromium.org</owner>
   <summary>
     Recorded once for every GPU process launch and crash when GPU process is
@@ -1154,7 +1154,7 @@
 </histogram>
 
 <histogram name="GPU.ProcessLifetimeEvents.SwiftShader"
-    enum="GPUProcessLifetimeEvent" expires_after="2023-04-30">
+    enum="GPUProcessLifetimeEvent" expires_after="2023-07-02">
   <owner>vmiura@chromium.org</owner>
   <summary>
     Recorded once for every GPU process launch and crash when GPU process is
@@ -1697,7 +1697,7 @@
 </histogram>
 
 <histogram name="Viz.FrameSinkVideoCapturer.I420.CaptureDuration" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>bialpio@chromium.org</owner>
   <owner>media-capture-dev@chromium.org</owner>
   <summary>
@@ -1711,7 +1711,7 @@
 </histogram>
 
 <histogram name="Viz.FrameSinkVideoCapturer.I420.CaptureSucceeded"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>bialpio@chromium.org</owner>
   <owner>media-capture-dev@chromium.org</owner>
   <summary>
@@ -1723,7 +1723,7 @@
 </histogram>
 
 <histogram name="Viz.FrameSinkVideoCapturer.I420.TotalDuration" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>bialpio@chromium.org</owner>
   <owner>media-capture-dev@chromium.org</owner>
   <summary>
@@ -1735,7 +1735,7 @@
 </histogram>
 
 <histogram name="Viz.FrameSinkVideoCapturer.NV12.CaptureDuration" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>bialpio@chromium.org</owner>
   <owner>media-capture-dev@chromium.org</owner>
   <summary>
@@ -1759,7 +1759,7 @@
 </histogram>
 
 <histogram name="Viz.FrameSinkVideoCapturer.NV12.TotalDuration" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>bialpio@chromium.org</owner>
   <owner>media-capture-dev@chromium.org</owner>
   <summary>
@@ -1771,7 +1771,7 @@
 </histogram>
 
 <histogram name="Viz.FrameSinkVideoCapturer.ReserveFrameDuration" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>bialpio@chromium.org</owner>
   <owner>media-capture-dev@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/history/histograms.xml b/tools/metrics/histograms/metadata/history/histograms.xml
index ecd0db3..ba0494e9 100644
--- a/tools/metrics/histograms/metadata/history/histograms.xml
+++ b/tools/metrics/histograms/metadata/history/histograms.xml
@@ -494,7 +494,7 @@
 </histogram>
 
 <histogram name="History.ClearBrowsingData.UserDeletedFromTab"
-    enum="ClearBrowsingDataTab" expires_after="2023-04-30">
+    enum="ClearBrowsingDataTab" expires_after="2023-07-02">
   <owner>dullweber@chromium.org</owner>
   <owner>msramek@chromium.org</owner>
   <component>UI&gt;Browser&gt;History</component>
@@ -1521,7 +1521,7 @@
 </histogram>
 
 <histogram name="History.DatabaseSqliteError" enum="SqliteLoggedResultCode"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>sophiechang@chromium.org</owner>
   <owner>asully@chromium.org</owner>
   <component>UI&gt;Browser&gt;History</component>
@@ -1543,7 +1543,7 @@
 </histogram>
 
 <histogram name="History.DomainCount1Day_V2" units="domains"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>mpearson@chromium.org</owner>
   <owner>mjzhang@chromium.org</owner>
   <owner>chrome-analysis-team@google.com</owner>
@@ -1580,7 +1580,7 @@
 </histogram>
 
 <histogram name="History.DomainCount28Day_V2" units="domains"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>mpearson@chromium.org</owner>
   <owner>mjzhang@chromium.org</owner>
   <owner>chrome-analysis-team@google.com</owner>
@@ -1618,7 +1618,7 @@
 </histogram>
 
 <histogram name="History.DomainCount7Day_V2" units="domains"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>mpearson@chromium.org</owner>
   <owner>mjzhang@chromium.org</owner>
   <owner>chrome-analysis-team@google.com</owner>
@@ -1656,7 +1656,7 @@
 </histogram>
 
 <histogram name="History.DomainCountQueryTime_V2" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>mpearson@chromium.org</owner>
   <owner>mjzhang@chromium.org</owner>
   <owner>chrome-analysis-team@google.com</owner>
@@ -2220,7 +2220,7 @@
 </histogram>
 
 <histogram name="History.WeeklyHostCount" units="hosts"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>mpearson@chromium.org</owner>
   <owner>sky@chromium.org</owner>
   <component>UI&gt;Browser&gt;History</component>
diff --git a/tools/metrics/histograms/metadata/input/histograms.xml b/tools/metrics/histograms/metadata/input/histograms.xml
index 60191a1..6e7e347 100644
--- a/tools/metrics/histograms/metadata/input/histograms.xml
+++ b/tools/metrics/histograms/metadata/input/histograms.xml
@@ -327,7 +327,7 @@
 </histogram>
 
 <histogram name="InputMethod.Assistive.AutocorrectV2.Quality.PkAccepted"
-    enum="IMEAutocorrectQualityBreakdown" expires_after="2023-05-01">
+    enum="IMEAutocorrectQualityBreakdown" expires_after="2023-07-02">
   <owner>mehrab@google.com</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
@@ -599,7 +599,7 @@
 </histogram>
 
 <histogram name="InputMethod.Assistive.MultiWord.CandidatesGenerated"
-    enum="IMEAssistiveMultiWordSuggestionType" expires_after="2023-04-30">
+    enum="IMEAssistiveMultiWordSuggestionType" expires_after="2023-07-02">
   <owner>curtismcmullan@google.com</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
@@ -660,7 +660,7 @@
 </histogram>
 
 <histogram name="InputMethod.Assistive.MultiWord.RequestCandidates"
-    enum="IMEAssistiveMultiWordSuggestionType" expires_after="2023-04-30">
+    enum="IMEAssistiveMultiWordSuggestionType" expires_after="2023-07-02">
   <owner>curtismcmullan@google.com</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
@@ -873,7 +873,7 @@
 </histogram>
 
 <histogram name="InputMethod.Commit.Index" units="units"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
@@ -883,7 +883,7 @@
 </histogram>
 
 <histogram name="InputMethod.Commit.Type2" enum="IMECommitType2"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>dvallet@chromium.org</owner>
   <owner>shuchen@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
@@ -1050,7 +1050,7 @@
 </histogram>
 
 <histogram name="InputMethod.KeyEventLatency" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>Time taken by the engine to handle a key event.</summary>
@@ -1267,7 +1267,7 @@
 </histogram>
 
 <histogram name="InputMethod.SystemEmojiPicker.Delay" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>jopalmer@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
@@ -1285,7 +1285,7 @@
 </histogram>
 
 <histogram name="InputMethod.SystemEmojiPicker.TriggerType"
-    enum="VirtualKeyboardEmojiTriggerType" expires_after="2023-04-30">
+    enum="VirtualKeyboardEmojiTriggerType" expires_after="2023-07-02">
   <owner>jopalmer@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>How emojis were inserted.</summary>
@@ -1386,7 +1386,7 @@
 </histogram>
 
 <histogram name="InputMethod.VirtualKeyboard.ContainerBehavior"
-    enum="VirtualKeyboardContainerType" expires_after="2023-04-30">
+    enum="VirtualKeyboardContainerType" expires_after="2023-07-02">
   <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
@@ -1423,7 +1423,7 @@
 </histogram>
 
 <histogram name="InputMethod.VirtualKeyboard.Emoji.TriggerType"
-    enum="VirtualKeyboardEmojiTriggerType" expires_after="2023-04-30">
+    enum="VirtualKeyboardEmojiTriggerType" expires_after="2023-07-02">
   <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>How emojis were inserted.</summary>
diff --git a/tools/metrics/histograms/metadata/interstitial/histograms.xml b/tools/metrics/histograms/metadata/interstitial/histograms.xml
index 28f764f..b0312e41 100644
--- a/tools/metrics/histograms/metadata/interstitial/histograms.xml
+++ b/tools/metrics/histograms/metadata/interstitial/histograms.xml
@@ -27,7 +27,7 @@
 </variants>
 
 <histogram name="interstitial.captive_portal"
-    enum="CaptivePortalBlockingPageEvent" expires_after="2023-04-30">
+    enum="CaptivePortalBlockingPageEvent" expires_after="2023-07-02">
   <owner>meacer@chromium.org</owner>
   <owner>michaeldo@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml
index e05862e3..95527b9 100644
--- a/tools/metrics/histograms/metadata/ios/histograms.xml
+++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -1298,7 +1298,7 @@
 </histogram>
 
 <histogram name="IOS.NTP.Impression" enum="IOSNTPImpression"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>gambard@chromium.org</owner>
   <summary>
     The type of NTP impressions on iOS, split by type of suggestions shown
diff --git a/tools/metrics/histograms/metadata/language/histograms.xml b/tools/metrics/histograms/metadata/language/histograms.xml
index 14f2354..2b5010ae 100644
--- a/tools/metrics/histograms/metadata/language/histograms.xml
+++ b/tools/metrics/histograms/metadata/language/histograms.xml
@@ -252,7 +252,7 @@
 </histogram>
 
 <histogram name="LanguageUsage.AcceptLanguageAndContentLanguageUsage"
-    enum="AcceptLanguageAndContentLanguageUsage" expires_after="2023-04-30">
+    enum="AcceptLanguageAndContentLanguageUsage" expires_after="2023-07-02">
   <owner>victortan@chromium.org</owner>
   <owner>potassium-katabolism@google.com</owner>
   <summary>
@@ -263,7 +263,7 @@
 </histogram>
 
 <histogram name="LanguageUsage.AcceptLanguageAndXmlHtmlLangUsage"
-    enum="AcceptLanguageAndXmlHtmlLangUsage" expires_after="2023-04-30">
+    enum="AcceptLanguageAndXmlHtmlLangUsage" expires_after="2023-07-02">
   <owner>victortan@chromium.org</owner>
   <owner>potassium-katabolism@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/leveldb_proto/histograms.xml b/tools/metrics/histograms/metadata/leveldb_proto/histograms.xml
index 454a9a2..3fc808a 100644
--- a/tools/metrics/histograms/metadata/leveldb_proto/histograms.xml
+++ b/tools/metrics/histograms/metadata/leveldb_proto/histograms.xml
@@ -186,7 +186,7 @@
 </histogram>
 
 <histogram name="ProtoDB.SharedDbInitStatus" enum="ProtoDatabaseInitState"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>ssid@chromium.org</owner>
   <owner>salg@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml
index ce80b0e..15d45393 100644
--- a/tools/metrics/histograms/metadata/media/histograms.xml
+++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -89,7 +89,7 @@
 </variants>
 
 <histogram name="Media.AImageReaderGLOwner.AcquireImageResult"
-    enum="MediaStatus" expires_after="2023-04-30">
+    enum="MediaStatus" expires_after="2023-07-02">
   <owner>vikassoni@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
@@ -134,7 +134,7 @@
 </histogram>
 
 <histogram name="Media.Android.MediaPlayerSuccess" enum="MediaPlayerExitStatus"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>tguilbert@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>Android: Whether MediaPlayer exited without errors.</summary>
@@ -251,7 +251,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Capture.LowLatencyCallbackError"
-    enum="BooleanError" expires_after="2023-04-30">
+    enum="BooleanError" expires_after="2023-07-02">
   <owner>guidou@chromium.org</owner>
   <owner>olka@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -294,7 +294,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Capture.Mac.MicSystemPermission.Startup"
-    enum="SystemMediaCapturePermission" expires_after="2023-04-30">
+    enum="SystemMediaCapturePermission" expires_after="2023-07-02">
   <owner>grunell@chromium.org</owner>
   <owner>engedy@chromium.org</owner>
   <owner>hkamila@chromium.org</owner>
@@ -327,7 +327,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Capture.Mac.MicSystemPermission.UserMedia"
-    enum="SystemMediaCapturePermission" expires_after="2023-04-30">
+    enum="SystemMediaCapturePermission" expires_after="2023-07-02">
   <owner>grunell@chromium.org</owner>
   <owner>engedy@chromium.org</owner>
   <owner>hkamila@chromium.org</owner>
@@ -568,7 +568,7 @@
 </histogram>
 
 <histogram name="Media.Audio.OutputDeviceAuthorizationTime" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>guidou@chromium.org</owner>
   <owner>olka@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -785,7 +785,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Processing.TotalDelayMs" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>saza@chromium.org</owner>
   <owner>olka@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -855,7 +855,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.GetSourceDataTimeMax.WebRTC"
-    units="microseconds" expires_after="2023-04-30">
+    units="microseconds" expires_after="2023-07-02">
   <owner>guidou@chromium.org</owner>
   <owner>olka@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -913,7 +913,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.OutputDeviceStatus"
-    enum="OutputDeviceStatus" expires_after="2023-04-30">
+    enum="OutputDeviceStatus" expires_after="2023-07-02">
   <owner>dalecurtis@chromium.org</owner>
   <owner>guidou@chromium.org</owner>
   <owner>olka@chromium.org</owner>
@@ -962,7 +962,7 @@
 </histogram>
 
 <histogram name="Media.Audio.TabAudioMuted" enum="Boolean"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>evliu@google.com</owner>
   <owner>chrome-media-ux@google.com</owner>
   <summary>
@@ -3090,7 +3090,7 @@
 </histogram>
 
 <histogram name="Media.MediaDevices.EnumerateDevices.Latency" units="ms"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>toprice@chromium.org</owner>
   <owner>agpalak@chromium.org</owner>
   <summary>
@@ -3102,7 +3102,7 @@
 </histogram>
 
 <histogram name="Media.MediaDevices.EnumerateDevices.Result"
-    enum="EnumerateDevicesResult" expires_after="2023-05-01">
+    enum="EnumerateDevicesResult" expires_after="2023-07-02">
   <owner>toprice@chromium.org</owner>
   <owner>agpalak@chromium.org</owner>
   <summary>
@@ -3161,7 +3161,7 @@
 </histogram>
 
 <histogram name="Media.MediaDevices.GetUserMedia.Latency" units="ms"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>toprice@chromium.org</owner>
   <owner>agpalak@chromium.org</owner>
   <owner>video-cmi-apis@google.com</owner>
@@ -3174,7 +3174,7 @@
 </histogram>
 
 <histogram name="Media.MediaDevices.GetUserMedia.Result"
-    enum="UserMediaRequestResult" expires_after="2023-05-01">
+    enum="UserMediaRequestResult" expires_after="2023-07-02">
   <owner>toprice@chromium.org</owner>
   <owner>agpalak@chromium.org</owner>
   <owner>video-cmi-apis@google.com</owner>
@@ -3186,7 +3186,7 @@
 </histogram>
 
 <histogram name="Media.MediaDevicesManager.VideoDeviceEnumeration.Result"
-    enum="DeviceEnumerationResult" expires_after="2023-05-01">
+    enum="DeviceEnumerationResult" expires_after="2023-07-02">
   <owner>toprice@chromium.org</owner>
   <owner>agpalak@chromium.org</owner>
   <summary>
@@ -3409,7 +3409,7 @@
 </histogram>
 
 <histogram name="Media.MojoVideoDecoder.ActiveInstances" units="units"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>sandersd@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
@@ -3481,7 +3481,7 @@
 </histogram>
 
 <histogram base="true" name="Media.MSE.CodecChangeTime" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>wolenetz@chromium.org</owner>
   <owner>sandersd@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
@@ -3527,7 +3527,7 @@
 </histogram>
 
 <histogram name="Media.MSE.Mp4ConsecutiveEmptySamples" units="samples"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>wolenetz@chromium.org</owner>
   <owner>sandersd@chromium.org</owner>
   <summary>
@@ -3551,7 +3551,7 @@
 </histogram>
 
 <histogram name="Media.MSE.Mp4SampleSize" units="bytes"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>wolenetz@chromium.org</owner>
   <owner>sandersd@chromium.org</owner>
   <summary>
@@ -3562,7 +3562,7 @@
 </histogram>
 
 <histogram name="Media.MSE.Mp4TrunSampleCount" units="samples"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>wolenetz@chromium.org</owner>
   <owner>sandersd@chromium.org</owner>
   <summary>
@@ -3743,7 +3743,7 @@
 </histogram>
 
 <histogram name="Media.OutputStreamDuration" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>guidou@chromium.org</owner>
   <owner>olka@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -4553,7 +4553,7 @@
 </histogram>
 
 <histogram name="Media.Ui.GetDisplayMedia.DisplayCapturePolicyResult"
-    enum="DisplayCapturePolicyResult" expires_after="2023-04-30">
+    enum="DisplayCapturePolicyResult" expires_after="2023-07-02">
   <owner>eladalon@chromium.org</owner>
   <owner>guidou@chromium.org</owner>
   <summary>
@@ -4671,7 +4671,7 @@
 </histogram>
 
 <histogram name="Media.Video.Autoplay" enum="AutoplaySource"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>dalecurtis@chromium.org</owner>
   <owner>evliu@google.com</owner>
   <owner>media-dev@chromium.org</owner>
@@ -4707,7 +4707,7 @@
 </histogram>
 
 <histogram name="Media.Video.Autoplay.Muted.UnmuteAction" enum="BooleanSuccess"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>dalecurtis@chromium.org</owner>
   <owner>evliu@google.com</owner>
   <owner>media-dev@chromium.org</owner>
@@ -4870,7 +4870,7 @@
 </histogram>
 
 <histogram name="Media.VideoCapture.Error" enum="VideoCaptureError"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>mcasas@chromium.org</owner>
   <owner>guidou@chromium.org</owner>
   <owner>armax@chromium.org</owner>
@@ -5057,7 +5057,7 @@
 </histogram>
 
 <histogram name="Media.VideoCapture.Start" enum="Boolean"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>toprice@chromium.org</owner>
   <owner>guidou@chromium.org</owner>
   <summary>
@@ -5080,7 +5080,7 @@
 </histogram>
 
 <histogram name="Media.VideoCapture.StartOutcome"
-    enum="VideoCaptureStartOutcome" expires_after="2023-04-30">
+    enum="VideoCaptureStartOutcome" expires_after="2023-07-02">
   <owner>toprice@chromium.org</owner>
   <owner>guidou@chromium.org</owner>
   <summary>
@@ -5140,7 +5140,7 @@
 </histogram>
 
 <histogram name="Media.VideoCapture.Win.ErrorEvent" enum="Hresult"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>toprice@chromium.org</owner>
   <owner>hta@chromium.org</owner>
   <summary>
@@ -5784,7 +5784,7 @@
 </histogram>
 
 <histogram name="MediaRouter.Cast.Channel.ConnectResult" enum="BooleanSuccess"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>mfoltz@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -5794,7 +5794,7 @@
 </histogram>
 
 <histogram name="MediaRouter.Cast.Channel.Error"
-    enum="MediaRouterCastChannelError" expires_after="2023-05-01">
+    enum="MediaRouterCastChannelError" expires_after="2023-07-02">
   <owner>mfoltz@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -5849,7 +5849,7 @@
 </histogram>
 
 <histogram name="MediaRouter.Cast.LaunchSessionRequest.SupportedAppTypes"
-    enum="ReceiverAppTypeSet" expires_after="2023-05-01">
+    enum="ReceiverAppTypeSet" expires_after="2023-07-02">
   <owner>muyaoxu@google.com</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -5869,7 +5869,7 @@
 </histogram>
 
 <histogram name="MediaRouter.Cast.Mdns.Channel.Open_Failure" units="ms"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>mfoltz@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -5879,7 +5879,7 @@
 </histogram>
 
 <histogram name="MediaRouter.Cast.Mdns.Channel.Open_Success" units="ms"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>mfoltz@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -6057,7 +6057,7 @@
 </histogram>
 
 <histogram name="MediaRouter.Dial.AvailableDevicesCount" units="devices"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>mfoltz@chromium.org</owner>
   <owner>takumif@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
@@ -6301,7 +6301,7 @@
 </histogram>
 
 <histogram name="MediaRouter.Ui.Action.CloseLatency" units="ms"
-    expires_after="2023-05-03">
+    expires_after="2023-07-02">
   <owner>takumif@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -6312,7 +6312,7 @@
 </histogram>
 
 <histogram name="MediaRouter.Ui.Action.StartLocal.Latency" units="ms"
-    expires_after="2023-05-03">
+    expires_after="2023-07-02">
   <owner>takumif@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -6323,7 +6323,7 @@
 </histogram>
 
 <histogram name="MediaRouter.Ui.Action.StartLocalPosition"
-    enum="MediaRouterSinkPositionLabel" expires_after="2023-05-03">
+    enum="MediaRouterSinkPositionLabel" expires_after="2023-07-02">
   <owner>takumif@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>The index of the sink that was selected in the sink list.</summary>
@@ -6360,7 +6360,7 @@
 </histogram>
 
 <histogram name="MediaRouter.Ui.Device.Count" units="units"
-    expires_after="2023-05-14">
+    expires_after="2023-07-02">
   <owner>takumif@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -6411,7 +6411,7 @@
 </histogram>
 
 <histogram name="MediaRouter.Ui.Dialog.IconStateAtOpen"
-    enum="MediaRouterIconState" expires_after="2023-05-03">
+    enum="MediaRouterIconState" expires_after="2023-07-02">
   <owner>takumif@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -6431,7 +6431,7 @@
 </histogram>
 
 <histogram name="MediaRouter.Ui.Dialog.Paint" units="ms"
-    expires_after="2023-05-03">
+    expires_after="2023-07-02">
   <owner>takumif@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/memory/histograms.xml b/tools/metrics/histograms/metadata/memory/histograms.xml
index b2df5ac..c3868ef 100644
--- a/tools/metrics/histograms/metadata/memory/histograms.xml
+++ b/tools/metrics/histograms/metadata/memory/histograms.xml
@@ -1793,7 +1793,7 @@
 </histogram>
 
 <histogram name="Memory.ParkableImage.Read.Latency" units="microseconds"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>thiabaud@google.com</owner>
   <owner>lizeb@chromium.org</owner>
   <summary>
@@ -1816,7 +1816,7 @@
 </histogram>
 
 <histogram name="Memory.ParkableImage.Read.Throughput" units="MiBps"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>thiabaud@google.com</owner>
   <owner>lizeb@chromium.org</owner>
   <summary>
@@ -1836,7 +1836,7 @@
 </histogram>
 
 <histogram name="Memory.ParkableImage.TotalReadTime.5min" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>thiabaud@google.com</owner>
   <owner>lizeb@chromium.org</owner>
   <summary>
@@ -1866,7 +1866,7 @@
 </histogram>
 
 <histogram name="Memory.ParkableImage.UnparkedSize.5min" units="KiB"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>thiabaud@google.com</owner>
   <owner>lizeb@chromium.org</owner>
   <summary>
@@ -1876,7 +1876,7 @@
 </histogram>
 
 <histogram name="Memory.ParkableImage.Write.Latency" units="microseconds"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>thiabaud@google.com</owner>
   <owner>lizeb@chromium.org</owner>
   <summary>
@@ -1889,7 +1889,7 @@
 </histogram>
 
 <histogram name="Memory.ParkableImage.Write.Size" units="KiB"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>thiabaud@google.com</owner>
   <owner>lizeb@chromium.org</owner>
   <summary>
@@ -1918,7 +1918,7 @@
 </histogram>
 
 <histogram name="Memory.ParkableString.Compression.Latency"
-    units="microseconds" expires_after="2023-04-30">
+    units="microseconds" expires_after="2023-07-02">
   <owner>lizeb@chromium.org</owner>
   <owner>thiabaud@google.com</owner>
   <summary>
@@ -1948,7 +1948,7 @@
 </histogram>
 
 <histogram name="Memory.ParkableString.CompressionRatio.5min" units="%"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>lizeb@chromium.org</owner>
   <owner>pasko@chromium.org</owner>
   <summary>
@@ -1959,7 +1959,7 @@
 </histogram>
 
 <histogram name="Memory.ParkableString.Decompression.Latency"
-    units="microseconds" expires_after="2023-04-30">
+    units="microseconds" expires_after="2023-07-02">
   <owner>lizeb@chromium.org</owner>
   <owner>thiabaud@google.com</owner>
   <summary>
@@ -1981,7 +1981,7 @@
 </histogram>
 
 <histogram name="Memory.ParkableString.Decompression.ThroughputMBps"
-    units="MBps" expires_after="2023-04-30">
+    units="MBps" expires_after="2023-07-02">
   <owner>lizeb@chromium.org</owner>
   <owner>thiabaud@google.com</owner>
   <summary>
@@ -2267,7 +2267,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.PressureWindowDuration" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
 <!-- Name completed by histogram_suffixes name="Memory.Pressure.TransitionType" -->
 
   <owner>fdoray@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/mobile/histograms.xml b/tools/metrics/histograms/metadata/mobile/histograms.xml
index 56fdfa1..f670b79 100644
--- a/tools/metrics/histograms/metadata/mobile/histograms.xml
+++ b/tools/metrics/histograms/metadata/mobile/histograms.xml
@@ -1198,7 +1198,7 @@
 </histogram>
 
 <histogram name="MobileStartup.DailyLaunchCount" units="units"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>tedchoc@chromium.org</owner>
   <owner>twellington@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/navigation/histograms.xml b/tools/metrics/histograms/metadata/navigation/histograms.xml
index 8740579..1c8d856 100644
--- a/tools/metrics/histograms/metadata/navigation/histograms.xml
+++ b/tools/metrics/histograms/metadata/navigation/histograms.xml
@@ -415,7 +415,7 @@
 </histogram>
 
 <histogram name="BackForwardCache.Restore.NavigationToFirstPaint" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>sreejakshetty@chromium.org</owner>
   <owner>altimin@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
@@ -536,7 +536,7 @@
 
 <histogram name="Navigation.BrowserMappedUrnUuidInIframeOrFencedFrame"
     enum="NavigationBrowserMappedUrnUuidInIframeOrFencedFrame"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>xiaochenzh@chromium.org</owner>
   <owner>shivanisha@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/net/histograms.xml b/tools/metrics/histograms/metadata/net/histograms.xml
index 6571483..9f456a5 100644
--- a/tools/metrics/histograms/metadata/net/histograms.xml
+++ b/tools/metrics/histograms/metadata/net/histograms.xml
@@ -142,7 +142,7 @@
 </histogram>
 
 <histogram name="HttpCache.PrefetchFirstReuseTime" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>nrosenthal@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -153,7 +153,7 @@
 </histogram>
 
 <histogram name="HttpCache.PrefetchReuseState" enum="PrefetchReuseState"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>nrosenthal@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -166,7 +166,7 @@
 </histogram>
 
 <histogram name="HttpCache.PrefetchReuseTime" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>nrosenthal@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -1441,7 +1441,7 @@
 </histogram>
 
 <histogram base="true" name="Net.DNS.UI.DropdownSelectionEvent"
-    enum="DohProviderId" expires_after="2023-04-30">
+    enum="DohProviderId" expires_after="2023-07-02">
 <!-- Name completed by histogram_suffixes
    name="DnsDropdownSelectionEvent" -->
 
@@ -1828,7 +1828,7 @@
 </histogram>
 
 <histogram name="Net.HttpJob.TotalTime.TLS13.Google" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>davidben@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -2007,7 +2007,7 @@
 </histogram>
 
 <histogram name="Net.NetworkChangeNotifier.NewConnectionCost"
-    enum="NetworkConnectionCost" expires_after="2023-04-30">
+    enum="NetworkConnectionCost" expires_after="2023-07-02">
   <owner>fbeaufort@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -2017,7 +2017,7 @@
 </histogram>
 
 <histogram name="Net.NetworkChangeNotifier.NewConnectionType"
-    enum="NetworkConnectionType" expires_after="2023-04-30">
+    enum="NetworkConnectionType" expires_after="2023-07-02">
   <owner>dschinazi@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/network/histograms.xml b/tools/metrics/histograms/metadata/network/histograms.xml
index 3be0634..48ca671a0 100644
--- a/tools/metrics/histograms/metadata/network/histograms.xml
+++ b/tools/metrics/histograms/metadata/network/histograms.xml
@@ -3135,7 +3135,7 @@
 </histogram>
 
 <histogram name="Network.Shill.WiFi.TimeFromRekeyToFailureSeconds"
-    units="seconds" expires_after="2023-04-30">
+    units="seconds" expires_after="2023-07-02">
   <owner>billyzhao@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3445,7 +3445,7 @@
 </histogram>
 
 <histogram name="NetworkService.ClearStaleDataDirectoryResult"
-    enum="DeleteStaleCookiesResult" expires_after="2023-04-30">
+    enum="DeleteStaleCookiesResult" expires_after="2023-07-02">
   <owner>wfh@chromium.org</owner>
   <owner>pasko@chromium.org</owner>
   <summary>
@@ -3672,7 +3672,7 @@
 </histogram>
 
 <histogram name="NetworkService.TimeToMigrateData" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>wfh@chromium.org</owner>
   <owner>mmenke@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
index bcef965..b893ff4 100644
--- a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
+++ b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
@@ -104,7 +104,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Carts.CartImageCount" units="count"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>yuezhanggg@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
   <summary>
@@ -185,7 +185,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Carts.DiscountConsentStatusAtLoad"
-    enum="CartDiscountConsentStatus" expires_after="2023-06-25">
+    enum="CartDiscountConsentStatus" expires_after="2023-07-02">
   <owner>yuezhanggg@chromium.org</owner>
   <owner>wychen@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
@@ -256,7 +256,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Carts.DiscountCountAtLoad" units="count"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>meiliang@chromium.org</owner>
   <owner>yuezhanggg@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
@@ -1043,7 +1043,7 @@
 </histogram>
 
 <histogram name="NewTabPage.MainUi.ShownTime" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
   <summary>
@@ -1960,7 +1960,7 @@
 </histogram>
 
 <histogram name="NewTabPage.TimeSinceLastNTP" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>tiborg@chromium.org</owner>
   <owner>yyushkina@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/notifications/histograms.xml b/tools/metrics/histograms/metadata/notifications/histograms.xml
index 32ba197..710f5e3 100644
--- a/tools/metrics/histograms/metadata/notifications/histograms.xml
+++ b/tools/metrics/histograms/metadata/notifications/histograms.xml
@@ -585,7 +585,7 @@
 </histogram>
 
 <histogram name="Notifications.NotifierType" enum="NotifierType"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>tbarzic@chromium.org</owner>
   <owner>tengs@chromium.org</owner>
   <owner>gzadina@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/offline/histograms.xml b/tools/metrics/histograms/metadata/offline/histograms.xml
index 7062c8c..df2a79c 100644
--- a/tools/metrics/histograms/metadata/offline/histograms.xml
+++ b/tools/metrics/histograms/metadata/offline/histograms.xml
@@ -477,7 +477,7 @@
 </histogram>
 
 <histogram name="OfflinePages.CachedOfflineStatusValid" enum="BooleanMatched"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>pnoland@chromium.org</owner>
   <owner>offline-dev@chromium.org</owner>
   <summary>
@@ -628,7 +628,7 @@
 </histogram>
 
 <histogram name="OfflinePages.DidNavigationThrottleCancelNavigation"
-    enum="Boolean" expires_after="2023-04-30">
+    enum="Boolean" expires_after="2023-07-02">
   <owner>curranmax@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/omnibox/histograms.xml b/tools/metrics/histograms/metadata/omnibox/histograms.xml
index 4571fc3..b70c349 100644
--- a/tools/metrics/histograms/metadata/omnibox/histograms.xml
+++ b/tools/metrics/histograms/metadata/omnibox/histograms.xml
@@ -553,7 +553,7 @@
 </histogram>
 
 <histogram name="Omnibox.CutOrCopyAllText" units="count"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <owner>chrome-omnibox-team@google.com</owner>
@@ -1321,7 +1321,7 @@
 </histogram>
 
 <histogram name="Omnibox.ResumeJourneyShown" units="position"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>tommycli@chromium.org</owner>
   <owner>chrome-omnibox-team@google.com</owner>
   <summary>
@@ -1505,7 +1505,7 @@
 </histogram>
 
 <histogram name="Omnibox.SelectedPosition" units="position"
-    expires_after="2023-06-25">
+    expires_after="2023-07-02">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <owner>chrome-omnibox-team@google.com</owner>
@@ -1542,7 +1542,7 @@
 </histogram>
 
 <histogram name="Omnibox.SuggestionUsed.AnswerInSuggest"
-    enum="SuggestionAnswerOptionalType" expires_after="2023-04-30">
+    enum="SuggestionAnswerOptionalType" expires_after="2023-07-02">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <owner>chrome-omnibox-team@google.com</owner>
@@ -1555,7 +1555,7 @@
 </histogram>
 
 <histogram name="Omnibox.SuggestionUsed.ClientSummarizedResultType"
-    enum="ClientSummarizedResultType" expires_after="2023-04-30">
+    enum="ClientSummarizedResultType" expires_after="2023-07-02">
   <owner>nyquist@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <owner>tommycli@chromium.org</owner>
@@ -1617,7 +1617,7 @@
 </histogram>
 
 <histogram name="Omnibox.SuggestionUsed.ResumeJourney" units="position"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>tommycli@chromium.org</owner>
   <owner>chrome-omnibox-team@google.com</owner>
   <summary>
@@ -1914,7 +1914,7 @@
 
 <histogram
     name="Omnibox.SuggestionUsed.Search.NavigationToLargestContentfulPaint2"
-    units="ms" expires_after="2023-04-27">
+    units="ms" expires_after="2023-07-02">
   <owner>asamidoi@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
   <owner>chrome-omnibox-team@google.com</owner>
@@ -2142,7 +2142,7 @@
 </histogram>
 
 <histogram name="Omnibox.TabMatchTime" units="microseconds"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>gangwu@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/optimization/histograms.xml b/tools/metrics/histograms/metadata/optimization/histograms.xml
index dc9e4b7..ab4c296 100644
--- a/tools/metrics/histograms/metadata/optimization/histograms.xml
+++ b/tools/metrics/histograms/metadata/optimization/histograms.xml
@@ -366,7 +366,7 @@
 
 <histogram
     name="OptimizationGuide.HintsManager.ConcurrentPageNavigationFetches"
-    units="counts" expires_after="2023-04-30">
+    units="counts" expires_after="2023-07-02">
   <owner>sophiechang@chromium.org</owner>
   <owner>mcrouse@chromium.org</owner>
   <summary>
@@ -748,7 +748,7 @@
 <histogram
     name="OptimizationGuide.PageContentAnnotationsService.ContentAnnotationsStorageStatus"
     enum="OptimizationGuidePageContentAnnotationsStorageStatus"
-    expires_after="2023-06-25">
+    expires_after="2023-07-02">
   <owner>sophiechang@chromium.org</owner>
   <owner>mcrouse@chromium.org</owner>
   <summary>
@@ -1192,7 +1192,7 @@
 
 <histogram
     name="OptimizationGuide.PredictionModelFetcher.GetModelsResponse.NetErrorCode"
-    enum="NetErrorCodes" expires_after="2023-06-25">
+    enum="NetErrorCodes" expires_after="2023-07-02">
   <owner>mcrouse@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -1222,7 +1222,7 @@
 
 <histogram
     name="OptimizationGuide.PredictionModelFetcher.GetModelsResponse.Status"
-    enum="HttpResponseCode" expires_after="2023-06-25">
+    enum="HttpResponseCode" expires_after="2023-07-02">
   <owner>mcrouse@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index 122329b..b35f34a 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -2947,7 +2947,7 @@
 </histogram>
 
 <histogram name="ClientHints.UpdateSize" units="count"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>yoavweiss@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <owner>mkwst@chromium.org</owner>
@@ -5081,7 +5081,7 @@
 </histogram>
 
 <histogram name="DocumentScan.ScanFailed" enum="DocumentScanSaneBackend"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>bmgordon@chromium.org</owner>
   <owner>project-bolton@google.com</owner>
   <summary>
@@ -5120,7 +5120,7 @@
 </histogram>
 
 <histogram name="DocumentScan.ScanSucceeded" enum="DocumentScanSaneBackend"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>bmgordon@chromium.org</owner>
   <owner>project-bolton@google.com</owner>
   <summary>
@@ -5565,7 +5565,7 @@
 </histogram>
 
 <histogram name="Eche.StreamEvent.Duration.FromInitializeToClose" units="ms"
-    expires_after="2023-04-23">
+    expires_after="2023-07-02">
   <owner>paulzchen@google.com</owner>
   <owner>andychou@google.com</owner>
   <owner>exo-core-eng@google.com</owner>
@@ -5791,7 +5791,7 @@
 </histogram>
 
 <histogram name="ExploreSites.MonthlyHostCount" units="hosts"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>dimich@chromium.org</owner>
   <summary>
     Number of unique hosts visited by the user during the last 30 days. Reported
@@ -6278,7 +6278,7 @@
 </histogram>
 
 <histogram name="Feedback.TrustSafetySentiment.TriggerOccurred"
-    enum="TrustSafetySentimentFeatureArea" expires_after="2023-04-30">
+    enum="TrustSafetySentimentFeatureArea" expires_after="2023-07-02">
   <owner>sauski@google.com</owner>
   <owner>chrome-hats-eng@google.com</owner>
   <summary>
@@ -6948,7 +6948,7 @@
   </summary>
 </histogram>
 
-<histogram name="Hardware.TotalDiskSpace" units="GB" expires_after="2023-04-30">
+<histogram name="Hardware.TotalDiskSpace" units="GB" expires_after="2023-07-02">
   <owner>zmo@chromium.org</owner>
   <owner>graphics-dev@chromium.org</owner>
   <summary>
@@ -7345,7 +7345,7 @@
 </histogram>
 
 <histogram name="InstanceID.GetToken.RequestStatus.SyncInvalidations"
-    enum="GCMRegistrationRequestStatus" expires_after="2023-04-30">
+    enum="GCMRegistrationRequestStatus" expires_after="2023-07-02">
   <owner>peter@chromium.org</owner>
   <owner>rushans@chromium.org</owner>
   <owner>treib@chromium.org</owner>
@@ -8401,7 +8401,7 @@
 </histogram>
 
 <histogram name="Mojo.Channel.WriteMessageSize" units="bytes"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>amistry@chromium.org</owner>
   <owner>bgeffon@chromium.org</owner>
   <owner>rockot@google.com</owner>
@@ -9786,7 +9786,7 @@
 </histogram>
 
 <histogram name="PeriodicBackgroundSync.Event.Time" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>nator@chromium.org</owner>
   <owner>rayankans@chromium.org</owner>
   <summary>
@@ -10851,7 +10851,7 @@
 </histogram>
 
 <histogram name="ReadingList.WebUI.LoadCompletedTime" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>corising@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -11782,7 +11782,7 @@
 </histogram>
 
 <histogram base="true" name="SB2.RequestDestination" enum="RequestDestination"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -12440,7 +12440,7 @@
 </histogram>
 
 <histogram name="Shutdown.OtherExit.Time2" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>etienneb@chromium.org</owner>
   <owner>gab@chromium.org</owner>
   <summary>
@@ -13079,7 +13079,7 @@
 </histogram>
 
 <histogram name="SpellCheck.SuggestionHitRatio" units="%"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>gujen@google.com</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
@@ -13454,7 +13454,7 @@
 </histogram>
 
 <histogram name="Tablet.AppWindowDrag.CountOfPerUserSession" units="times"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>minch@chromium.org</owner>
   <owner>omrilio@chromium.org</owner>
   <summary>
@@ -13465,7 +13465,7 @@
 </histogram>
 
 <histogram name="Tablet.AppWindowDrag.InSplitView.CountOfPerUserSession"
-    units="times" expires_after="2023-05-01">
+    units="times" expires_after="2023-07-02">
   <owner>minch@chromium.org</owner>
   <owner>omrilio@chromium.org</owner>
   <summary>
@@ -13507,7 +13507,7 @@
 </histogram>
 
 <histogram name="Tablet.TabDrag.InSplitView.CountOfPerUserSession"
-    units="times" expires_after="2023-05-01">
+    units="times" expires_after="2023-07-02">
   <owner>minch@chromium.org</owner>
   <owner>omrilio@chromium.org</owner>
   <summary>
@@ -14971,7 +14971,7 @@
 </histogram>
 
 <histogram name="VoiceInteraction.VoiceResultConfidenceValue" units="%"
-    expires_after="2023-06-25">
+    expires_after="2023-07-02">
   <owner>basiaz@google.com</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml
index 3cb87b7..2e86eea 100644
--- a/tools/metrics/histograms/metadata/page/histograms.xml
+++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -266,7 +266,7 @@
 </histogram>
 
 <histogram name="PageLoad.Clients.Ads.AllPages.NonAdNetworkBytes" units="KB"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>alexmt@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <summary>
@@ -866,7 +866,7 @@
 
 <histogram
     name="PageLoad.Clients.GoogleSearch.PaintTiming.NavigationToFirstContentfulPaint"
-    units="ms" expires_after="2023-04-30">
+    units="ms" expires_after="2023-07-02">
   <owner>spelchat@chromium.org</owner>
   <owner>chrome-brapp-loading@google.com</owner>
   <summary>
@@ -880,7 +880,7 @@
 
 <histogram
     name="PageLoad.Clients.GoogleSearch.PaintTiming.NavigationToLargestContentfulPaint"
-    units="ms" expires_after="2023-04-30">
+    units="ms" expires_after="2023-07-02">
   <owner>spelchat@chromium.org</owner>
   <owner>chrome-brapp-loading@google.com</owner>
   <summary>
@@ -1220,7 +1220,7 @@
 
 <histogram
     name="PageLoad.Clients.ThirdParty.Frames.NavigationToFirstContentfulPaint3"
-    units="ms" expires_after="2023-04-30">
+    units="ms" expires_after="2023-07-02">
   <owner>jkarlin@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <summary>
@@ -1340,7 +1340,7 @@
 
 <histogram
     name="PageLoad.DocumentTiming.NavigationToDOMContentLoadedEventFired"
-    units="ms" expires_after="2023-04-30">
+    units="ms" expires_after="2023-07-02">
   <owner>bmcquade@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
   <summary>
@@ -1350,7 +1350,7 @@
 </histogram>
 
 <histogram name="PageLoad.DocumentTiming.NavigationToLoadEventFired" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>bmcquade@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
   <summary>
@@ -1773,7 +1773,7 @@
 
 <histogram
     name="PageLoad.Experimental.NavigationTiming.NavigationStartToFirstResponseStart"
-    units="ms" expires_after="2023-04-30">
+    units="ms" expires_after="2023-07-02">
   <owner>nhiroki@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -1784,7 +1784,7 @@
 
 <histogram
     name="PageLoad.Experimental.NavigationTiming.NavigationStartToNavigationCommitSent"
-    units="ms" expires_after="2023-04-30">
+    units="ms" expires_after="2023-07-02">
   <owner>nhiroki@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -2684,7 +2684,7 @@
 </histogram>
 
 <histogram name="PageLoad.PaintTiming.ForegroundToFirstContentfulPaint"
-    units="ms" expires_after="2023-04-30">
+    units="ms" expires_after="2023-07-02">
   <owner>sullivan@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
   <summary>
@@ -2739,7 +2739,7 @@
 </histogram>
 
 <histogram name="PageLoad.PaintTiming.NavigationToFirstPaint" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>ksakamoto@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
   <summary>
@@ -2880,7 +2880,7 @@
 </histogram>
 
 <histogram name="PageLoad.ParseTiming.NavigationToParseStart" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>bmcquade@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml
index c524abfd..e96a4a8 100644
--- a/tools/metrics/histograms/metadata/password/histograms.xml
+++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -117,7 +117,7 @@
 </variants>
 
 <histogram name="KeyboardAccessory.AccessoryActionImpression"
-    enum="AccessoryAction" expires_after="2023-04-30">
+    enum="AccessoryAction" expires_after="2023-07-02">
   <owner>fhorschig@chromium.org</owner>
   <owner>ioanap@chromium.org</owner>
   <summary>
@@ -127,7 +127,7 @@
 </histogram>
 
 <histogram name="KeyboardAccessory.AccessoryActionSelected"
-    enum="AccessoryAction" expires_after="2023-04-30">
+    enum="AccessoryAction" expires_after="2023-07-02">
   <owner>fhorschig@chromium.org</owner>
   <owner>ioanap@chromium.org</owner>
   <summary>
@@ -137,7 +137,7 @@
 </histogram>
 
 <histogram name="KeyboardAccessory.AccessoryBarShown"
-    enum="AccessoryBarContents" expires_after="2023-04-30">
+    enum="AccessoryBarContents" expires_after="2023-07-02">
   <owner>fhorschig@chromium.org</owner>
   <owner>ioanap@chromium.org</owner>
   <summary>
@@ -168,7 +168,7 @@
 </histogram>
 
 <histogram name="KeyboardAccessory.AccessorySheetTriggered"
-    enum="AccessorySheetTrigger" expires_after="2023-04-30">
+    enum="AccessorySheetTrigger" expires_after="2023-07-02">
   <owner>fhorschig@chromium.org</owner>
   <owner>ioanap@chromium.org</owner>
   <summary>
@@ -228,7 +228,7 @@
 </histogram>
 
 <histogram name="PasswordBubble.BiometricAuthenticationPromo.AcceptClicked"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -307,7 +307,7 @@
 </histogram>
 
 <histogram name="PasswordGeneration.Event" enum="PasswordGenerationEvent"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>kazinova@google.com</owner>
   <owner>kolos@chromium.org</owner>
   <owner>vasilii@chromium.org</owner>
@@ -747,7 +747,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AffiliationFetcher.FetchHttpResponseCode"
-    enum="HttpResponseCode" expires_after="2023-04-30">
+    enum="HttpResponseCode" expires_after="2023-07-02">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -758,7 +758,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AffiliationFetcher.FetchResult"
-    enum="AffiliationFetchResult" expires_after="2023-04-30">
+    enum="AffiliationFetchResult" expires_after="2023-07-02">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -854,7 +854,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AutomaticChange.AcceptanceWithoutAutoButton"
-    enum="PasswordCheckResolutionAction" expires_after="2023-04-30">
+    enum="PasswordCheckResolutionAction" expires_after="2023-07-02">
   <owner>kolos@chromium.org</owner>
   <owner>battre@chromium.org</owner>
   <summary>
@@ -1074,7 +1074,7 @@
 </histogram>
 
 <histogram name="PasswordManager.BulkCheck.PasswordCheckReferrer"
-    enum="PasswordCheckReferrer" expires_after="2023-04-30">
+    enum="PasswordCheckReferrer" expires_after="2023-07-02">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -1106,7 +1106,7 @@
 </histogram>
 
 <histogram name="PasswordManager.BulkCheck.TimePerCredential" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>vasilii@chromium.org</owner>
   <owner>vsemeniuk@google.com</owner>
   <summary>
@@ -1423,7 +1423,7 @@
 </histogram>
 
 <histogram name="PasswordManager.EditsInSaveBubble"
-    enum="PasswordManagerEditsInSaveBubbleEnum" expires_after="2023-04-30">
+    enum="PasswordManagerEditsInSaveBubbleEnum" expires_after="2023-07-02">
   <owner>vasilii@chromium.org</owner>
   <owner>kazinova@google.com</owner>
   <summary>
@@ -1459,7 +1459,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ErrorMessageDismissalReason"
-    enum="MessageDismissReason" expires_after="2023-04-30">
+    enum="MessageDismissReason" expires_after="2023-07-02">
   <owner>izuzic@google.com</owner>
   <owner>ioanap@chromium.org</owner>
   <summary>
@@ -1471,7 +1471,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ErrorMessageDisplayReason"
-    enum="PasswordStoreBackendErrorType" expires_after="2023-04-30">
+    enum="PasswordStoreBackendErrorType" expires_after="2023-07-02">
   <owner>izuzic@google.com</owner>
   <owner>ioanap@chromium.org</owner>
   <summary>
@@ -1482,7 +1482,7 @@
 </histogram>
 
 <histogram name="PasswordManager.FieldNameCollisionInVotes" enum="Boolean"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>kolos@chromium.org</owner>
   <owner>khamutov@google.com</owner>
   <summary>
@@ -1501,7 +1501,7 @@
 </histogram>
 
 <histogram name="PasswordManager.FillingAssistance"
-    enum="PasswordManagerFillingAssistance" expires_after="2023-04-30">
+    enum="PasswordManagerFillingAssistance" expires_after="2023-07-02">
   <owner>kazinova@google.com</owner>
   <owner>battre@chromium.org</owner>
   <summary>
@@ -1839,7 +1839,7 @@
 
 <histogram name="PasswordManager.LeakDetection.DialogDismissalReason"
     enum="PasswordLeakDetectionDialogDismissalReason"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -1849,7 +1849,7 @@
 </histogram>
 
 <histogram name="PasswordManager.LeakDetection.Error"
-    enum="PasswordLeakDetectionError" expires_after="2023-04-30">
+    enum="PasswordLeakDetectionError" expires_after="2023-07-02">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -1858,7 +1858,7 @@
 </histogram>
 
 <histogram name="PasswordManager.LeakDetection.HttpResponseCode"
-    enum="HttpResponseCode" expires_after="2023-04-30">
+    enum="HttpResponseCode" expires_after="2023-07-02">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -1917,7 +1917,7 @@
 </histogram>
 
 <histogram name="PasswordManager.LeakDetection.ReceiveSingleLeakResponseTime"
-    units="ms" expires_after="2023-04-30">
+    units="ms" expires_after="2023-07-02">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -1968,7 +1968,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ManagePasswordsReferrer"
-    enum="ManagePasswordsReferrer" expires_after="2023-04-30">
+    enum="ManagePasswordsReferrer" expires_after="2023-07-02">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -2097,7 +2097,7 @@
 </histogram>
 
 <histogram name="PasswordManager.NewlySavedPasswordIsGenerated"
-    enum="BooleanNewlySavedPasswordIsGenerated" expires_after="2023-04-30">
+    enum="BooleanNewlySavedPasswordIsGenerated" expires_after="2023-07-02">
   <owner>nepper@chromium.org</owner>
   <owner>battre@chromium.org</owner>
   <owner>kolos@chromium.org</owner>
@@ -3345,7 +3345,7 @@
 </histogram>
 
 <histogram name="PasswordManager.TouchToFill.CredentialIndex" units="index"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>ioanap@chromium.org</owner>
   <owner>fhorschig@chromium.org</owner>
   <owner>kolos@chromium.org</owner>
@@ -3356,7 +3356,7 @@
 </histogram>
 
 <histogram name="PasswordManager.TouchToFill.DismissalReason"
-    enum="BottomSheet.StateChangeReason" expires_after="2023-04-30">
+    enum="BottomSheet.StateChangeReason" expires_after="2023-07-02">
   <owner>ioanap@chromium.org</owner>
   <owner>fhorschig@chromium.org</owner>
   <owner>kolos@chromium.org</owner>
@@ -3374,7 +3374,7 @@
 </histogram>
 
 <histogram name="PasswordManager.TouchToFill.Outcome"
-    enum="TouchToFill.Outcome" expires_after="2023-04-30">
+    enum="TouchToFill.Outcome" expires_after="2023-07-02">
   <owner>ioanap@chromium.org</owner>
   <owner>fhorschig@chromium.org</owner>
   <owner>kolos@chromium.org</owner>
@@ -3386,7 +3386,7 @@
 </histogram>
 
 <histogram name="PasswordManager.TouchToFill.SubmissionReadiness"
-    enum="TouchToFill.SubmissionReadiness" expires_after="2023-04-30">
+    enum="TouchToFill.SubmissionReadiness" expires_after="2023-07-02">
   <owner>kolos@chromium.org</owner>
   <owner>fhorschig@chromium.org</owner>
   <summary>
@@ -4009,7 +4009,7 @@
 </histogram>
 
 <histogram base="true" name="PasswordProtection.RequestOutcome"
-    enum="PasswordProtectionRequestOutcome" expires_after="2023-04-30">
+    enum="PasswordProtectionRequestOutcome" expires_after="2023-07-02">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -4054,7 +4054,7 @@
 </histogram>
 
 <histogram name="PasswordProtection.Verdict" enum="PasswordProtectionVerdict"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/payment/histograms.xml b/tools/metrics/histograms/metadata/payment/histograms.xml
index bc85a752b..1b2e2846c 100644
--- a/tools/metrics/histograms/metadata/payment/histograms.xml
+++ b/tools/metrics/histograms/metadata/payment/histograms.xml
@@ -82,7 +82,7 @@
 </histogram>
 
 <histogram name="PaymentRequest.EventResponse.IsReadyToPay" enum="Boolean"
-    expires_after="2023-04-23">
+    expires_after="2023-07-02">
   <owner>rouslan@chromium.org</owner>
   <owner>web-payments-team@google.com</owner>
   <summary>
@@ -119,7 +119,7 @@
 </histogram>
 
 <histogram name="PaymentRequest.JourneyLoggerHasRecorded" enum="Boolean"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>rouslan@chromium.org</owner>
   <owner>web-payments-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/pdf/histograms.xml b/tools/metrics/histograms/metadata/pdf/histograms.xml
index cf36665..f5eac87b 100644
--- a/tools/metrics/histograms/metadata/pdf/histograms.xml
+++ b/tools/metrics/histograms/metadata/pdf/histograms.xml
@@ -86,7 +86,7 @@
 </histogram>
 
 <histogram name="PDF.LoadStatus" enum="ChromePDFViewerLoadStatus"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>kmoon@chromium.org</owner>
   <owner>thestig@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/performance_controls/histograms.xml b/tools/metrics/histograms/metadata/performance_controls/histograms.xml
index bc51d601..feb6ed9 100644
--- a/tools/metrics/histograms/metadata/performance_controls/histograms.xml
+++ b/tools/metrics/histograms/metadata/performance_controls/histograms.xml
@@ -42,7 +42,7 @@
 </histogram>
 
 <histogram name="PerformanceControls.BatterySaver.SettingsChangeMode"
-    enum="BatterySaverModeState" expires_after="2023-04-30">
+    enum="BatterySaverModeState" expires_after="2023-07-02">
   <owner>charlesmeng@chromium.org</owner>
   <owner>chrome-performance-ui-sea@google.com</owner>
   <summary>
@@ -53,7 +53,7 @@
 </histogram>
 
 <histogram name="PerformanceControls.HighEfficiency.BubbleAction"
-    enum="HighEfficiencyBubbleActionType" expires_after="2023-04-30">
+    enum="HighEfficiencyBubbleActionType" expires_after="2023-07-02">
   <owner>agale@chromium.org</owner>
   <owner>chrome-performance-ui-sea@google.com</owner>
   <summary>
@@ -90,7 +90,7 @@
 
 <histogram
     name="PerformanceControls.HighEfficiency.SettingsChangeExceptionList"
-    enum="HighEfficiencyModeExceptionListAction" expires_after="2023-04-30">
+    enum="HighEfficiencyModeExceptionListAction" expires_after="2023-07-02">
   <owner>charlesmeng@chromium.org</owner>
   <owner>chrome-performance-ui-sea@google.com</owner>
   <summary>
@@ -102,7 +102,7 @@
 </histogram>
 
 <histogram name="PerformanceControls.HighEfficiency.SettingsChangeMode"
-    enum="BooleanEnabled" expires_after="2023-04-30">
+    enum="BooleanEnabled" expires_after="2023-07-02">
   <owner>charlesmeng@chromium.org</owner>
   <owner>chrome-performance-ui-sea@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/permissions/histograms.xml b/tools/metrics/histograms/metadata/permissions/histograms.xml
index bee1fe0..7b4cc3f 100644
--- a/tools/metrics/histograms/metadata/permissions/histograms.xml
+++ b/tools/metrics/histograms/metadata/permissions/histograms.xml
@@ -498,7 +498,7 @@
 </histogram>
 
 <histogram name="Permissions.Engagement.Ignored" units="%"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>engedy@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -1120,7 +1120,7 @@
 </histogram>
 
 <histogram base="true" name="Permissions.Usage.ElapsedTimeSinceGrant"
-    units="seconds" expires_after="2023-04-30">
+    units="seconds" expires_after="2023-07-02">
   <owner>engedy@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/platform/histograms.xml b/tools/metrics/histograms/metadata/platform/histograms.xml
index 5c1878d..3d049f2 100644
--- a/tools/metrics/histograms/metadata/platform/histograms.xml
+++ b/tools/metrics/histograms/metadata/platform/histograms.xml
@@ -547,7 +547,7 @@
 </histogram>
 
 <histogram name="Platform.Fwupd.ActivateStatus" enum="FwupdReturnValue"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>campello@google.com</owner>
   <owner>chromeos-fwupd@google.com</owner>
   <summary>
@@ -557,7 +557,7 @@
 </histogram>
 
 <histogram name="Platform.Fwupd.UpdateDuration" units="seconds"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>campello@google.com</owner>
   <owner>chromeos-fwupd@google.com</owner>
   <summary>
@@ -567,7 +567,7 @@
 </histogram>
 
 <histogram name="Platform.Fwupd.UpdateStatus" enum="FwupdReturnValue"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>campello@google.com</owner>
   <owner>chromeos-fwupd@google.com</owner>
   <summary>
@@ -1303,7 +1303,7 @@
 </histogram>
 
 <histogram name="Platform.Missive.MemoryUsage" units="0.1MiB"
-    expires_after="2023-05-03">
+    expires_after="2023-07-02">
   <owner>xuhong@chromium.org</owner>
   <owner>lbaraz@chromium.org</owner>
   <owner>cros-reporting-team@google.com</owner>
@@ -1326,7 +1326,7 @@
 </histogram>
 
 <histogram name="Platform.Missive.StorageUsage" units="MiB"
-    expires_after="2023-05-03">
+    expires_after="2023-07-02">
   <owner>xuhong@chromium.org</owner>
   <owner>lbaraz@chromium.org</owner>
   <owner>cros-reporting-team@google.com</owner>
@@ -1620,7 +1620,7 @@
 </histogram>
 
 <histogram name="Platform.StatefulWritesDaily" units="KiB"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>asavery@chromium.org</owner>
   <owner>gwendal@chromium.org</owner>
   <owner>chromeos-storage@google.com</owner>
@@ -1666,7 +1666,7 @@
   </summary>
 </histogram>
 
-<histogram name="Platform.SwapInDaily" units="pages" expires_after="2023-04-30">
+<histogram name="Platform.SwapInDaily" units="pages" expires_after="2023-07-02">
   <owner>asavery@chromium.org</owner>
   <owner>chromeos-memory@google.com</owner>
   <summary>Number of pages swapped IN over a day, sampled daily.</summary>
@@ -1691,7 +1691,7 @@
 </histogram>
 
 <histogram name="Platform.SwapOutDaily" units="pages"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>asavery@chromium.org</owner>
   <owner>chromeos-memory@google.com</owner>
   <summary>Number of pages swapped OUT over a day, sampled daily.</summary>
@@ -1857,7 +1857,7 @@
 </histogram>
 
 <histogram name="Platform.TPM.VersionFingerprint" enum="TPMVersionFingerprint"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>mnissler@chromium.org</owner>
   <owner>cros-hwsec+uma@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/power/histograms.xml b/tools/metrics/histograms/metadata/power/histograms.xml
index 832b4bfe..4c5852b 100644
--- a/tools/metrics/histograms/metadata/power/histograms.xml
+++ b/tools/metrics/histograms/metadata/power/histograms.xml
@@ -816,6 +816,7 @@
   <summary>
     Chrome OS {BatteryCapacityType} battery capacity in milliwatt-hours.
   </summary>
+  <token key="BatteryCapacityType" variants="BatteryCapacityType"/>
 </histogram>
 
 <histogram name="Power.BatteryChargeHealth" units="%"
@@ -921,7 +922,7 @@
 </histogram>
 
 <histogram name="Power.BatteryDischargeRate" units="mW"
-    expires_after="2023-06-25">
+    expires_after="2023-07-02">
   <owner>puthik@chromium.org</owner>
   <owner>chromeos-platform-power@google.com</owner>
   <summary>
@@ -1028,6 +1029,7 @@
     rate sampling in Power.BatteryDischargeRate. Note that the size of the
     battery is derated by the low battery shutdown percent.
   </summary>
+  <token key="BatteryCapacityType" variants="BatteryCapacityType"/>
 </histogram>
 
 <histogram name="Power.BatteryLifeWhileSuspended.{BatteryCapacityType}"
@@ -1041,6 +1043,7 @@
     This is calculated using size of the battery divide by battery discharge
     rate sampling in Power.BatteryDischargeRateWhileSuspended.
   </summary>
+  <token key="BatteryCapacityType" variants="BatteryCapacityType"/>
 </histogram>
 
 <histogram name="Power.BatteryPercentDrop" units="%" expires_after="2023-06-25">
@@ -2100,7 +2103,7 @@
 </histogram>
 
 <histogram name="Power.PowerButtonPressInLaptopMode"
-    enum="PowerButtonPressType" expires_after="2023-05-01">
+    enum="PowerButtonPressType" expires_after="2023-07-02">
   <owner>minch@chromium.org</owner>
   <owner>xdai@chromium.org</owner>
   <summary>
@@ -2111,7 +2114,7 @@
 </histogram>
 
 <histogram name="Power.PowerButtonPressInTabletMode"
-    enum="PowerButtonPressType" expires_after="2023-05-01">
+    enum="PowerButtonPressType" expires_after="2023-07-02">
   <owner>minch@chromium.org</owner>
   <owner>xdai@chromium.org</owner>
   <summary>
@@ -2332,7 +2335,7 @@
 </histogram>
 
 <histogram name="PowerML.DimImminent.Action" enum="PowerMLDimImminentAction"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>napper@chromium.org</owner>
   <owner>thanhdng@chromium.org</owner>
   <summary>
@@ -2342,7 +2345,7 @@
 </histogram>
 
 <histogram name="PowerML.ModelDim.Result" enum="PowerMLFinalResult"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>napper@chromium.org</owner>
   <owner>thanhdng@chromium.org</owner>
   <summary>
@@ -2352,7 +2355,7 @@
 </histogram>
 
 <histogram name="PowerML.ModelNoDim.Result" enum="PowerMLFinalResult"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>napper@chromium.org</owner>
   <owner>thanhdng@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/print/histograms.xml b/tools/metrics/histograms/metadata/print/histograms.xml
index 0200bf8b..bf2bd7e 100644
--- a/tools/metrics/histograms/metadata/print/histograms.xml
+++ b/tools/metrics/histograms/metadata/print/histograms.xml
@@ -75,7 +75,7 @@
 </histogram>
 
 <histogram name="PrintPreview.PrintDocumentType"
-    enum="PrintPreviewPrintDocumentTypeBuckets" expires_after="2023-04-30">
+    enum="PrintPreviewPrintDocumentTypeBuckets" expires_after="2023-07-02">
   <owner>rbpotter@chromium.org</owner>
   <owner>awscreen@chromium.org</owner>
   <summary>
@@ -194,7 +194,7 @@
 </histogram>
 
 <histogram name="PrintPreview.UserAction" enum="PrintPreviewUserActionType"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>thestig@chromium.org</owner>
   <owner>awscreen@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/printing/histograms.xml b/tools/metrics/histograms/metadata/printing/histograms.xml
index a9bedf0..4e94f15 100644
--- a/tools/metrics/histograms/metadata/printing/histograms.xml
+++ b/tools/metrics/histograms/metadata/printing/histograms.xml
@@ -118,7 +118,7 @@
 </histogram>
 
 <histogram name="Printing.CUPS.IppDeviceReachable" enum="BooleanSuccess"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>bmgordon@chromium.org</owner>
   <owner>cros-printing-dev@chromium.org</owner>
   <summary>
@@ -194,7 +194,7 @@
 </histogram>
 
 <histogram name="Printing.CUPS.PrinterAdded" enum="PrinterProtocol"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>bmgordon@chromium.org</owner>
   <owner>src/chromeos/printing/OWNERS</owner>
   <summary>
@@ -218,7 +218,7 @@
 </histogram>
 
 <histogram name="Printing.CUPS.PrinterRemoved" enum="PrinterProtocol"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>bmgordon@chromium.org</owner>
   <owner>src/chromeos/printing/OWNERS</owner>
   <summary>
@@ -252,7 +252,7 @@
 </histogram>
 
 <histogram name="Printing.CUPS.PrinterSetupResult.PrintPreview"
-    enum="PrinterSetupResult" expires_after="2023-04-30">
+    enum="PrinterSetupResult" expires_after="2023-07-02">
   <owner>bmgordon@chromium.org</owner>
   <owner>cros-printing-dev@chromium.org</owner>
   <summary>
@@ -356,7 +356,7 @@
 </histogram>
 
 <histogram name="Printing.CUPS.ZeroconfPrinterSetupResult.PrintPreview"
-    enum="PrinterSetupResult" expires_after="2023-04-30">
+    enum="PrinterSetupResult" expires_after="2023-07-02">
   <owner>bmgordon@chromium.org</owner>
   <owner>cros-printing-dev@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/privacy/histograms.xml b/tools/metrics/histograms/metadata/privacy/histograms.xml
index 99b549f..d3d2c31 100644
--- a/tools/metrics/histograms/metadata/privacy/histograms.xml
+++ b/tools/metrics/histograms/metadata/privacy/histograms.xml
@@ -648,7 +648,7 @@
 
 <histogram name="PrivacySandbox.PrivateAggregation.Budgeter.RequestResult"
     enum="PrivacySandboxPrivateAggregationBudgeterRequestResult"
-    expires_after="2023-04-27">
+    expires_after="2023-07-02">
   <owner>alexmt@chromium.org</owner>
   <owner>linnan@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/profile/histograms.xml b/tools/metrics/histograms/metadata/profile/histograms.xml
index ba33de3..4aca1af 100644
--- a/tools/metrics/histograms/metadata/profile/histograms.xml
+++ b/tools/metrics/histograms/metadata/profile/histograms.xml
@@ -98,7 +98,7 @@
 </histogram>
 
 <histogram name="Profile.BrowserActive.PerProfile" enum="Profile"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>msarda@chromium.org</owner>
   <owner>tangltom@chromium.org</owner>
   <summary>
@@ -201,7 +201,7 @@
 </histogram>
 
 <histogram name="Profile.Guest.OTR.Lifetime" units="minutes"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>rhalavati@chromium.org</owner>
   <owner>chrome-incognito@google.com</owner>
   <summary>
@@ -574,7 +574,7 @@
 </histogram>
 
 <histogram base="true" name="Profile.State.UnconsentedPrimaryAccountType"
-    enum="ProfileUnconsentedPrimaryAccountType" expires_after="2023-04-30">
+    enum="ProfileUnconsentedPrimaryAccountType" expires_after="2023-07-02">
   <owner>jkrcal@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/quick_answers/histograms.xml b/tools/metrics/histograms/metadata/quick_answers/histograms.xml
index 0feec29..259befd1 100644
--- a/tools/metrics/histograms/metadata/quick_answers/histograms.xml
+++ b/tools/metrics/histograms/metadata/quick_answers/histograms.xml
@@ -157,7 +157,7 @@
 </histogram>
 
 <histogram name="QuickAnswers.Intent" enum="QuickAnswersIntentType"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>updowndota@chromium.org</owner>
   <owner>llin@google.com</owner>
   <owner>croissant-eng@chromium.org</owner>
@@ -255,7 +255,7 @@
 </histogram>
 
 <histogram name="QuickAnswers.SelectedContent.Length" units="characters"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>updowndota@chromium.org</owner>
   <owner>llin@google.com</owner>
   <owner>croissant-eng@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/quota/histograms.xml b/tools/metrics/histograms/metadata/quota/histograms.xml
index 6f5442c..b18d6388 100644
--- a/tools/metrics/histograms/metadata/quota/histograms.xml
+++ b/tools/metrics/histograms/metadata/quota/histograms.xml
@@ -43,7 +43,7 @@
 </histogram>
 
 <histogram name="Quota.AvailableDiskSpace" units="MB"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>ayui@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
@@ -78,7 +78,7 @@
   </token>
 </histogram>
 
-<histogram name="Quota.DiskspaceShortage" units="MB" expires_after="2023-04-30">
+<histogram name="Quota.DiskspaceShortage" units="MB" expires_after="2023-07-02">
   <owner>ayui@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
@@ -174,7 +174,7 @@
 </histogram>
 
 <histogram name="Quota.PercentDiskAvailable2" units="%"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>ayui@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/renderer/histograms.xml b/tools/metrics/histograms/metadata/renderer/histograms.xml
index 12aa73da..4258495 100644
--- a/tools/metrics/histograms/metadata/renderer/histograms.xml
+++ b/tools/metrics/histograms/metadata/renderer/histograms.xml
@@ -69,7 +69,7 @@
 </histogram>
 
 <histogram name="Renderer.CriticalFonts.BlockingResourcesLoadTime" units="ms"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>yoavweiss@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
   <summary>
@@ -81,7 +81,7 @@
 </histogram>
 
 <histogram name="Renderer.CriticalFonts.CriticalFontDelay" units="ms"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>yoavweiss@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
   <summary>
@@ -94,7 +94,7 @@
 </histogram>
 
 <histogram name="Renderer.CriticalFonts.PreloadedFontsLoadTime" units="ms"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>yoavweiss@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
   <summary>
@@ -503,7 +503,7 @@
 </histogram>
 
 <histogram name="RendererScheduler.RendererMainThreadLoad5" units="%"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>altimin@chromium.org</owner>
   <summary>
     Renderer main thread load (percentage of time spent in tasks), reported in
diff --git a/tools/metrics/histograms/metadata/renderer4/histograms.xml b/tools/metrics/histograms/metadata/renderer4/histograms.xml
index b3f5b9e..755c2bf 100644
--- a/tools/metrics/histograms/metadata/renderer4/histograms.xml
+++ b/tools/metrics/histograms/metadata/renderer4/histograms.xml
@@ -134,7 +134,7 @@
 </histogram>
 
 <histogram name="Renderer4.GpuRasterizationEnabled" enum="BooleanEnabled"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>jonross@chromium.org</owner>
   <owner>graphics-dev@chromium.org</owner>
   <summary>
@@ -292,7 +292,7 @@
 </histogram>
 
 <histogram name="Renderer4.ScrollingThread" enum="ScrollingThreadStatus"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
 <!-- Name completed by histogram_suffixes name="ScrollSourceDevice" -->
 
   <owner>bokan@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
index 99ec210..b0e3a1a3 100644
--- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
+++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -644,7 +644,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.ExtensionPersister.AgedFileFound"
-    enum="BooleanFound" expires_after="2023-04-30">
+    enum="BooleanFound" expires_after="2023-07-02">
   <owner>psarouthakis@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -675,7 +675,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.ExtensionPersister.ReadResult"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>psarouthakis@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -687,7 +687,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.ExtensionPersister.WriteResult"
-    enum="BooleanSuccess" expires_after="2023-04-30">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>psarouthakis@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1048,7 +1048,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.Pref.Daily.Extended" enum="BooleanEnabled"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1175,7 +1175,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.RendererThrottle.TotalDelay2" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1263,7 +1263,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.RT.ConsumerVersionReason"
-    enum="SafeBrowsingRTConsumerVersionReason" expires_after="2023-04-30">
+    enum="SafeBrowsingRTConsumerVersionReason" expires_after="2023-07-02">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1323,7 +1323,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.RT.HasTokenFromFetcher" enum="BooleanHasToken"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1426,7 +1426,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.RT.Network.Result"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2023-06-25">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2023-07-02">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1580,7 +1580,7 @@
 
 <histogram
     name="SafeBrowsing.TailoredSecurity.ConsentedDesktopDialogDisabledOutcome"
-    enum="SafeBrowsingTailoredSecurityOutcome" expires_after="2023-04-23">
+    enum="SafeBrowsingTailoredSecurityOutcome" expires_after="2023-07-02">
   <owner>jacastro@chromium.org</owner>
   <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
@@ -1831,7 +1831,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.V4GetHash.CacheHit.Result"
-    enum="SafeBrowsingV4FullHashCacheResult" expires_after="2023-04-30">
+    enum="SafeBrowsingV4FullHashCacheResult" expires_after="2023-07-02">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>Track cache hits for V4 full hashes.</summary>
@@ -2011,7 +2011,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.V4ProcessPartialUpdate.AdditionsHashesCount"
-    units="entries" expires_after="2023-04-30">
+    units="entries" expires_after="2023-07-02">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2021,7 +2021,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.V4ProcessPartialUpdate.ApplyUpdate.Result"
-    enum="SafeBrowsingV4ApplyUpdateResult" expires_after="2023-04-30">
+    enum="SafeBrowsingV4ApplyUpdateResult" expires_after="2023-07-02">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2333,7 +2333,7 @@
 </histogram>
 
 <histogram name="SafeBrowsingBinaryUploadRequest.DlpResult"
-    enum="BooleanSuccess" expires_after="2023-05-01">
+    enum="BooleanSuccess" expires_after="2023-07-02">
   <owner>domfc@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/sb_client/histograms.xml b/tools/metrics/histograms/metadata/sb_client/histograms.xml
index 42c02b5..8e5216d 100644
--- a/tools/metrics/histograms/metadata/sb_client/histograms.xml
+++ b/tools/metrics/histograms/metadata/sb_client/histograms.xml
@@ -183,7 +183,7 @@
 </histogram>
 
 <histogram name="SBClientDownload.DownloadRequestDuration" units="ms"
-    expires_after="2023-06-25">
+    expires_after="2023-07-02">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <owner>mattm@chromium.org</owner>
@@ -337,7 +337,7 @@
 </histogram>
 
 <histogram name="SBClientDownload.FileFeatureExtractionDuration" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>drubery@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -347,7 +347,7 @@
 </histogram>
 
 <histogram name="SBClientDownload.GetTabRedirectsDuration" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>drubery@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -379,7 +379,7 @@
 </histogram>
 
 <histogram name="SBClientDownload.MemoryMapFileDuration" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>drubery@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/scanning/histograms.xml b/tools/metrics/histograms/metadata/scanning/histograms.xml
index 242072a..be75e046 100644
--- a/tools/metrics/histograms/metadata/scanning/histograms.xml
+++ b/tools/metrics/histograms/metadata/scanning/histograms.xml
@@ -105,7 +105,7 @@
 </histogram>
 
 <histogram name="Scanning.NumDetectedScanners" units="scanners"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>gavinwill@chromium.org</owner>
   <owner>cros-peripherals@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/scheduler/histograms.xml b/tools/metrics/histograms/metadata/scheduler/histograms.xml
index 883b957..2c78e729 100644
--- a/tools/metrics/histograms/metadata/scheduler/histograms.xml
+++ b/tools/metrics/histograms/metadata/scheduler/histograms.xml
@@ -199,7 +199,7 @@
 </histogram>
 
 <histogram name="Scheduling.Renderer.DeadlineMode"
-    enum="RendererSchedulerDeadlineMode" expires_after="2023-04-30">
+    enum="RendererSchedulerDeadlineMode" expires_after="2023-07-02">
   <owner>weiliangc@chromium.org</owner>
   <owner>chrome-gpu-metrics@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/security/histograms.xml b/tools/metrics/histograms/metadata/security/histograms.xml
index 05d58f7d..f3324c4 100644
--- a/tools/metrics/histograms/metadata/security/histograms.xml
+++ b/tools/metrics/histograms/metadata/security/histograms.xml
@@ -633,7 +633,7 @@
 </histogram>
 
 <histogram base="true" name="Security.SiteEngagement" units="units"
-    expires_after="2023-03-19">
+    expires_after="2023-07-02">
   <owner>cthomp@chromium.org</owner>
   <owner>security-enamel@chromium.org</owner>
   <summary>
@@ -658,7 +658,7 @@
 </histogram>
 
 <histogram base="true" name="Security.TimeOnPage2" units="ms"
-    expires_after="2023-04-23">
+    expires_after="2023-07-02">
   <owner>cthomp@chromium.org</owner>
   <owner>security-enamel@chromium.org</owner>
   <summary>
@@ -1038,7 +1038,7 @@
 </histogram>
 
 <histogram name="SiteIsolation.SiteInstancesPerBrowsingInstance" units="units"
-    expires_after="2023-04-23">
+    expires_after="2023-07-02">
   <owner>alexmos@chromium.org</owner>
   <owner>creis@chromium.org</owner>
   <owner>lukasza@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml b/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml
index 08b37e9..a8eaa29 100644
--- a/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml
+++ b/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml
@@ -121,7 +121,7 @@
 
 <histogram
     name="SegmentationPlatform.AdaptiveToolbar.SegmentSelection.Computed"
-    enum="AdaptiveToolbarButtonVariant" expires_after="2023-06-25">
+    enum="AdaptiveToolbarButtonVariant" expires_after="2023-07-02">
   <owner>shaktisahu@chromium.org</owner>
   <owner>chrome-segmentation-platform@google.com</owner>
   <summary>
@@ -541,7 +541,7 @@
 </histogram>
 
 <histogram name="SegmentationPlatform.SelectionFailedReason"
-    enum="SegmentationSelectionFailureReason" expires_after="2023-06-25">
+    enum="SegmentationSelectionFailureReason" expires_after="2023-07-02">
   <owner>ssid@chromium.org</owner>
   <owner>chrome-segmentation-platform@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/service/histograms.xml b/tools/metrics/histograms/metadata/service/histograms.xml
index 63187f6..f090621 100644
--- a/tools/metrics/histograms/metadata/service/histograms.xml
+++ b/tools/metrics/histograms/metadata/service/histograms.xml
@@ -1100,7 +1100,7 @@
 </histogram>
 
 <histogram name="ServiceWorker.StartWorker.Status"
-    enum="ServiceWorkerStatusCode" expires_after="2023-04-30">
+    enum="ServiceWorkerStatusCode" expires_after="2023-07-02">
   <owner>wanderview@chromium.org</owner>
   <owner>asamidoi@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
@@ -1126,7 +1126,7 @@
 </histogram>
 
 <histogram name="ServiceWorker.StartWorker.Time" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>wanderview@chromium.org</owner>
   <owner>asamidoi@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/session/histograms.xml b/tools/metrics/histograms/metadata/session/histograms.xml
index bf557d2..01a2a17 100644
--- a/tools/metrics/histograms/metadata/session/histograms.xml
+++ b/tools/metrics/histograms/metadata/session/histograms.xml
@@ -49,7 +49,7 @@
 </histogram>
 
 <histogram name="Session.IsActive" enum="BooleanActive"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>rogerm@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/settings/histograms.xml b/tools/metrics/histograms/metadata/settings/histograms.xml
index 218b6f1..e896bfd 100644
--- a/tools/metrics/histograms/metadata/settings/histograms.xml
+++ b/tools/metrics/histograms/metadata/settings/histograms.xml
@@ -134,7 +134,7 @@
 </histogram>
 
 <histogram name="Settings.GivenShowHomeButton_HomePageIsNewTabPage"
-    enum="Boolean" expires_after="2023-04-30">
+    enum="Boolean" expires_after="2023-07-02">
   <owner>mpearson@chromium.org</owner>
   <owner>twellington@chromium.org</owner>
   <summary>
@@ -245,7 +245,7 @@
 </histogram>
 
 <histogram name="Settings.PreloadStatus.OnStartup2" enum="BooleanEnabled"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>harrisonsean@chromium.org</owner>
   <owner>chrome-friendly-settings@google.com</owner>
   <summary>
@@ -585,7 +585,7 @@
 </histogram>
 
 <histogram name="Settings.TrackedPreferenceChanged" enum="TrackedPreference"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>proberge@chromium.org</owner>
   <owner>junhao.huang@microsoft.com</owner>
   <summary>
@@ -644,7 +644,7 @@
 </histogram>
 
 <histogram name="Settings.TrackedPreferenceReset" enum="TrackedPreference"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>proberge@chromium.org</owner>
   <owner>junhao.huang@microsoft.com</owner>
   <summary>The id of a tracked preference which was reset by Chrome.</summary>
diff --git a/tools/metrics/histograms/metadata/sharing/histograms.xml b/tools/metrics/histograms/metadata/sharing/histograms.xml
index 6d80aff..dd65efd 100644
--- a/tools/metrics/histograms/metadata/sharing/histograms.xml
+++ b/tools/metrics/histograms/metadata/sharing/histograms.xml
@@ -407,7 +407,7 @@
 </histogram>
 
 <histogram name="Sharing.SendTabToSelf.NotificationStatus"
-    enum="SendTabToSelfNotificationStatus" expires_after="2023-04-30">
+    enum="SendTabToSelfNotificationStatus" expires_after="2023-07-02">
   <owner>ellyjones@chromium.org</owner>
   <owner>src/chrome/browser/share/OWNERS</owner>
   <summary>
@@ -499,7 +499,7 @@
 </histogram>
 
 <histogram name="Sharing.SharingHubAndroid.Opened" enum="ShareOrigin"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>sophey@chromium.org</owner>
   <owner>src/chrome/browser/share/OWNERS</owner>
   <summary>
@@ -531,7 +531,7 @@
 </histogram>
 
 <histogram name="Sharing.SharingHubAndroid.TimeToShare" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>sophey@chromium.org</owner>
   <owner>src/chrome/browser/share/OWNERS</owner>
   <summary>
@@ -574,7 +574,7 @@
 </histogram>
 
 <histogram name="Sharing.SharingHubDesktop.CrOSSharesheetResult"
-    enum="SharingHubSharesheetResult" expires_after="2023-04-30">
+    enum="SharingHubSharesheetResult" expires_after="2023-07-02">
   <owner>kristipark@chromium.org</owner>
   <owner>src/chrome/browser/share/OWNERS</owner>
   <summary>
@@ -621,7 +621,7 @@
 </histogram>
 
 <histogram name="Sharing.SmsFetcherAvailableDeviceCount" units="devices"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>yigu@chromium.org</owner>
   <owner>src/content/browser/sms/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/signin/histograms.xml b/tools/metrics/histograms/metadata/signin/histograms.xml
index efc0963..3104240 100644
--- a/tools/metrics/histograms/metadata/signin/histograms.xml
+++ b/tools/metrics/histograms/metadata/signin/histograms.xml
@@ -22,7 +22,7 @@
 
 <histograms>
 
-<histogram name="Signin" enum="SigninHelperFlow" expires_after="2023-06-25">
+<histogram name="Signin" enum="SigninHelperFlow" expires_after="2023-07-02">
   <owner>mlerman@chromium.org</owner>
   <summary>
     Tracks user interactions as they sign in through a flow. The suffix of the
@@ -105,7 +105,7 @@
 </histogram>
 
 <histogram name="Signin.AccountFetcher.AccountAvatarFetchTime" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>triploblastic@chromium.org</owner>
   <owner>aliceywang@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -268,7 +268,7 @@
 </histogram>
 
 <histogram name="Signin.AuthError" enum="GoogleServiceAuthError"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>msarda@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/storage/histograms.xml b/tools/metrics/histograms/metadata/storage/histograms.xml
index 93fe77c9..ed6e03f 100644
--- a/tools/metrics/histograms/metadata/storage/histograms.xml
+++ b/tools/metrics/histograms/metadata/storage/histograms.xml
@@ -535,7 +535,7 @@
 </histogram>
 
 <histogram name="Storage.SharedStorage.Database.Error" enum="SqliteErrorCode"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>cammie@chromium.org</owner>
   <owner>yaoxia@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/subresource/histograms.xml b/tools/metrics/histograms/metadata/subresource/histograms.xml
index 1cf2002..441489e 100644
--- a/tools/metrics/histograms/metadata/subresource/histograms.xml
+++ b/tools/metrics/histograms/metadata/subresource/histograms.xml
@@ -579,7 +579,7 @@
 </histogram>
 
 <histogram name="SubresourceFilter.SafeBrowsing.TotalCheckTime" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>alexmt@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/sync/histograms.xml b/tools/metrics/histograms/metadata/sync/histograms.xml
index a365be1..1bdbfa4 100644
--- a/tools/metrics/histograms/metadata/sync/histograms.xml
+++ b/tools/metrics/histograms/metadata/sync/histograms.xml
@@ -533,7 +533,10 @@
 </histogram>
 
 <histogram name="Sync.InitialState" enum="SyncInitialState"
-    expires_after="2023-05-07">
+    expires_after="M110">
+  <obsolete>
+    Replaced in M108 by Sync.InitialState2.
+  </obsolete>
   <owner>treib@chromium.org</owner>
   <owner>mastiz@chromium.org</owner>
   <component>Services&gt;Sync</component>
@@ -597,8 +600,10 @@
   <summary>The reason for a failure decrypting the keystore Nigori.</summary>
 </histogram>
 
-<histogram name="Sync.Local.Enabled" enum="BooleanEnabled"
-    expires_after="2023-06-25">
+<histogram name="Sync.Local.Enabled" enum="BooleanEnabled" expires_after="M110">
+  <obsolete>
+    Replaced in M108 by Sync.Local.Enabled2.
+  </obsolete>
   <owner>igorruvinov@chromium.org</owner>
   <owner>pastarmovj@chromium.org</owner>
   <component>Services&gt;Sync</component>
@@ -646,7 +651,10 @@
 </histogram>
 
 <histogram name="Sync.Local.RoamingProfileUnavailable" enum="BooleanError"
-    expires_after="2023-08-01">
+    expires_after="M110">
+  <obsolete>
+    Replaced in M108 by Sync.Local.RoamingProfileUnavailable2.
+  </obsolete>
   <owner>igorruvinov@chromium.org</owner>
   <owner>pastarmovj@chromium.org</owner>
   <component>Services&gt;Sync</component>
@@ -1002,7 +1010,7 @@
 </histogram>
 
 <histogram name="Sync.PendingInvalidationStatus"
-    enum="PendingInvalidationStatus" expires_after="2023-04-30">
+    enum="PendingInvalidationStatus" expires_after="2023-07-02">
   <owner>shabdan@google.com</owner>
   <owner>rushans@google.com</owner>
   <component>Services&gt;Sync</component>
@@ -1014,7 +1022,7 @@
 </histogram>
 
 <histogram name="Sync.PostedClientToServerMessage"
-    enum="SyncClientToServerMessageContents" expires_after="2023-04-30">
+    enum="SyncClientToServerMessageContents" expires_after="2023-07-02">
   <owner>mastiz@chromium.org</owner>
   <component>Services&gt;Sync</component>
   <summary>
@@ -1024,7 +1032,7 @@
 </histogram>
 
 <histogram name="Sync.PostedClientToServerMessageError2" enum="SyncErrorType"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>mastiz@chromium.org</owner>
   <owner>treib@chromium.org</owner>
   <component>Services&gt;Sync</component>
diff --git a/tools/metrics/histograms/metadata/tab/histograms.xml b/tools/metrics/histograms/metadata/tab/histograms.xml
index cb5d99a..40ed1cc4 100644
--- a/tools/metrics/histograms/metadata/tab/histograms.xml
+++ b/tools/metrics/histograms/metadata/tab/histograms.xml
@@ -344,7 +344,7 @@
   </token>
 </histogram>
 
-<histogram name="Tab.Count.Guest" units="units" expires_after="2023-04-30">
+<histogram name="Tab.Count.Guest" units="units" expires_after="2023-07-02">
   <owner>rhalavati@chromium.org</owner>
   <owner>chrome-incognito@google.com</owner>
   <summary>
@@ -427,7 +427,7 @@
 </histogram>
 
 <histogram name="Tab.PerceivedRestoreTime" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>ckitagawa@chromium.org</owner>
   <owner>dtrainor@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
@@ -654,7 +654,7 @@
 </histogram>
 
 <histogram name="Tab.StatusWhenSwitchedBackToForeground" enum="TabStatus"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>ckitagawa@chromium.org</owner>
   <owner>marq@chromium.org</owner>
   <summary>
@@ -812,7 +812,7 @@
 </histogram>
 
 <histogram name="TabGroups.UserCustomizedGroupCountPerLoad" units="groups"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>connily@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -1135,7 +1135,7 @@
 </histogram>
 
 <histogram name="TabManager.Discarding.DiscardCount" units="Discards"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>chrisha@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
@@ -1194,7 +1194,7 @@
 </histogram>
 
 <histogram name="TabManager.Discarding.ReloadCount" units="Reloads"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>chrisha@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
@@ -1733,7 +1733,7 @@
 </histogram>
 
 <histogram name="Tabs.SadTab.Reload.Event" enum="SadTabEvent"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>sonnyrao@chromium.org</owner>
   <owner>jamescook@chromium.org</owner>
   <summary>
@@ -2119,7 +2119,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.CloseAction" enum="TabSearchCloseActions"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>tluk@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <summary>
@@ -2135,7 +2135,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.Mojo.SwitchToTab" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>kerenzhu@chromium.org</owner>
   <owner>romanarora@chromium.org</owner>
   <owner>yuhengh@chromium.org</owner>
@@ -2161,7 +2161,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.Mojo.TabUpdated" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>kerenzhu@chromium.org</owner>
   <owner>romanarora@chromium.org</owner>
   <owner>yuhengh@chromium.org</owner>
@@ -2188,7 +2188,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.NumTabsClosedPerInstance" units="tabs"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>tluk@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <summary>
@@ -2201,7 +2201,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.NumTabsOnOpen" units="tabs"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>tluk@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <summary>
@@ -2239,7 +2239,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.PageHandlerConstructionDelay" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>tluk@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <owner>yuhengh@chromium.org</owner>
@@ -2258,7 +2258,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.RecentlyClosedSectionToggleAction"
-    enum="TabSearchRecentlyClosedToggleActions" expires_after="2023-04-30">
+    enum="TabSearchRecentlyClosedToggleActions" expires_after="2023-07-02">
   <owner>romanarora@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <owner>tluk@chromium.org</owner>
@@ -2316,7 +2316,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.WebUI.LoadCompletedTime" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>tluk@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <summary>
@@ -2327,7 +2327,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.WebUI.LoadDocumentTime" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>tluk@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <summary>
@@ -2353,7 +2353,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.WebUI.SearchAlgorithmDuration" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>yuhengh@chromium.org</owner>
   <owner>chrome-cros@chromium.org</owner>
   <summary>
@@ -2364,7 +2364,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.WebUI.TabListDataReceived" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>tluk@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <owner>yuhengh@chromium.org</owner>
@@ -2377,7 +2377,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.WebUI.TabListDataReceived2" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>kerenzhu@chromium.org</owner>
   <owner>tluk@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
@@ -2438,7 +2438,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.WindowDisplayedDuration3" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>tluk@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <summary>
@@ -2461,7 +2461,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.WindowTimeToShowCachedWebView" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>tluk@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <owner>yuhengh@chromium.org</owner>
@@ -2480,7 +2480,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.WindowTimeToShowUncachedWebView" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>tluk@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <owner>yuhengh@chromium.org</owner>
@@ -2777,7 +2777,7 @@
   <token key="BatteryState" variants="BatteryState"/>
 </histogram>
 
-<histogram name="Tabs.WindowWidth" units="DIPs" expires_after="2023-04-30">
+<histogram name="Tabs.WindowWidth" units="DIPs" expires_after="2023-07-02">
   <owner>collinbaker@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/translate/histograms.xml b/tools/metrics/histograms/metadata/translate/histograms.xml
index 71b7a293..9193ae8c 100644
--- a/tools/metrics/histograms/metadata/translate/histograms.xml
+++ b/tools/metrics/histograms/metadata/translate/histograms.xml
@@ -59,7 +59,7 @@
 </histogram>
 
 <histogram name="Translate.ApplicationStart.NeverTranslateLanguage"
-    enum="LocaleCodeISO639" expires_after="2023-04-30">
+    enum="LocaleCodeISO639" expires_after="2023-07-02">
   <owner>megjablon@google.com</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
@@ -380,7 +380,7 @@
 </histogram>
 
 <histogram name="Translate.MenuTranslation.UnavailableReasons"
-    enum="MenuTranslationUnavailableReason" expires_after="2023-04-30">
+    enum="MenuTranslationUnavailableReason" expires_after="2023-07-02">
   <owner>cuianthony@google.com</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/uma/histograms.xml b/tools/metrics/histograms/metadata/uma/histograms.xml
index f4650e28..551889a 100644
--- a/tools/metrics/histograms/metadata/uma/histograms.xml
+++ b/tools/metrics/histograms/metadata/uma/histograms.xml
@@ -284,7 +284,7 @@
 </histogram>
 
 <histogram name="UMA.IsClonedInstall" enum="BooleanCloned"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>asvitkine@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -295,7 +295,7 @@
 </histogram>
 
 <histogram name="UMA.JavaCachingRecorder.DroppedHistogramSampleCount"
-    units="samples" expires_after="2023-04-30">
+    units="samples" expires_after="2023-07-02">
   <owner>bttk@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -463,7 +463,7 @@
 </histogram>
 
 <histogram name="UMA.MetricsReporting.Toggle" enum="MetricsReportingChange"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>asvitkine@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -904,7 +904,7 @@
 </histogram>
 
 <histogram name="UMA.TruncatedEvents.UserAction" units="events"
-    expires_after="2023-06-25">
+    expires_after="2023-07-02">
   <owner>rkaplow@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/v8/histograms.xml b/tools/metrics/histograms/metadata/v8/histograms.xml
index d21da244..f7f09bc1 100644
--- a/tools/metrics/histograms/metadata/v8/histograms.xml
+++ b/tools/metrics/histograms/metadata/v8/histograms.xml
@@ -150,7 +150,7 @@
 </histogram>
 
 <histogram name="V8.CompileScriptMicroSeconds" units="microseconds"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>leszeks@chromium.org</owner>
   <owner>v8-runtime@google.com</owner>
   <summary>
@@ -182,7 +182,7 @@
 </histogram>
 
 <histogram name="V8.CompileScriptMicroSeconds.ConsumeCache"
-    units="microseconds" expires_after="2023-04-30">
+    units="microseconds" expires_after="2023-07-02">
   <owner>leszeks@chromium.org</owner>
   <owner>v8-runtime@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/variations/histograms.xml b/tools/metrics/histograms/metadata/variations/histograms.xml
index 44aaeec..b7f96cc6 100644
--- a/tools/metrics/histograms/metadata/variations/histograms.xml
+++ b/tools/metrics/histograms/metadata/variations/histograms.xml
@@ -422,7 +422,7 @@
 </histogram>
 
 <histogram name="Variations.SafeModeCachedFlags.Streak.Crashes" units="crashes"
-    expires_after="2023-05-01">
+    expires_after="2023-07-02">
   <owner>hnakashima@chromium.org</owner>
   <owner>src/chrome/browser/flags/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/web_apk/histograms.xml b/tools/metrics/histograms/metadata/web_apk/histograms.xml
index e6ce4a2..cf3a7eb 100644
--- a/tools/metrics/histograms/metadata/web_apk/histograms.xml
+++ b/tools/metrics/histograms/metadata/web_apk/histograms.xml
@@ -88,7 +88,7 @@
 </histogram>
 
 <histogram name="WebApk.Install.InstallDuration" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>hartmanng@chromium.org</owner>
   <owner>
     src/chrome/android/java/src/org/chromium/chrome/browser/webapps/OWNERS
diff --git a/tools/metrics/histograms/metadata/web_audio/histograms.xml b/tools/metrics/histograms/metadata/web_audio/histograms.xml
index 1f5cdf5..07cba68 100644
--- a/tools/metrics/histograms/metadata/web_audio/histograms.xml
+++ b/tools/metrics/histograms/metadata/web_audio/histograms.xml
@@ -79,7 +79,7 @@
 </histogram>
 
 <histogram name="WebAudio.AudioContext.HardwareSampleRate" units="Hz"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>hongchan@chromium.org</owner>
   <owner>mjwilson@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/web_core/histograms.xml b/tools/metrics/histograms/metadata/web_core/histograms.xml
index 26a8044..13db969 100644
--- a/tools/metrics/histograms/metadata/web_core/histograms.xml
+++ b/tools/metrics/histograms/metadata/web_core/histograms.xml
@@ -31,7 +31,7 @@
 </variants>
 
 <histogram name="WebCore.DistillabilityUs" units="microseconds"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>wychen@chromium.org</owner>
   <owner>gilmanmh@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/web_rtc/histograms.xml b/tools/metrics/histograms/metadata/web_rtc/histograms.xml
index 42ae945..fbd6672 100644
--- a/tools/metrics/histograms/metadata/web_rtc/histograms.xml
+++ b/tools/metrics/histograms/metadata/web_rtc/histograms.xml
@@ -250,7 +250,7 @@
 </histogram>
 
 <histogram name="WebRTC.Audio.ApmCaptureInputLevelPeakRms"
-    units="dBFS (negated)" expires_after="2023-04-30">
+    units="dBFS (negated)" expires_after="2023-07-02">
   <owner>hlundin@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
   <summary>
@@ -662,7 +662,7 @@
 </histogram>
 
 <histogram name="WebRTC.Audio.TargetJitterBufferDelayMs" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>hlundin@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
   <summary>
@@ -745,7 +745,7 @@
 </histogram>
 
 <histogram name="WebRTC.BWE.InitialVsConvergedDiff" units="kbps"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>holmer@chromium.org</owner>
   <summary>
     The difference between the bandwidth estimate at 2 seconds and 20 seconds
@@ -866,7 +866,7 @@
 </histogram>
 
 <histogram name="WebRTC.Call.TimeReceivingVideoRtpPacketsInSeconds" units="s"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>saza@chromium.org</owner>
   <summary>
     The amount of time between the arrival of the first and last video RTP
@@ -1053,7 +1053,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.BundlePolicy"
-    enum="PeerConnectionBundlePolicy" expires_after="2023-04-30">
+    enum="PeerConnectionBundlePolicy" expires_after="2023-07-02">
   <owner>hta@chromium.org</owner>
   <owner>webrtc-dev@chromium.org</owner>
   <summary>
@@ -1067,7 +1067,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.BundleUsage"
-    enum="PeerConnectionBundleUsage" expires_after="2023-04-30">
+    enum="PeerConnectionBundleUsage" expires_after="2023-07-02">
   <owner>hta@chromium.org</owner>
   <owner>webrtc-dev@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/webapps/histograms.xml b/tools/metrics/histograms/metadata/webapps/histograms.xml
index ce1515a..3f06226 100644
--- a/tools/metrics/histograms/metadata/webapps/histograms.xml
+++ b/tools/metrics/histograms/metadata/webapps/histograms.xml
@@ -135,7 +135,7 @@
 </histogram>
 
 <histogram name="Launch.WebAppDisplayMode" enum="WebAppDisplayMode"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>peter@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
   <summary>
@@ -145,7 +145,7 @@
 </histogram>
 
 <histogram name="Launch.WebAppLaunchHandlerClientMode"
-    enum="WebAppLaunchHandlerClientMode" expires_after="2023-05-01">
+    enum="WebAppLaunchHandlerClientMode" expires_after="2023-07-02">
   <owner>alancutter@chromium.org</owner>
   <owner>desktop-pwas-team@google.com</owner>
   <summary>
@@ -261,7 +261,7 @@
 </histogram>
 
 <histogram name="Webapp.CheckServiceWorker.Time" units="ms"
-    expires_after="2023-04-30">
+    expires_after="2023-07-02">
   <owner>asamidoi@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
@@ -829,7 +829,7 @@
 </histogram>
 
 <histogram name="WebApp.Launcher.LaunchResult"
-    enum="WebAppLauncherLaunchResult" expires_after="2023-04-16">
+    enum="WebAppLauncherLaunchResult" expires_after="2023-07-02">
   <owner>davidbienvenu@chromium.org</owner>
   <owner>jessemckenna@google.com</owner>
   <summary>
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index 1c30669..2358dfd 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -410,4 +410,6 @@
  <item id="trial_group_lookup" added_in_milestone="110" content_hash_code="047aeeca" os_list="chromeos" file_path="chromeos/ash/components/trial_group/trial_group_checker.cc" />
  <item id="wallpaper_drivefs_delegate" added_in_milestone="110" content_hash_code="01771f33" os_list="chromeos" file_path="chrome/browser/ash/wallpaper/wallpaper_drivefs_delegate_impl.cc" />
  <item id="chromeos_emoji_picker_categories_fetcher" added_in_milestone="111" content_hash_code="081a9095" os_list="chromeos" file_path="chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.cc" />
+ <item id="chromeos_emoji_picker_featured_fetcher" added_in_milestone="111" content_hash_code="020b30c7" os_list="chromeos" file_path="chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.cc" />
+ <item id="chromeos_emoji_picker_search_fetcher" added_in_milestone="111" content_hash_code="035497ee" os_list="chromeos" file_path="chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.cc" />
 </annotations>
diff --git a/tools/traffic_annotation/summary/grouping.xml b/tools/traffic_annotation/summary/grouping.xml
index 3d6edca..5abb6f9 100644
--- a/tools/traffic_annotation/summary/grouping.xml
+++ b/tools/traffic_annotation/summary/grouping.xml
@@ -277,6 +277,8 @@
       <annotation id="trial_group_lookup"/>
       <annotation id="wallpaper_drivefs_delegate"/>
       <annotation id="chromeos_emoji_picker_categories_fetcher"/>
+      <annotation id="chromeos_emoji_picker_featured_fetcher"/>
+      <annotation id="chromeos_emoji_picker_search_fetcher"/>
     </sender>
   </group>
   <group name="Admin Features" hidden="true">
diff --git a/ui/base/ime/ash/ime_candidate_window_handler_interface.h b/ui/base/ime/ash/ime_candidate_window_handler_interface.h
index d55c3ca..d6cc1fc 100644
--- a/ui/base/ime/ash/ime_candidate_window_handler_interface.h
+++ b/ui/base/ime/ash/ime_candidate_window_handler_interface.h
@@ -40,11 +40,13 @@
                                  uint32_t cursor_pos,
                                  bool visible) = 0;
 
-  // Called when the application changes its caret bounds.
-  virtual void SetCursorBounds(const gfx::Rect& cursor_bounds,
-                               const gfx::Rect& composition_head) = 0;
+  // Called when the application changes its caret or composition bounds.
+  virtual void SetCursorAndCompositionBounds(
+      const gfx::Rect& cursor_bounds,
+      const gfx::Rect& composition_bounds) = 0;
 
-  // Gets the cursor bounds that was set by |SetCursorBounds| method.
+  // Gets the cursor bounds that was set by |SetCursorAndCompositionBounds|
+  // method.
   virtual gfx::Rect GetCursorBounds() const = 0;
 
   // Called when the text field's focus state is changed.
diff --git a/ui/base/ime/ash/input_method_ash.cc b/ui/base/ime/ash/input_method_ash.cc
index 0379428..d15e406 100644
--- a/ui/base/ime/ash/input_method_ash.cc
+++ b/ui/base/ime/ash/input_method_ash.cc
@@ -284,16 +284,18 @@
 
   const gfx::Rect caret_rect = client->GetCaretBounds();
 
-  gfx::Rect composition_head;
+  gfx::Rect composition_bounds;
   if (client->HasCompositionText())
-    client->GetCompositionCharacterBounds(0, &composition_head);
+    client->GetCompositionCharacterBounds(0, &composition_bounds);
 
   // Pepper doesn't support composition bounds, so fall back to caret bounds to
   // avoid a bad user experience (the IME window moved to upper left corner).
-  if (composition_head.IsEmpty())
-    composition_head = caret_rect;
+  if (composition_bounds.IsEmpty()) {
+    composition_bounds = caret_rect;
+  }
   if (candidate_window)
-    candidate_window->SetCursorBounds(caret_rect, composition_head);
+    candidate_window->SetCursorAndCompositionBounds(caret_rect,
+                                                    composition_bounds);
 
   if (assistive_window) {
     Bounds bounds;
@@ -384,8 +386,7 @@
   ConfirmComposition(/* reset_engine */ true);
 
   // Remove any autocorrect range in the unfocused TextInputClient.
-  gfx::Range text_range;
-  if (focused_before && focused_before->GetTextRange(&text_range)) {
+  if (focused_before) {
     focused_before->SetAutocorrectRange(gfx::Range());
   }
 
diff --git a/ui/base/ime/ash/input_method_ash_unittest.cc b/ui/base/ime/ash/input_method_ash_unittest.cc
index c930d8f..ea64f89 100644
--- a/ui/base/ime/ash/input_method_ash_unittest.cc
+++ b/ui/base/ime/ash/input_method_ash_unittest.cc
@@ -461,8 +461,8 @@
   input_method_ash_->OnTextInputTypeChanged(this);
   // Since a form has focus, IBusClient::Focus() should be called.
   EXPECT_EQ(1, mock_ime_engine_handler_->focus_in_call_count());
-  EXPECT_EQ(1,
-            mock_ime_candidate_window_handler_->set_cursor_bounds_call_count());
+  EXPECT_EQ(1, mock_ime_candidate_window_handler_
+                   ->set_cursor_and_composition_bounds_call_count());
   // ui::TextInputClient::OnInputMethodChanged() should be called when
   // `InputMethodAsh` connects/disconnects to/from ibus-daemon and the
   // current text input type is not NONE.
@@ -561,22 +561,22 @@
 TEST_F(InputMethodAshTest, OnCaretBoundsChanged) {
   input_type_ = ui::TEXT_INPUT_TYPE_TEXT;
   input_method_ash_->OnTextInputTypeChanged(this);
-  EXPECT_EQ(1,
-            mock_ime_candidate_window_handler_->set_cursor_bounds_call_count());
+  EXPECT_EQ(1, mock_ime_candidate_window_handler_
+                   ->set_cursor_and_composition_bounds_call_count());
   caret_bounds_ = gfx::Rect(1, 2, 3, 4);
   input_method_ash_->OnCaretBoundsChanged(this);
-  EXPECT_EQ(2,
-            mock_ime_candidate_window_handler_->set_cursor_bounds_call_count());
+  EXPECT_EQ(2, mock_ime_candidate_window_handler_
+                   ->set_cursor_and_composition_bounds_call_count());
   caret_bounds_ = gfx::Rect(0, 2, 3, 4);
   input_method_ash_->OnCaretBoundsChanged(this);
-  EXPECT_EQ(3,
-            mock_ime_candidate_window_handler_->set_cursor_bounds_call_count());
+  EXPECT_EQ(3, mock_ime_candidate_window_handler_
+                   ->set_cursor_and_composition_bounds_call_count());
   caret_bounds_ = gfx::Rect(0, 2, 3, 4);  // unchanged
   input_method_ash_->OnCaretBoundsChanged(this);
   // Current InputMethodAsh implementation performs the IPC
   // regardless of the bounds are changed or not.
-  EXPECT_EQ(4,
-            mock_ime_candidate_window_handler_->set_cursor_bounds_call_count());
+  EXPECT_EQ(4, mock_ime_candidate_window_handler_
+                   ->set_cursor_and_composition_bounds_call_count());
 }
 
 TEST_F(InputMethodAshTest, ExtractCompositionTextTest_NoAttribute) {
diff --git a/ui/base/ime/ash/mock_ime_candidate_window_handler.cc b/ui/base/ime/ash/mock_ime_candidate_window_handler.cc
index fdd1d3ab..4c8f7684 100644
--- a/ui/base/ime/ash/mock_ime_candidate_window_handler.cc
+++ b/ui/base/ime/ash/mock_ime_candidate_window_handler.cc
@@ -7,9 +7,8 @@
 namespace ash {
 
 MockIMECandidateWindowHandler::MockIMECandidateWindowHandler()
-    : set_cursor_bounds_call_count_(0),
-      update_lookup_table_call_count_(0) {
-}
+    : set_cursor_and_composition_bounds_call_count_(0),
+      update_lookup_table_call_count_(0) {}
 
 MockIMECandidateWindowHandler::~MockIMECandidateWindowHandler() = default;
 
@@ -30,10 +29,10 @@
     uint32_t cursor_pos,
     bool visible) {}
 
-void MockIMECandidateWindowHandler::SetCursorBounds(
+void MockIMECandidateWindowHandler::SetCursorAndCompositionBounds(
     const gfx::Rect& cursor_bounds,
-    const gfx::Rect& composition_head) {
-  ++set_cursor_bounds_call_count_;
+    const gfx::Rect& composition_bounds) {
+  ++set_cursor_and_composition_bounds_call_count_;
 }
 
 gfx::Rect MockIMECandidateWindowHandler::GetCursorBounds() const {
@@ -41,7 +40,7 @@
 }
 
 void MockIMECandidateWindowHandler::Reset() {
-  set_cursor_bounds_call_count_ = 0;
+  set_cursor_and_composition_bounds_call_count_ = 0;
   update_lookup_table_call_count_ = 0;
 }
 
diff --git a/ui/base/ime/ash/mock_ime_candidate_window_handler.h b/ui/base/ime/ash/mock_ime_candidate_window_handler.h
index 8dfa1cc..2e104b6 100644
--- a/ui/base/ime/ash/mock_ime_candidate_window_handler.h
+++ b/ui/base/ime/ash/mock_ime_candidate_window_handler.h
@@ -36,12 +36,13 @@
   void UpdatePreeditText(const std::u16string& text,
                          uint32_t cursor_pos,
                          bool visible) override;
-  void SetCursorBounds(const gfx::Rect& cursor_bounds,
-                       const gfx::Rect& composition_head) override;
+  void SetCursorAndCompositionBounds(
+      const gfx::Rect& cursor_bounds,
+      const gfx::Rect& composition_bounds) override;
   gfx::Rect GetCursorBounds() const override;
 
-  int set_cursor_bounds_call_count() const {
-    return set_cursor_bounds_call_count_;
+  int set_cursor_and_composition_bounds_call_count() const {
+    return set_cursor_and_composition_bounds_call_count_;
   }
 
   int update_lookup_table_call_count() const {
@@ -55,7 +56,7 @@
   void Reset();
 
  private:
-  int set_cursor_bounds_call_count_;
+  int set_cursor_and_composition_bounds_call_count_;
   int update_lookup_table_call_count_;
   UpdateLookupTableArg last_update_lookup_table_arg_;
 };
diff --git a/ui/chromeos/styles/cros_sys_colors.json5 b/ui/chromeos/styles/cros_sys_colors.json5
index c99aed4..2f83899 100644
--- a/ui/chromeos/styles/cros_sys_colors.json5
+++ b/ui/chromeos/styles/cros_sys_colors.json5
@@ -321,6 +321,13 @@
     'focus-ring': {
       light: '$cros.ref.primary40',
       dark: '$cros.ref.primary80',
-    }
+    },
+    'shadow': {
+      light: '$cros.ref.neutral30',
+      dark: '$cros.ref.neutral0',
+    },
+    /* When the button is pressed, we layer the ripple color on top of the hover color to form the pressed color, that's what blend() does here. */
+    'pressed-on-prominent': 'blend($cros.sys.hover-on-prominent, $cros.sys.ripple-neutral-on-prominent)',
+    'pressed-on-subtle': 'blend($cros.sys.hover-on-subtle, $cros.sys.ripple-neutral-on-subtle)',
   },
 }
diff --git a/ui/file_manager/file_manager/foreground/css/file_manager_gm3.css b/ui/file_manager/file_manager/foreground/css/file_manager_gm3.css
index b5a1fe5f..5d94109 100644
--- a/ui/file_manager/file_manager/foreground/css/file_manager_gm3.css
+++ b/ui/file_manager/file_manager/foreground/css/file_manager_gm3.css
@@ -1067,6 +1067,9 @@
   display: flex;
   flex-direction: row;
   overflow: hidden;
+  padding-bottom: 4px;
+  padding-inline: 8px 48px;
+  padding-top: 4px;
 }
 
 body.check-select .breadcrumbs {
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager.js b/ui/file_manager/file_manager/foreground/js/file_manager.js
index fd6cd58..76f3719 100644
--- a/ui/file_manager/file_manager/foreground/js/file_manager.js
+++ b/ui/file_manager/file_manager/foreground/js/file_manager.js
@@ -875,6 +875,13 @@
     this.document_.documentElement.classList.add('files-ng');
     this.dialogDom_.classList.add('files-ng');
 
+    // Add theme attribute so widgets can render different styles based on
+    // this attribute:
+    // [theme="legacy"] -> Legacy style, [theme="refresh23"] -> Refresh23 style
+    const theme = util.isJellyEnabled() ? 'refresh23' : 'legacy';
+    this.document_.documentElement.setAttribute('theme', theme);
+    this.dialogDom_.setAttribute('theme', theme);
+
     chrome.fileManagerPrivate.isTabletModeEnabled(
         this.onTabletModeChanged_.bind(this));
     chrome.fileManagerPrivate.onTabletModeChanged.addListener(
diff --git a/ui/file_manager/file_manager/widgets/xf_breadcrumb.ts b/ui/file_manager/file_manager/widgets/xf_breadcrumb.ts
index 9996f0a..c7e19a3 100644
--- a/ui/file_manager/file_manager/widgets/xf_breadcrumb.ts
+++ b/ui/file_manager/file_manager/widgets/xf_breadcrumb.ts
@@ -6,7 +6,7 @@
 import 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js';
 import 'chrome://resources/polymer/v3_0/paper-ripple/paper-ripple.js';
 
-import {mouseEnterMaybeShowTooltip} from '../common/js/dom_utils.js';
+import {addCSSPrefixSelector, mouseEnterMaybeShowTooltip} from '../common/js/dom_utils.js';
 import {str} from '../common/js/util.js';
 
 import {customElement, property, query, state, css, html, XfBase, PropertyValues} from './xf_base.js';
@@ -80,7 +80,7 @@
         @mouseenter=${this.onButtonMouseEntered_}
         @keydown=${
         (event: KeyboardEvent) => this.onButtonKeydown_(index, event)}
-      >${window.unescape(label || '')}</button>
+      >${window.unescape(label || '')}<paper-ripple></paper-ripple></button>
       ${caret}
     `;
   }
@@ -95,7 +95,7 @@
         aria-label=${str('LOCATION_BREADCRUMB_ELIDER_BUTTON_LABEL')}
         @click=${this.onEliderButtonClicked_}
         @keydown=${this.onEliderButtonKeydown_}
-      ><span elider></span></button>
+      ><span elider></span><paper-ripple></paper-ripple></button>
       <span caret></span>
       <cr-action-menu id="elider-menu">
         ${
@@ -226,8 +226,17 @@
     }
 
     // Show drop-down below the elider button.
-    const top =
-        this.$eliderButton_!.offsetTop + this.$eliderButton_!.offsetHeight + 8;
+    let offsetElement: Element|null = this.$eliderButton_!;
+    let top = this.$eliderButton_!.offsetHeight;
+    // We need to go upwards to add all offsetTop all offset parents because
+    // each level can have its own offsetTop.
+    while (offsetElement instanceof HTMLElement) {
+      top += offsetElement.offsetTop;
+      offsetElement = offsetElement.offsetParent;
+    }
+    // The gap between the elider button bottom and the dropdown menu top.
+    const gap = 8;
+    top += gap;
     this.$actionMenu_!.showAt(this.$eliderButton_!, {top: top});
 
     // Style drop-down and horizontal position.
@@ -256,7 +265,7 @@
 }
 
 function getCSS() {
-  return css`
+  const commonCSS = css`
     :host([hidden]),
     [hidden] {
       display: none !important;
@@ -281,11 +290,9 @@
       -webkit-mask-image: url(/foreground/images/files/ui/arrow_right.svg);
       -webkit-mask-position: center;
       -webkit-mask-repeat: no-repeat;
-      background-color: var(--cros-icon-color-secondary);
       display: inline-flex;
       height: 20px;
       min-width: 20px;
-      padding: 8px 0;
       width: 20px;
     }
 
@@ -296,15 +303,13 @@
     button {
       /* don't use browser's background-color. */
       background-color: unset;
-      border: 2px solid transparent;
-      border-radius: 4px;
-      color: var(--cros-text-color-primary);
+      border: none;
       cursor: pointer;
       display: inline-block;
+      position: relative;
 
       /* don't use browser's button font. */
       font: inherit;
-      height: 32px;
       margin: 0;
 
       /* elide wide text */
@@ -313,7 +318,6 @@
       min-width: calc(12px + 1em);
       outline: none;
       overflow: hidden;
-      padding: 0 8px;
 
       /* text rendering debounce: center. */
       text-align: center;
@@ -321,18 +325,17 @@
     }
 
     button[disabled] {
-      color: var(--cros-text-color-primary);
       cursor: default;
       font-weight: 500;
       margin-inline-end: 4px;
+      pointer-events: none;
     }
 
     span[elider] {
-      --tap-target-shift: -7px;
+      --tap-target-shift: -6px;
       -webkit-mask-image: url(/foreground/images/files/ui/menu_ng.svg);
       -webkit-mask-position: center;
       -webkit-mask-repeat: no-repeat;
-      background-color: var(--cros-icon-color-primary);
       height: 48px;
       margin-inline-start: var(--tap-target-shift);
       margin-top: var(--tap-target-shift);
@@ -344,7 +347,6 @@
 
     button[elider] {
       border-radius: 50%;
-      box-sizing: border-box;
       display: inline-flex;
       height: 36px;
       min-width: 36px;
@@ -352,58 +354,94 @@
       width: 36px;
     }
 
-    button.dropdown-item {
-      position: relative;
-    }
-
-    :host-context(:root.pointer-active) button.dropdown-item:active {
-      background-color: var(--cros-menu-item-background-hover);
-    }
-
-    button.dropdown-item > paper-ripple {
-      --paper-ripple-opacity: 100%;
-      color: var(--cros-menu-item-background-hover);
-    }
-
-    button:not([disabled]):not(:active):hover {
-      background-color: var(--cros-ripple-color);
-    }
-
-    :host-context(:root.pointer-active) button:not(:active):hover {
-      background-color: unset;
-      cursor: default;
-    }
-
-    :host-context(:root.focus-outline-visible) > button:focus {
-      background-color: unset;
-      border: 2px solid var(--cros-icon-color-prominent);
-    }
-
-    :host-context(.breadcrumb-elider-expanded) button[elider] {
-      background: var(--cros-icon-button-pressed-color);
-    }
-
-    button:active {
-      background: var(--cros-icon-button-pressed-color);
-    }
-
     #elider-menu button {
-      border: unset;
-      color: var(--cros-menu-label-color);
       display: block;
       font-family: 'Roboto';
       font-size: 13px;
       max-width: min(288px, 40vw);
       min-width: 192px;  /* menu width */
       padding: 0 16px;
+      position: relative;
       text-align: start;
     }
 
-    :host-context(:root.focus-outline-visible) #elider-menu button:hover {
+    /** Reset the hover color when using keyboard to navigate the menu items. */
+    :host-context(.focus-outline-visible) #elider-menu button:hover {
       background-color: unset;
     }
+  `;
 
-    :host-context(:root.focus-outline-visible) #elider-menu button:focus {
+  const legacyStyle = css`
+    /* No paper ripple for path button in Legacy. */
+    button paper-ripple {
+      display: none;
+    }
+
+    #elider-menu button paper-ripple {
+      display: block;
+    }
+
+    span[caret] {
+      background-color: var(--cros-icon-color-secondary);
+      padding: 8px 0;
+    }
+
+    span[elider] {
+      background-color: var(--cros-icon-color-primary);
+    }
+
+    button {
+      color: var(--cros-text-color-primary);
+    }
+
+    button[elider] {
+      margin: 2px 0;
+    }
+
+    :host > button:not([elider]) {
+      border-radius: 4px;
+      height: 32px;
+      margin: 0 2px;
+      padding: 0 8px;
+    }
+
+    button:not(:active):hover {
+      background-color: var(--cros-ripple-color);
+    }
+
+    :host-context(.pointer-active) button:not(:active):hover {
+      background-color: unset;
+      cursor: default;
+    }
+
+    button.dropdown-item > paper-ripple {
+      --paper-ripple-opacity: 100%;
+      color: var(--cros-ripple-color);
+    }
+
+    :host > button:focus-visible {
+      outline: 2px solid var(--cros-icon-color-prominent);
+    }
+
+    :host > button:active {
+      background-color: var(--cros-icon-button-pressed-color);
+    }
+
+    :host-context(.pointer-active) button.dropdown-item:active {
+      background-color: var(--cros-menu-item-background-hover);
+    }
+
+    button[elider][aria-expanded="true"] {
+      background-color: var(--cros-icon-button-pressed-color);
+    }
+
+    #elider-menu button {
+      height: 32px;
+      margin: 0;
+      color: var(--cros-menu-label-color);
+    }
+
+    :host-context(.focus-outline-visible) #elider-menu button:focus {
       background-color: var(--cros-menu-item-background-hover);
     }
 
@@ -413,6 +451,81 @@
       --cr-menu-shadow: var(--cros-elevation-2-shadow);
     }
   `;
+
+  const refresh23Style = css`
+    span[caret] {
+      background-color: var(--cros-sys-secondary);
+    }
+
+    span[elider] {
+      background-color: var(--cros-sys-secondary);
+    }
+
+    button {
+      color: var(--cros-sys-secondary);
+    }
+
+    :host > button:not([elider]) {
+      border-radius: 18px;
+      height: 36px;
+      margin: 6px 2px;
+      padding: 0 12px;
+    }
+
+    button[disabled] {
+      color: var(--cros-sys-on_surface);
+    }
+
+    button:not(:active):hover {
+      background-color: var(--cros-sys-hover_on_subtle);
+    }
+
+    :host-context(.pointer-active) button:not(:active):hover {
+      background-color: unset;
+      cursor: default;
+    }
+
+    paper-ripple {
+      --paper-ripple-opacity: 100%;
+      color: var(--cros-sys-ripple_neutral_on_subtle);
+    }
+
+    :host > button:focus-visible {
+      outline: 2px solid var(--cros-sys-focus_ring);
+    }
+
+    button:active {
+      background-color: var(--cros-sys-hover_on_subtle);
+    }
+
+    button[elider][aria-expanded="true"] {
+      background-color: var(--cros-sys-pressed_on_subtle);
+    }
+
+    #elider-menu button {
+      height: 36px;
+      color: var(--cros-sys-on_surface);
+    }
+
+    :host-context(.focus-outline-visible) #elider-menu button:focus {
+      outline: 2px solid var(--cros-sys-focus_ring);
+      outline-offset: -2px;
+    }
+
+    cr-action-menu {
+      --cr-menu-background-color: var(--cros-sys-app_base_elevated);
+      --cr-menu-background-sheen: none;
+      /* TODO(wenbojie): use elevation variable when it's ready.
+      --cros-sys-elevation3 */
+      --cr-menu-shadow: var(--cros-elevation-2-shadow);
+    }
+  `;
+
+  return [
+    commonCSS,
+    addCSSPrefixSelector(legacyStyle, '[theme="legacy"]'),
+    addCSSPrefixSelector(refresh23Style, '[theme="refresh23"]'),
+  ];
 }
 
 /**
diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn
index c5193c28..966bb37 100644
--- a/ui/gl/BUILD.gn
+++ b/ui/gl/BUILD.gn
@@ -216,13 +216,6 @@
       "shared_gl_fence_egl.h",
     ]
 
-    if (!is_android) {
-      sources += [
-        "gl_image_egl.cc",
-        "gl_image_egl.h",
-      ]
-    }
-
     if (enable_vulkan) {
       sources += [
         "gl_angle_util_vulkan.cc",
diff --git a/ui/gl/gl_image_egl.cc b/ui/gl/gl_image_egl.cc
deleted file mode 100644
index dbbdd1af..0000000
--- a/ui/gl/gl_image_egl.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/gl/gl_image_egl.h"
-
-#include "ui/gl/egl_util.h"
-#include "ui/gl/gl_bindings.h"
-#include "ui/gl/gl_enums.h"
-#include "ui/gl/gl_surface_egl.h"
-
-namespace gl {
-
-GLImageEGL::GLImageEGL(const gfx::Size& size)
-    : egl_image_(EGL_NO_IMAGE_KHR), size_(size) {}
-
-GLImageEGL::~GLImageEGL() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  if (egl_image_ == EGL_NO_IMAGE_KHR)
-    return;
-
-  const EGLBoolean result = eglDestroyImageKHR(
-      GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay(), egl_image_);
-  if (result == EGL_FALSE)
-    DLOG(ERROR) << "Error destroying EGLImage: " << ui::GetLastEGLErrorString();
-}
-
-bool GLImageEGL::Initialize(EGLContext context,
-                            EGLenum target,
-                            EGLClientBuffer buffer,
-                            const EGLint* attrs) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK_EQ(EGL_NO_IMAGE_KHR, egl_image_);
-  egl_image_ = eglCreateImageKHR(GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay(),
-                                 context, target, buffer, attrs);
-  const bool success = egl_image_ != EGL_NO_IMAGE_KHR;
-  if (!success)
-    LOG(ERROR) << "Error creating EGLImage: " << ui::GetLastEGLErrorString();
-  return success;
-}
-
-gfx::Size GLImageEGL::GetSize() {
-  return size_;
-}
-
-void* GLImageEGL::GetEGLImage() const {
-  return egl_image_;
-}
-
-bool GLImageEGL::BindTexImage(unsigned target) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  glEGLImageTargetTexture2DOES(target, egl_image_);
-  return true;
-}
-
-}  // namespace gl
diff --git a/ui/gl/gl_image_egl.h b/ui/gl/gl_image_egl.h
deleted file mode 100644
index 2c8f9bf..0000000
--- a/ui/gl/gl_image_egl.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_GL_GL_IMAGE_EGL_H_
-#define UI_GL_GL_IMAGE_EGL_H_
-
-#include <EGL/eglplatform.h>
-
-#include "base/memory/raw_ptr.h"
-#include "base/threading/thread_checker.h"
-#include "ui/gl/gl_export.h"
-#include "ui/gl/gl_image.h"
-
-namespace gl {
-
-// Abstract base class for EGL-based images.
-class GL_EXPORT GLImageEGL : public GLImage {
- public:
-  GLImageEGL(const GLImageEGL&) = delete;
-  GLImageEGL& operator=(const GLImageEGL&) = delete;
-
-  // Overridden from GLImage:
-  gfx::Size GetSize() override;
-  void* GetEGLImage() const override;
-  bool BindTexImage(unsigned target) override;
-  void ReleaseTexImage(unsigned target) override {}
-
- protected:
-  explicit GLImageEGL(const gfx::Size& size);
-  ~GLImageEGL() override;
-
-  // Same semantic as specified for eglCreateImageKHR. There two main usages:
-  // 1- When using the |target| EGL_GL_TEXTURE_2D_KHR it is required to pass
-  // a valid |context|. This allows to create an EGLImage from a GL texture.
-  // Then this EGLImage can be converted to an external resource to be shared
-  // with other client APIs.
-  // 2- When using the |target| EGL_NATIVE_PIXMAP_KHR or EGL_LINUX_DMA_BUF_EXT
-  // it is required to pass EGL_NO_CONTEXT. This allows to create an EGLImage
-  // from an external resource. Then this EGLImage can be converted to a GL
-  // texture.
-  bool Initialize(void* context /* EGLContext */,
-                  unsigned target /* EGLenum */,
-                  void* buffer /* EGLClientBuffer */,
-                  const EGLint* attrs);
-
-  raw_ptr<void, DanglingUntriaged> egl_image_ /* EGLImageKHR */;
-  const gfx::Size size_;
-  base::ThreadChecker thread_checker_;
-};
-
-}  // namespace gl
-
-#endif  // UI_GL_GL_IMAGE_EGL_H_
diff --git a/ui/gl/gl_image_native_pixmap.cc b/ui/gl/gl_image_native_pixmap.cc
index 6090da2e..fe44592 100644
--- a/ui/gl/gl_image_native_pixmap.cc
+++ b/ui/gl/gl_image_native_pixmap.cc
@@ -141,7 +141,7 @@
     scoped_refptr<gfx::NativePixmap> pixmap) {
   auto image =
       base::WrapRefCounted(new GLImageNativePixmap(size, format, plane));
-  if (!image->Initialize(std::move(pixmap))) {
+  if (!image->InitializeFromNativePixmap(std::move(pixmap))) {
     return nullptr;
   }
   return image;
@@ -162,15 +162,28 @@
 GLImageNativePixmap::GLImageNativePixmap(const gfx::Size& size,
                                          gfx::BufferFormat format,
                                          gfx::BufferPlane plane)
-    : GLImageEGL(size),
+    : egl_image_(EGL_NO_IMAGE_KHR),
+      size_(size),
       format_(format),
       plane_(plane),
       has_image_dma_buf_export_(gl::GLSurfaceEGL::GetGLDisplayEGL()
                                     ->ext->b_EGL_MESA_image_dma_buf_export) {}
 
-GLImageNativePixmap::~GLImageNativePixmap() {}
+GLImageNativePixmap::~GLImageNativePixmap() {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  if (egl_image_ == EGL_NO_IMAGE_KHR) {
+    return;
+  }
 
-bool GLImageNativePixmap::Initialize(scoped_refptr<gfx::NativePixmap> pixmap) {
+  const EGLBoolean result = eglDestroyImageKHR(
+      GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay(), egl_image_);
+  if (result == EGL_FALSE) {
+    DLOG(ERROR) << "Error destroying EGLImage: " << ui::GetLastEGLErrorString();
+  }
+}
+
+bool GLImageNativePixmap::InitializeFromNativePixmap(
+    scoped_refptr<gfx::NativePixmap> pixmap) {
   DCHECK(!pixmap_);
   if (GLInternalFormat(format_) == GL_NONE) {
     LOG(ERROR) << "Unsupported format: " << gfx::BufferFormatToString(format_);
@@ -271,9 +284,8 @@
     attrs.push_back(EGL_NONE);
   }
 
-  if (!GLImageEGL::Initialize(EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT,
-                              static_cast<EGLClientBuffer>(nullptr),
-                              &attrs[0])) {
+  if (!Initialize(EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT,
+                  static_cast<EGLClientBuffer>(nullptr), &attrs[0])) {
     return false;
   }
 
@@ -297,21 +309,35 @@
       reinterpret_cast<EGLContext>(current_context->GetHandle());
   DCHECK_NE(context_handle, EGL_NO_CONTEXT);
 
-  if (!GLImageEGL::Initialize(context_handle, EGL_GL_TEXTURE_2D_KHR,
-                              reinterpret_cast<EGLClientBuffer>(texture_id),
-                              nullptr)) {
+  if (!Initialize(context_handle, EGL_GL_TEXTURE_2D_KHR,
+                  reinterpret_cast<EGLClientBuffer>(texture_id), nullptr)) {
     return false;
   }
   return true;
 }
 
+bool GLImageNativePixmap::Initialize(EGLContext context,
+                                     EGLenum target,
+                                     EGLClientBuffer buffer,
+                                     const EGLint* attrs) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK_EQ(EGL_NO_IMAGE_KHR, egl_image_);
+  egl_image_ = eglCreateImageKHR(GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay(),
+                                 context, target, buffer, attrs);
+  const bool success = egl_image_ != EGL_NO_IMAGE_KHR;
+  if (!success) {
+    LOG(ERROR) << "Error creating EGLImage: " << ui::GetLastEGLErrorString();
+  }
+  return success;
+}
+
 gfx::NativePixmapHandle GLImageNativePixmap::ExportHandle() {
   DCHECK(!pixmap_);
-  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
-  // Must use GLImageEGL::Initialize.
+  // Must use Initialize.
   if (egl_image_ == EGL_NO_IMAGE_KHR) {
-    LOG(ERROR) << "GLImageEGL is not initialized";
+    LOG(ERROR) << "GLImageNativePixmap is not initialized";
     return gfx::NativePixmapHandle();
   }
 
@@ -388,6 +414,21 @@
 #endif  // BUILDFLAG(IS_FUCHSIA)
 }
 
+gfx::Size GLImageNativePixmap::GetSize() {
+  return size_;
+}
+
+void* GLImageNativePixmap::GetEGLImage() const {
+  return egl_image_;
+}
+
+bool GLImageNativePixmap::BindTexImage(unsigned target) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+  glEGLImageTargetTexture2DOES(target, egl_image_);
+  return true;
+}
+
 unsigned GLImageNativePixmap::GetInternalFormat() {
   return GLInternalFormat(format_);
 }
diff --git a/ui/gl/gl_image_native_pixmap.h b/ui/gl/gl_image_native_pixmap.h
index da9bbc1..3032b57 100644
--- a/ui/gl/gl_image_native_pixmap.h
+++ b/ui/gl/gl_image_native_pixmap.h
@@ -7,16 +7,20 @@
 
 #include <stdint.h>
 
+#include <EGL/eglplatform.h>
+
 #include <string>
 
+#include "base/memory/raw_ptr.h"
+#include "base/threading/thread_checker.h"
 #include "ui/gfx/color_space.h"
 #include "ui/gfx/native_pixmap.h"
 #include "ui/gl/gl_export.h"
-#include "ui/gl/gl_image_egl.h"
+#include "ui/gl/gl_image.h"
 
 namespace gl {
 
-class GL_EXPORT GLImageNativePixmap : public gl::GLImageEGL {
+class GL_EXPORT GLImageNativePixmap : public GLImage {
  public:
   // Create an EGLImage from a given NativePixmap.
   static scoped_refptr<GLImageNativePixmap> Create(
@@ -49,6 +53,10 @@
   }
 
   // Overridden from GLImage:
+  gfx::Size GetSize() override;
+  void* GetEGLImage() const override;
+  bool BindTexImage(unsigned target) override;
+  void ReleaseTexImage(unsigned target) override {}
   unsigned GetInternalFormat() override;
   unsigned GetDataType() override;
   void OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd,
@@ -64,10 +72,27 @@
                       gfx::BufferFormat format,
                       gfx::BufferPlane plane);
   // Create an EGLImage from a given NativePixmap.
-  bool Initialize(scoped_refptr<gfx::NativePixmap> pixmap);
+  bool InitializeFromNativePixmap(scoped_refptr<gfx::NativePixmap> pixmap);
   // Create an EGLImage from a given GL texture.
   bool InitializeFromTexture(uint32_t texture_id);
 
+  // Same semantic as specified for eglCreateImageKHR. There two main usages:
+  // 1- When using the |target| EGL_GL_TEXTURE_2D_KHR it is required to pass
+  // a valid |context|. This allows to create an EGLImage from a GL texture.
+  // Then this EGLImage can be converted to an external resource to be shared
+  // with other client APIs.
+  // 2- When using the |target| EGL_NATIVE_PIXMAP_KHR or EGL_LINUX_DMA_BUF_EXT
+  // it is required to pass EGL_NO_CONTEXT. This allows to create an EGLImage
+  // from an external resource. Then this EGLImage can be converted to a GL
+  // texture.
+  bool Initialize(void* context /* EGLContext */,
+                  unsigned target /* EGLenum */,
+                  void* buffer /* EGLClientBuffer */,
+                  const EGLint* attrs);
+
+  raw_ptr<void, DanglingUntriaged> egl_image_ /* EGLImageKHR */;
+  const gfx::Size size_;
+  THREAD_CHECKER(thread_checker_);
   gfx::BufferFormat format_;
   scoped_refptr<gfx::NativePixmap> pixmap_;
   gfx::BufferPlane plane_;