diff --git a/.gn b/.gn
index a4d1a63..a9b0a5a 100644
--- a/.gn
+++ b/.gn
@@ -68,10 +68,6 @@
 # their includes checked for proper dependencies when you run either
 # "gn check" or "gn gen --check".
 no_check_targets = [
-  # crbug.com/1158989
-  "//headless:headless_renderer",  # 12 errors
-  "//headless:headless_shared_sources",  # 2 errors
-
   # //v8, https://crbug.com/v8/7330
   "//v8/src/inspector:inspector",  # 20 errors
   "//v8/test/cctest:cctest_sources",  # 15 errors
diff --git a/DEPS b/DEPS
index fbafc96..22bca62c 100644
--- a/DEPS
+++ b/DEPS
@@ -304,7 +304,7 @@
   # 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': 'cc3e0cd0a74397f825c87f1381f2bde59dfb1c7e',
+  'skia_revision': '486deb23bc2a4d3d09c66fef52c2ad64d8b4f761',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -312,7 +312,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '377667505182635fe54b234c453f300edac2d7d3',
+  'angle_revision': '03b2c124e5e92c5121acc7fa8d497688c697c012',
   # 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.20221229.1.1',
+  'fuchsia_version': 'version:11.20221230.1.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.
@@ -375,7 +375,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': 'a084da9765308edcf256fe5636ccc25c01c0955d',
+  'catapult_revision': 'a404e6d108a230c0c4080a71705c6e6d7c30557a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # 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': '83de932e6bde0cb9626c0147d540eb080d9ed29d',
+  'devtools_frontend_revision': 'c456c477697bf61a576cffcfcac1b48e0b6ea26b',
   # 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': 'f15c0f670d9e33155c4a7d3622de54e21e7876ba',
+  'dawn_revision': 'ce3400170d0eaa266144a6ec5153f07892ccdb54',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -443,7 +443,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling nearby
   # and whatever else without interference from each other.
-  'nearby_revision': 'f772614a464fea9351f61437e71a310b2fa651cb',
+  'nearby_revision': '1f2095a9be808cf41af83424c10de0afe4b85446',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling securemessage
   # and whatever else without interference from each other.
@@ -455,7 +455,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.
-  'cros_components_revision': '07c95f09058c2bf7d7a42bb6be610ac97bb4c436',
+  'cros_components_revision': '6412f1e0d9a39077758ee2c941f568fa3738faba',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -776,7 +776,7 @@
 
   'src/clank': {
     'url': 'https://chrome-internal.googlesource.com/clank/internal/apps.git' + '@' +
-    '5898ed9528e94ff60d1faa9b87888a1022db6300',
+    '364793b131bf9b312ace270259a9e8e6e92c79ff',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -965,7 +965,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'kt70H5UX--Uu4HSPE8cKq2FI4nRWeRVEY-eN3oglLWwC',
+          'version': 'mlioxSGP0NZyX50Ou3-VsC385Jda4AiTXy3u6wz7kMAC',
       },
     ],
     'condition': 'checkout_android',
@@ -1216,7 +1216,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' + '@' + '55406340601856461047e6fa41bd2a966037b173',
+      'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '9afc27b5f3c2512a85f4b5694a4c640d264d141a',
     'condition': 'checkout_src_internal',
   },
 
@@ -1830,7 +1830,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '030f44dcf868629f3b5776bd69207d342873ed3d',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'e0035892483b673825661f86dafae168df4518c3',
+    Var('webrtc_git') + '/src.git' + '@' + '66b52fd6c1124c700426f9868fb56769268ed9c1',
 
   # 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.
@@ -1952,7 +1952,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/projector_app/app',
-        'version': 'ZuhMnyuCywebHdvmczaJO7sjZa3yDcMqx7Rjgs34Yt0C',
+        'version': '1dtDlxRC8NlsYguwcEllMw31Mz6REYjQq_297ndztQsC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/android_webview/system_webview_bundle.gni b/android_webview/system_webview_bundle.gni
index cba991b..dfaac8f 100644
--- a/android_webview/system_webview_bundle.gni
+++ b/android_webview/system_webview_bundle.gni
@@ -59,7 +59,7 @@
       }
       aapt_locale_allowlist = platform_pak_locales
       proguard_enabled = !is_java_debug
-      module_name = "weblayer"
+      package_name = "weblayer"
       package_id = 126
       version_name =
           "@FileArg($_rebased_base_module_build_config:deps_info:version_name)"
diff --git a/android_webview/tools/system_webview_shell/layout_tests/src/org/chromium/webview_shell/test/WebViewLayoutTest.java b/android_webview/tools/system_webview_shell/layout_tests/src/org/chromium/webview_shell/test/WebViewLayoutTest.java
index 8cb54a3..5178782 100644
--- a/android_webview/tools/system_webview_shell/layout_tests/src/org/chromium/webview_shell/test/WebViewLayoutTest.java
+++ b/android_webview/tools/system_webview_shell/layout_tests/src/org/chromium/webview_shell/test/WebViewLayoutTest.java
@@ -353,6 +353,7 @@
     @Test
     @MediumTest
     @CommandLineFlags.Add("use-fake-device-for-media-stream")
+    @DisabledTest(message = "https://crbug.com/1368439")
     public void testMediaStreamApiDenyPermission() throws Exception {
         runWebViewLayoutTest("blink-apis/webrtc/mediastream-permission-denied-callbacks.html",
                 "blink-apis/webrtc/mediastream-permission-denied-callbacks-expected.txt");
@@ -361,6 +362,7 @@
     @Test
     @MediumTest
     @CommandLineFlags.Add("use-fake-device-for-media-stream")
+    @DisabledTest(message = "https://crbug.com/1368439")
     public void testMediaStreamApi() throws Exception {
         mTestActivity.setGrantPermission(true);
         runWebViewLayoutTest("blink-apis/webrtc/mediastream-callbacks.html",
diff --git a/ash/components/arc/net/arc_net_host_impl.cc b/ash/components/arc/net/arc_net_host_impl.cc
index 8bdf31a..f42953d 100644
--- a/ash/components/arc/net/arc_net_host_impl.cc
+++ b/ash/components/arc/net/arc_net_host_impl.cc
@@ -718,13 +718,6 @@
 
 void ArcNetHostImpl::CreateNetwork(mojom::WifiConfigurationPtr cfg,
                                    CreateNetworkCallback callback) {
-  // TODO(b/195653632): Populate the shill EAP properties from the mojo
-  // WifiConfiguration object.
-  std::unique_ptr<base::DictionaryValue> properties(new base::DictionaryValue);
-  std::unique_ptr<base::DictionaryValue> wifi_dict(new base::DictionaryValue);
-  std::unique_ptr<base::DictionaryValue> ipconfig_dict(
-      new base::DictionaryValue);
-
   if (!cfg->hexssid.has_value() || !cfg->details) {
     NET_LOG(ERROR)
         << "Cannot create WiFi network without hex ssid or WiFi properties";
@@ -740,73 +733,70 @@
     return;
   }
 
-  properties->SetKey(onc::network_config::kType,
-                     base::Value(onc::network_config::kWiFi));
+  // TODO(b/195653632): Populate the shill EAP properties from the mojo
+  // WifiConfiguration object.
+  base::Value::Dict properties;
+  base::Value::Dict wifi_dict;
+  base::Value::Dict ipconfig_dict;
+
+  properties.Set(onc::network_config::kType, onc::network_config::kWiFi);
   // StaticIPConfig dictionary
-  wifi_dict->SetKey(onc::wifi::kHexSSID, base::Value(cfg->hexssid.value()));
-  wifi_dict->SetKey(onc::wifi::kAutoConnect, base::Value(details->autoconnect));
+  wifi_dict.Set(onc::wifi::kHexSSID, cfg->hexssid.value());
+  wifi_dict.Set(onc::wifi::kAutoConnect, details->autoconnect);
   if (cfg->security.empty()) {
-    wifi_dict->SetKey(onc::wifi::kSecurity,
-                      base::Value(onc::wifi::kSecurityNone));
+    wifi_dict.Set(onc::wifi::kSecurity, onc::wifi::kSecurityNone);
   } else {
-    wifi_dict->SetKey(onc::wifi::kSecurity, base::Value(cfg->security));
+    wifi_dict.Set(onc::wifi::kSecurity, cfg->security);
     if (details->passphrase.has_value()) {
-      wifi_dict->SetKey(onc::wifi::kPassphrase,
-                        base::Value(details->passphrase.value()));
+      wifi_dict.Set(onc::wifi::kPassphrase, details->passphrase.value());
     }
   }
-  wifi_dict->SetKey(onc::wifi::kBSSID, base::Value(cfg->bssid));
-  properties->SetKey(onc::network_config::kWiFi,
-                     base::Value::FromUniquePtrValue(std::move(wifi_dict)));
+  wifi_dict.Set(onc::wifi::kBSSID, cfg->bssid);
+  properties.Set(onc::network_config::kWiFi, std::move(wifi_dict));
 
   // Set up static IPv4 config.
   if (cfg->dns_servers.has_value()) {
-    ipconfig_dict->SetKey(onc::ipconfig::kNameServers,
-                          TranslateStringListToValue(cfg->dns_servers.value()));
-    properties->SetKey(onc::network_config::kNameServersConfigType,
-                       base::Value(onc::network_config::kIPConfigTypeStatic));
+    ipconfig_dict.Set(onc::ipconfig::kNameServers,
+                      TranslateStringListToValue(cfg->dns_servers.value()));
+    properties.Set(onc::network_config::kNameServersConfigType,
+                   onc::network_config::kIPConfigTypeStatic);
   }
 
   if (cfg->domains.has_value()) {
-    ipconfig_dict->SetKey(onc::ipconfig::kSearchDomains,
-                          TranslateStringListToValue(cfg->domains.value()));
+    ipconfig_dict.Set(onc::ipconfig::kSearchDomains,
+                      TranslateStringListToValue(cfg->domains.value()));
   }
 
   // Static IPv4 address, static IPv4 address of the gateway and
   // prefix length are made sure to be all valid or all empty on
   // ARC side so we only need to check one of them.
   if (cfg->static_ipv4_config && cfg->static_ipv4_config->ipv4_addr) {
-    ipconfig_dict->SetKey(onc::ipconfig::kType,
-                          base::Value(onc::ipconfig::kIPv4));
-    properties->SetKey(onc::network_config::kIPAddressConfigType,
-                       base::Value(onc::network_config::kIPConfigTypeStatic));
-    ipconfig_dict->SetKey(
-        onc::ipconfig::kIPAddress,
-        base::Value(cfg->static_ipv4_config->ipv4_addr.value()));
-    ipconfig_dict->SetKey(
-        onc::ipconfig::kGateway,
-        base::Value(cfg->static_ipv4_config->gateway_ipv4_addr.value()));
-    ipconfig_dict->SetKey(onc::ipconfig::kRoutingPrefix,
-                          base::Value(cfg->static_ipv4_config->prefix_length));
+    ipconfig_dict.Set(onc::ipconfig::kType, onc::ipconfig::kIPv4);
+    properties.Set(onc::network_config::kIPAddressConfigType,
+                   onc::network_config::kIPConfigTypeStatic);
+    ipconfig_dict.Set(onc::ipconfig::kIPAddress,
+                      cfg->static_ipv4_config->ipv4_addr.value());
+    ipconfig_dict.Set(onc::ipconfig::kGateway,
+                      cfg->static_ipv4_config->gateway_ipv4_addr.value());
+    ipconfig_dict.Set(onc::ipconfig::kRoutingPrefix,
+                      cfg->static_ipv4_config->prefix_length);
   }
   if (cfg->http_proxy) {
-    properties->GetDict().Set(
-        onc::network_config::kProxySettings,
-        TranslateProxyConfiguration(cfg->http_proxy));
+    properties.Set(onc::network_config::kProxySettings,
+                   TranslateProxyConfiguration(cfg->http_proxy));
   }
 
   // Set up meteredness based on meteredOverride config from mojom.
   if (cfg->metered_override == arc::mojom::MeteredOverride::kMetered) {
-    properties->SetKey(onc::network_config::kMetered, base::Value(true));
+    properties.Set(onc::network_config::kMetered, true);
   } else if (cfg->metered_override ==
              arc::mojom::MeteredOverride::kNotmetered) {
-    properties->SetKey(onc::network_config::kMetered, base::Value(false));
+    properties.Set(onc::network_config::kMetered, false);
   }
 
-  if (!ipconfig_dict->DictEmpty()) {
-    properties->SetKey(
-        onc::network_config::kStaticIPConfig,
-        base::Value::FromUniquePtrValue(std::move(ipconfig_dict)));
+  if (!ipconfig_dict.empty()) {
+    properties.Set(onc::network_config::kStaticIPConfig,
+                   std::move(ipconfig_dict));
   }
 
   std::string user_id_hash = ash::LoginState::Get()->primary_user_hash();
@@ -814,7 +804,7 @@
   // the callee interface.
   auto split_callback = base::SplitOnceCallback(std::move(callback));
   GetManagedConfigurationHandler()->CreateConfiguration(
-      user_id_hash, *properties,
+      user_id_hash, base::Value(std::move(properties)),
       base::BindOnce(&ArcNetHostImpl::CreateNetworkSuccessCallback,
                      weak_factory_.GetWeakPtr(),
                      std::move(split_callback.first)),
@@ -980,91 +970,79 @@
       false /* check_error_state */, ash::ConnectCallbackMode::ON_COMPLETED);
 }
 
-base::Value ArcNetHostImpl::TranslateStringListToValue(
+base::Value::List ArcNetHostImpl::TranslateStringListToValue(
     const std::vector<std::string>& string_list) {
-  base::Value result(base::Value::Type::LIST);
+  base::Value::List result;
   for (const auto& item : string_list)
     result.Append(item);
 
   return result;
 }
 
-base::Value ArcNetHostImpl::TranslateLongListToStringValue(
+base::Value::List ArcNetHostImpl::TranslateLongListToStringValue(
     const std::vector<uint64_t>& long_list) {
-  base::Value result(base::Value::Type::LIST);
+  base::Value::List result;
   for (const auto& item : long_list)
     result.Append(base::NumberToString(item));
 
   return result;
 }
 
-std::unique_ptr<base::DictionaryValue>
-ArcNetHostImpl::TranslateVpnConfigurationToOnc(
+base::Value::Dict ArcNetHostImpl::TranslateVpnConfigurationToOnc(
     const mojom::AndroidVpnConfiguration& cfg) {
-  auto top_dict = std::make_unique<base::DictionaryValue>();
+  base::Value::Dict top_dict;
 
   // Name, Type
-  top_dict->SetKey(
-      onc::network_config::kName,
-      base::Value(cfg.session_name.empty() ? cfg.app_label : cfg.session_name));
-  top_dict->SetKey(onc::network_config::kType,
-                   base::Value(onc::network_config::kVPN));
+  top_dict.Set(onc::network_config::kName,
+               cfg.session_name.empty() ? cfg.app_label : cfg.session_name);
+  top_dict.Set(onc::network_config::kType, onc::network_config::kVPN);
 
-  top_dict->SetKey(onc::network_config::kIPAddressConfigType,
-                   base::Value(onc::network_config::kIPConfigTypeStatic));
-  top_dict->SetKey(onc::network_config::kNameServersConfigType,
-                   base::Value(onc::network_config::kIPConfigTypeStatic));
+  top_dict.Set(onc::network_config::kIPAddressConfigType,
+               onc::network_config::kIPConfigTypeStatic);
+  top_dict.Set(onc::network_config::kNameServersConfigType,
+               onc::network_config::kIPConfigTypeStatic);
 
-  std::unique_ptr<base::DictionaryValue> ip_dict =
-      std::make_unique<base::DictionaryValue>();
-  ip_dict->SetKey(onc::ipconfig::kType, base::Value(onc::ipconfig::kIPv4));
-  ip_dict->SetKey(onc::ipconfig::kIPAddress, base::Value(cfg.ipv4_gateway));
-  ip_dict->SetKey(onc::ipconfig::kRoutingPrefix, base::Value(32));
-  ip_dict->SetKey(onc::ipconfig::kGateway, base::Value(cfg.ipv4_gateway));
+  base::Value::Dict ip_dict;
+  ip_dict.Set(onc::ipconfig::kType, onc::ipconfig::kIPv4);
+  ip_dict.Set(onc::ipconfig::kIPAddress, cfg.ipv4_gateway);
+  ip_dict.Set(onc::ipconfig::kRoutingPrefix, 32);
+  ip_dict.Set(onc::ipconfig::kGateway, cfg.ipv4_gateway);
+  ip_dict.Set(onc::ipconfig::kNameServers,
+              TranslateStringListToValue(cfg.nameservers));
+  ip_dict.Set(onc::ipconfig::kSearchDomains,
+              TranslateStringListToValue(cfg.domains));
+  ip_dict.Set(onc::ipconfig::kIncludedRoutes,
+              TranslateStringListToValue(cfg.split_include));
+  ip_dict.Set(onc::ipconfig::kExcludedRoutes,
+              TranslateStringListToValue(cfg.split_exclude));
 
-  ip_dict->SetKey(onc::ipconfig::kNameServers,
-                  TranslateStringListToValue(cfg.nameservers));
-  ip_dict->SetKey(onc::ipconfig::kSearchDomains,
-                  TranslateStringListToValue(cfg.domains));
-  ip_dict->SetKey(onc::ipconfig::kIncludedRoutes,
-                  TranslateStringListToValue(cfg.split_include));
-  ip_dict->SetKey(onc::ipconfig::kExcludedRoutes,
-                  TranslateStringListToValue(cfg.split_exclude));
-
-  top_dict->SetKey(onc::network_config::kStaticIPConfig,
-                   base::Value::FromUniquePtrValue(std::move(ip_dict)));
+  top_dict.Set(onc::network_config::kStaticIPConfig, std::move(ip_dict));
 
   // VPN dictionary
-  std::unique_ptr<base::DictionaryValue> vpn_dict =
-      std::make_unique<base::DictionaryValue>();
-  vpn_dict->SetKey(onc::vpn::kHost, base::Value(cfg.app_name));
-  vpn_dict->SetKey(onc::vpn::kType, base::Value(onc::vpn::kArcVpn));
+  base::Value::Dict vpn_dict;
+  vpn_dict.Set(onc::vpn::kHost, cfg.app_name);
+  vpn_dict.Set(onc::vpn::kType, onc::vpn::kArcVpn);
 
   // ARCVPN dictionary
-  std::unique_ptr<base::DictionaryValue> arcvpn_dict =
-      std::make_unique<base::DictionaryValue>();
-  arcvpn_dict->SetKey(
-      onc::arc_vpn::kTunnelChrome,
-      base::Value(cfg.tunnel_chrome_traffic ? "true" : "false"));
-  vpn_dict->SetKey(onc::vpn::kArcVpn,
-                   base::Value::FromUniquePtrValue(std::move(arcvpn_dict)));
+  base::Value::Dict arcvpn_dict;
+  arcvpn_dict.Set(onc::arc_vpn::kTunnelChrome,
+                  cfg.tunnel_chrome_traffic ? "true" : "false");
+  vpn_dict.Set(onc::vpn::kArcVpn, std::move(arcvpn_dict));
 
-  top_dict->SetKey(onc::network_config::kVPN,
-                   base::Value::FromUniquePtrValue(std::move(vpn_dict)));
+  top_dict.Set(onc::network_config::kVPN, std::move(vpn_dict));
   if (cfg.http_proxy) {
-    top_dict->SetKey(onc::network_config::kProxySettings,
-                     base::Value(TranslateProxyConfiguration(cfg.http_proxy)));
+    top_dict.Set(onc::network_config::kProxySettings,
+                 TranslateProxyConfiguration(cfg.http_proxy));
   }
   return top_dict;
 }
 
 void ArcNetHostImpl::AndroidVpnConnected(
     mojom::AndroidVpnConfigurationPtr cfg) {
-  auto properties = TranslateVpnConfigurationToOnc(*cfg);
   std::string service_path = LookupArcVpnServicePath();
   if (!service_path.empty()) {
     GetManagedConfigurationHandler()->SetProperties(
-        service_path, *properties,
+        service_path, base::Value(TranslateVpnConfigurationToOnc(*cfg)),
         base::BindOnce(&ArcNetHostImpl::ConnectArcVpn,
                        weak_factory_.GetWeakPtr(), service_path, std::string()),
         base::BindOnce(&ArcVpnErrorCallback,
@@ -1074,7 +1052,7 @@
 
   std::string user_id_hash = ash::LoginState::Get()->primary_user_hash();
   GetManagedConfigurationHandler()->CreateConfiguration(
-      user_id_hash, *properties,
+      user_id_hash, base::Value(TranslateVpnConfigurationToOnc(*cfg)),
       base::BindOnce(&ArcNetHostImpl::ConnectArcVpn,
                      weak_factory_.GetWeakPtr()),
       base::BindOnce(&ArcVpnErrorCallback, "connecting new ARC VPN"));
@@ -1099,7 +1077,7 @@
 
 void ArcNetHostImpl::TranslateEapCredentialsToDict(
     mojom::EapCredentialsPtr cred,
-    base::OnceCallback<void(base::Value)> callback) {
+    base::OnceCallback<void(base::Value::Dict)> callback) {
   if (!cred) {
     NET_LOG(ERROR) << "Empty EAP credentials";
     return;
@@ -1136,7 +1114,7 @@
 
 void ArcNetHostImpl::TranslateEapCredentialsToDictWithCertID(
     mojom::EapCredentialsPtr cred,
-    base::OnceCallback<void(base::Value)> callback,
+    base::OnceCallback<void(base::Value::Dict)> callback,
     const absl::optional<std::string>& cert_id,
     const absl::optional<int>& slot_id) {
   if (!cred) {
@@ -1144,70 +1122,66 @@
     return;
   }
 
-  base::Value dict(base::Value::Type::DICTIONARY);
-  dict.SetStringKey(shill::kEapMethodProperty,
-                    TranslateEapMethod(cred->method));
-  dict.SetStringKey(shill::kEapPhase2AuthProperty,
-                    TranslateEapPhase2Method(cred->phase2_method));
+  base::Value::Dict dict;
+  dict.Set(shill::kEapMethodProperty, TranslateEapMethod(cred->method));
+  dict.Set(shill::kEapPhase2AuthProperty,
+           TranslateEapPhase2Method(cred->phase2_method));
   if (cred->anonymous_identity.has_value()) {
-    dict.SetStringKey(shill::kEapAnonymousIdentityProperty,
-                      cred->anonymous_identity.value());
+    dict.Set(shill::kEapAnonymousIdentityProperty,
+             cred->anonymous_identity.value());
   }
   if (cred->identity.has_value())
-    dict.SetStringKey(shill::kEapIdentityProperty, cred->identity.value());
+    dict.Set(shill::kEapIdentityProperty, cred->identity.value());
 
   if (cred->password.has_value())
-    dict.SetStringKey(shill::kEapPasswordProperty, cred->password.value());
+    dict.Set(shill::kEapPasswordProperty, cred->password.value());
 
-  dict.SetStringKey(shill::kEapKeyMgmtProperty,
-                    TranslateKeyManagement(cred->key_management));
+  dict.Set(shill::kEapKeyMgmtProperty,
+           TranslateKeyManagement(cred->key_management));
 
   if (cred->ca_certificate_pem.has_value()) {
-    dict.SetKey(shill::kEapCaCertPemProperty,
-                TranslateStringListToValue(cred->ca_certificate_pem.value()));
+    dict.Set(shill::kEapCaCertPemProperty,
+             TranslateStringListToValue(cred->ca_certificate_pem.value()));
   }
   if (cert_id.has_value() && slot_id.has_value()) {
     // The ID of imported user certificate and private key is the same, use one
     // of them.
-    dict.SetStringKey(
+    dict.Set(
         shill::kEapKeyIdProperty,
         base::StringPrintf("%i:%s", slot_id.value(), cert_id.value().c_str()));
-    dict.SetStringKey(
+    dict.Set(
         shill::kEapCertIdProperty,
         base::StringPrintf("%i:%s", slot_id.value(), cert_id.value().c_str()));
-    dict.SetStringKey(shill::kEapPinProperty, ash::client_cert::kDefaultTPMPin);
+    dict.Set(shill::kEapPinProperty, ash::client_cert::kDefaultTPMPin);
   }
 
   if (cred->subject_match.has_value()) {
-    dict.SetStringKey(shill::kEapSubjectMatchProperty,
-                      cred->subject_match.value());
+    dict.Set(shill::kEapSubjectMatchProperty, cred->subject_match.value());
   }
   if (cred->subject_alternative_name_match_list.has_value()) {
-    dict.SetKey(shill::kEapSubjectAlternativeNameMatchProperty,
-                TranslateStringListToValue(
-                    cred->subject_alternative_name_match_list.value()));
+    dict.Set(shill::kEapSubjectAlternativeNameMatchProperty,
+             TranslateStringListToValue(
+                 cred->subject_alternative_name_match_list.value()));
   }
   if (cred->domain_suffix_match_list.has_value()) {
-    dict.SetKey(
+    dict.Set(
         shill::kEapDomainSuffixMatchProperty,
         TranslateStringListToValue(cred->domain_suffix_match_list.value()));
   }
   if (cred->tls_version_max.has_value()) {
-    dict.SetStringKey(shill::kEapTLSVersionMaxProperty,
-                      cred->tls_version_max.value());
+    dict.Set(shill::kEapTLSVersionMaxProperty, cred->tls_version_max.value());
   }
-  dict.SetBoolKey(shill::kEapUseSystemCasProperty, cred->use_system_cas);
-  dict.SetBoolKey(shill::kEapUseProactiveKeyCachingProperty,
-                  cred->use_proactive_key_caching);
-  dict.SetBoolKey(shill::kEapUseLoginPasswordProperty,
-                  cred->use_login_password);
+  dict.Set(shill::kEapUseSystemCasProperty, cred->use_system_cas);
+  dict.Set(shill::kEapUseProactiveKeyCachingProperty,
+           cred->use_proactive_key_caching);
+  dict.Set(shill::kEapUseLoginPasswordProperty, cred->use_login_password);
 
   std::move(callback).Run(std::move(dict));
 }
 
 void ArcNetHostImpl::TranslatePasspointCredentialsToDict(
     mojom::PasspointCredentialsPtr cred,
-    base::OnceCallback<void(base::Value)> callback) {
+    base::OnceCallback<void(base::Value::Dict)> callback) {
   if (!cred) {
     NET_LOG(ERROR) << "Empty passpoint credentials";
     return;
@@ -1227,37 +1201,35 @@
 
 void ArcNetHostImpl::TranslatePasspointCredentialsToDictWithEapTranslated(
     mojom::PasspointCredentialsPtr cred,
-    base::OnceCallback<void(base::Value)> callback,
-    base::Value dict) {
+    base::OnceCallback<void(base::Value::Dict)> callback,
+    base::Value::Dict dict) {
   if (!cred) {
     NET_LOG(ERROR) << "Empty passpoint credentials";
     return;
   }
-  if (dict.is_none()) {
+  if (dict.empty()) {
     NET_LOG(ERROR) << "Failed to translate EapCredentials properties";
     return;
   }
 
-  dict.SetKey(shill::kPasspointCredentialsDomainsProperty,
-              TranslateStringListToValue(cred->domains));
-  dict.SetStringKey(shill::kPasspointCredentialsRealmProperty, cred->realm);
-  dict.SetKey(shill::kPasspointCredentialsHomeOIsProperty,
-              TranslateLongListToStringValue(cred->home_ois));
-  dict.SetKey(shill::kPasspointCredentialsRequiredHomeOIsProperty,
-              TranslateLongListToStringValue(cred->required_home_ois));
-  dict.SetKey(shill::kPasspointCredentialsRoamingConsortiaProperty,
-              TranslateLongListToStringValue(cred->roaming_consortium_ois));
-  dict.SetBoolKey(shill::kPasspointCredentialsMeteredOverrideProperty,
-                  cred->metered);
-  dict.SetStringKey(shill::kPasspointCredentialsAndroidPackageNameProperty,
-                    cred->package_name);
+  dict.Set(shill::kPasspointCredentialsDomainsProperty,
+           TranslateStringListToValue(cred->domains));
+  dict.Set(shill::kPasspointCredentialsRealmProperty, cred->realm);
+  dict.Set(shill::kPasspointCredentialsHomeOIsProperty,
+           TranslateLongListToStringValue(cred->home_ois));
+  dict.Set(shill::kPasspointCredentialsRequiredHomeOIsProperty,
+           TranslateLongListToStringValue(cred->required_home_ois));
+  dict.Set(shill::kPasspointCredentialsRoamingConsortiaProperty,
+           TranslateLongListToStringValue(cred->roaming_consortium_ois));
+  dict.Set(shill::kPasspointCredentialsMeteredOverrideProperty, cred->metered);
+  dict.Set(shill::kPasspointCredentialsAndroidPackageNameProperty,
+           cred->package_name);
   if (cred->friendly_name.has_value()) {
-    dict.SetStringKey(shill::kPasspointCredentialsFriendlyNameProperty,
-                      cred->friendly_name.value());
+    dict.Set(shill::kPasspointCredentialsFriendlyNameProperty,
+             cred->friendly_name.value());
   }
-  dict.SetStringKey(
-      shill::kPasspointCredentialsExpirationTimeMillisecondsProperty,
-      base::NumberToString(cred->subscription_expiration_time_ms));
+  dict.Set(shill::kPasspointCredentialsExpirationTimeMillisecondsProperty,
+           base::NumberToString(cred->subscription_expiration_time_ms));
 
   std::move(callback).Run(std::move(dict));
 }
@@ -1274,10 +1246,8 @@
                    http_proxy->get_pac_url_proxy()->pac_url.spec());
   } else {
     base::Value::Dict manual;
-    manual.Set(onc::proxy::kHost,
-               base::Value(http_proxy->get_manual_proxy()->host));
-    manual.Set(onc::proxy::kPort,
-               base::Value(http_proxy->get_manual_proxy()->port));
+    manual.Set(onc::proxy::kHost, http_proxy->get_manual_proxy()->host);
+    manual.Set(onc::proxy::kPort, http_proxy->get_manual_proxy()->port);
     manual.Set(onc::proxy::kExcludeDomains,
                TranslateStringListToValue(
                    std::move(http_proxy->get_manual_proxy()->exclusion_list)));
@@ -1296,8 +1266,8 @@
 }
 
 void ArcNetHostImpl::AddPasspointCredentialsWithProperties(
-    base::Value properties) {
-  if (properties.is_none()) {
+    base::Value::Dict properties) {
+  if (properties.empty()) {
     NET_LOG(ERROR) << "Failed to translate PasspointCredentials properties";
     return;
   }
@@ -1309,7 +1279,8 @@
   }
 
   ash::ShillManagerClient::Get()->AddPasspointCredentials(
-      dbus::ObjectPath(profile->path), properties, base::DoNothing(),
+      dbus::ObjectPath(profile->path), base::Value(std::move(properties)),
+      base::DoNothing(),
       base::BindOnce(&AddPasspointCredentialsFailureCallback));
   return;
 }
@@ -1327,19 +1298,19 @@
     return;
   }
 
-  base::Value shill_properties(base::Value::Type::DICTIONARY);
+  base::Value::Dict shill_properties;
   if (properties->fqdn.has_value()) {
-    shill_properties.SetStringKey(shill::kPasspointCredentialsFQDNProperty,
-                                  properties->fqdn.value());
+    shill_properties.Set(shill::kPasspointCredentialsFQDNProperty,
+                         properties->fqdn.value());
   }
   if (properties->package_name.has_value()) {
-    shill_properties.SetStringKey(
-        shill::kPasspointCredentialsAndroidPackageNameProperty,
-        properties->package_name.value());
+    shill_properties.Set(shill::kPasspointCredentialsAndroidPackageNameProperty,
+                         properties->package_name.value());
   }
 
   ash::ShillManagerClient::Get()->RemovePasspointCredentials(
-      dbus::ObjectPath(profile->path), shill_properties, base::DoNothing(),
+      dbus::ObjectPath(profile->path), base::Value(std::move(shill_properties)),
+      base::DoNothing(),
       base::BindOnce(&RemovePasspointCredentialsFailureCallback));
 
   return;
diff --git a/ash/components/arc/net/arc_net_host_impl.h b/ash/components/arc/net/arc_net_host_impl.h
index 48e1bc0..4a7ff424 100644
--- a/ash/components/arc/net/arc_net_host_impl.h
+++ b/ash/components/arc/net/arc_net_host_impl.h
@@ -84,7 +84,7 @@
   void RemovePasspointCredentials(
       mojom::PasspointRemovalPropertiesPtr properties) override;
   void SetAlwaysOnVpn(const std::string& vpnPackage, bool lockdown) override;
-  std::unique_ptr<base::DictionaryValue> TranslateVpnConfigurationToOnc(
+  base::Value::Dict TranslateVpnConfigurationToOnc(
       const mojom::AndroidVpnConfiguration& cfg);
   void DisconnectHostVpn() override;
   void StartLohs(mojom::LohsConfigPtr config,
@@ -110,8 +110,6 @@
   const ash::NetworkState* GetDefaultNetworkFromChrome();
   void UpdateActiveNetworks(
       const std::vector<patchpanel::NetworkDevice>& devices);
-  void DefaultNetworkSuccessCallback(const std::string& service_path,
-                                     const base::DictionaryValue& dictionary);
 
   // Due to a race in Chrome, GetNetworkStateFromGuid() might not know about
   // newly created networks, as that function relies on the completion of a
@@ -136,7 +134,7 @@
   // Convert a vector of strings, |string_list|, to a base::Value
   // that can be added to an ONC dictionary.  This is used for fields
   // like NameServers, SearchDomains, etc.
-  base::Value TranslateStringListToValue(
+  base::Value::List TranslateStringListToValue(
       const std::vector<std::string>& string_list);
 
   // Convert a vector of uint64_t, |long_list|, to a base::Value of type list
@@ -144,7 +142,7 @@
   // supported for base::Value.
   // The translated values will be a list of decimal string and not a single
   // string.
-  base::Value TranslateLongListToStringValue(
+  base::Value::List TranslateLongListToStringValue(
       const std::vector<uint64_t>& long_list);
 
   // Ask Shill to connect to the Android VPN with name |service_path|.
@@ -162,14 +160,14 @@
   // import them and run |callback| afterwards.
   void TranslateEapCredentialsToDict(
       mojom::EapCredentialsPtr cred,
-      base::OnceCallback<void(base::Value)> callback);
+      base::OnceCallback<void(base::Value::Dict)> callback);
 
   // Synchronously translate EAP credentials to base::Value dictionary with
   // empty or imported certificate and slot ID. |callback| is then run with
   // the translated values.
   void TranslateEapCredentialsToDictWithCertID(
       mojom::EapCredentialsPtr cred,
-      base::OnceCallback<void(base::Value)> callback,
+      base::OnceCallback<void(base::Value::Dict)> callback,
       const absl::optional<std::string>& cert_id,
       const absl::optional<int>& slot_id);
 
@@ -178,22 +176,22 @@
   // asynchronously import them and run |callback| afterwards.
   void TranslatePasspointCredentialsToDict(
       mojom::PasspointCredentialsPtr cred,
-      base::OnceCallback<void(base::Value)> callback);
+      base::OnceCallback<void(base::Value::Dict)> callback);
 
   // Synchronously translate passpoint credentials to base::Value dictionary
   // with EAP fields translated inside |dict|. |callback| is then run with
   // the translated values.
   void TranslatePasspointCredentialsToDictWithEapTranslated(
       mojom::PasspointCredentialsPtr cred,
-      base::OnceCallback<void(base::Value)> callback,
-      base::Value dict);
+      base::OnceCallback<void(base::Value::Dict)> callback,
+      base::Value::Dict dict);
 
   base::Value::Dict TranslateProxyConfiguration(
       const mojom::ArcProxyInfoPtr& http_proxy);
 
   // Synchronously calls Chrome OS to add passpoint credentials from ARC with
   // the properties values translated taken from mojo.
-  void AddPasspointCredentialsWithProperties(base::Value properties);
+  void AddPasspointCredentialsWithProperties(base::Value::Dict properties);
 
   // Pass any Chrome flags into ARC.
   void SetUpFlags();
diff --git a/ash/webui/camera_app_ui/resources/js/device/mode/record_time.ts b/ash/webui/camera_app_ui/resources/js/device/mode/record_time.ts
index 8b3d079..a6e516597 100644
--- a/ash/webui/camera_app_ui/resources/js/device/mode/record_time.ts
+++ b/ash/webui/camera_app_ui/resources/js/device/mode/record_time.ts
@@ -125,7 +125,7 @@
    * Returns the recorded duration in milliseconds.
    */
   inMilliseconds(): number {
-    return this.totalDuration;
+    return Math.round(this.totalDuration);
   }
 }
 
diff --git a/ash/webui/camera_app_ui/resources/js/device/mode/video.ts b/ash/webui/camera_app_ui/resources/js/device/mode/video.ts
index 6b1717366..7475e5a3b 100644
--- a/ash/webui/camera_app_ui/resources/js/device/mode/video.ts
+++ b/ash/webui/camera_app_ui/resources/js/device/mode/video.ts
@@ -512,17 +512,9 @@
       state.set(state.State.RECORDING, true);
       this.gifRecordTime.start({resume: false});
 
+      let gifSaver = null;
       try {
-        const gifSaver = await this.captureGif();
-        const gifName = (new Filenamer()).newVideoName(VideoType.GIF);
-        // TODO(b/191950622): Close capture stream before onGifCaptureDone()
-        // opening preview page when multi-stream recording enabled.
-        return [this.handler.onGifCaptureDone({
-          name: gifName,
-          gifSaver,
-          resolution: this.captureResolution,
-          duration: this.gifRecordTime.inMilliseconds(),
-        })];
+        gifSaver = await this.captureGif();
       } catch (e) {
         if (e instanceof NoFrameError) {
           toast.show(I18nString.ERROR_MSG_VIDEO_TOO_SHORT);
@@ -533,6 +525,16 @@
         state.set(state.State.RECORDING, false);
         this.gifRecordTime.stop({pause: false});
       }
+
+      const gifName = (new Filenamer()).newVideoName(VideoType.GIF);
+      // TODO(b/191950622): Close capture stream before onGifCaptureDone()
+      // opening preview page when multi-stream recording enabled.
+      return [this.handler.onGifCaptureDone({
+        name: gifName,
+        gifSaver,
+        resolution: this.captureResolution,
+        duration: this.gifRecordTime.inMilliseconds(),
+      })];
     } else {
       this.recordTime.start({resume: false});
       let videoSaver: VideoSaver|null = null;
diff --git a/ash/webui/camera_app_ui/resources/js/metrics.ts b/ash/webui/camera_app_ui/resources/js/metrics.ts
index be1f5a2..56c518c 100644
--- a/ash/webui/camera_app_ui/resources/js/metrics.ts
+++ b/ash/webui/camera_app_ui/resources/js/metrics.ts
@@ -57,6 +57,13 @@
     assignDimension(event, dimen);
   }
 
+  if (event.eventValue !== undefined && !Number.isInteger(event.eventValue)) {
+    // Round the duration here since GA expects that the value is an
+    // integer. Reference:
+    // https://support.google.com/analytics/answer/1033068
+    event.eventValue = Math.round(event.eventValue);
+  }
+
   await ready.wait();
 
   // This value reflects the logging consent option in OS settings.
@@ -403,10 +410,7 @@
         eventCategory: 'perf',
         eventAction: event,
         eventLabel: facing,
-        // Round the duration here since GA expects that the value is an
-        // integer. Reference:
-        // https://support.google.com/analytics/answer/1033068
-        eventValue: Math.round(duration),
+        eventValue: duration,
       },
       new Map([
         [MetricDimension.RESOLUTION, `${resolution}`],
diff --git a/ash/webui/common/resources/navigation_view_panel.html b/ash/webui/common/resources/navigation_view_panel.html
index fe7844d0..2c51afe4 100644
--- a/ash/webui/common/resources/navigation_view_panel.html
+++ b/ash/webui/common/resources/navigation_view_panel.html
@@ -103,11 +103,11 @@
   <iron-media-query query="(min-width: 769px)" query-matches="{{showNav}}">
   </iron-media-query>
   <template is="dom-if" if="[[showToolBar]]">
-    <div id="topNav">
+    <div id="topNav" part="top-nav">
       <page-toolbar
           title="[[title]]"
           is-narrow="[[!showNav]]"
-          exportparts="title">
+          exportparts="title, toolbar-container">
       </page-toolbar>
     </div>
   </template>
diff --git a/ash/webui/common/resources/page_toolbar.html b/ash/webui/common/resources/page_toolbar.html
index 396dcc5..8c14a2da 100644
--- a/ash/webui/common/resources/page_toolbar.html
+++ b/ash/webui/common/resources/page_toolbar.html
@@ -32,7 +32,7 @@
     letter-spacing: 0.25px;
   }
 </style>
-<div id="container">
+<div id="container" part="toolbar-container">
   <div id="leftContent">
     <template is="dom-if" if="[[isNarrow]]">
       <cr-icon-button id="menuButton" class="no-overlap"
diff --git a/ash/webui/file_manager/untrusted_resources/files_text_content.css b/ash/webui/file_manager/untrusted_resources/files_text_content.css
index 092e783..7c05fb83 100644
--- a/ash/webui/file_manager/untrusted_resources/files_text_content.css
+++ b/ash/webui/file_manager/untrusted_resources/files_text_content.css
@@ -19,7 +19,10 @@
 }
 
 html {
+  /* TODO(files-app-dark-mode): figure out what text/background colors should
+     be used for quick view text (and html?) content display. */
   background: white;
+  color: black;
   overflow: auto;
 }
 
diff --git a/ash/webui/shortcut_customization_ui/resources/css/shortcut_customization_shared.css b/ash/webui/shortcut_customization_ui/resources/css/shortcut_customization_shared.css
index aa9a4f3..8ec1843 100644
--- a/ash/webui/shortcut_customization_ui/resources/css/shortcut_customization_shared.css
+++ b/ash/webui/shortcut_customization_ui/resources/css/shortcut_customization_shared.css
@@ -15,6 +15,6 @@
   --shortcuts-font-weight-regular: 400;
   --shortcuts-font-weight-medium: 500;
 
-  --shortcuts-default-font-family: "Google Sans", Roboto, sans-serif;
-  --shortcuts-default-font-size: 13px;
-}
+  --shortcuts-font-family-default: "Google Sans", Roboto, sans-serif;
+  --shortcuts-font-size-default: 13px;
+}
\ No newline at end of file
diff --git a/ash/webui/shortcut_customization_ui/resources/js/accelerator_row.html b/ash/webui/shortcut_customization_ui/resources/js/accelerator_row.html
index 2c6be44d..dcacad0 100644
--- a/ash/webui/shortcut_customization_ui/resources/js/accelerator_row.html
+++ b/ash/webui/shortcut_customization_ui/resources/js/accelerator_row.html
@@ -3,8 +3,8 @@
     border-bottom: var(--cr-separator-line);
     display: flex;
     flex-direction: row;
-    padding-bottom: 12px;
-    padding-top: 12px;
+    padding-bottom: 10px;
+    padding-top: 10px;
   }
 
   #acceleratorViewList {
diff --git a/ash/webui/shortcut_customization_ui/resources/js/accelerator_subsection.html b/ash/webui/shortcut_customization_ui/resources/js/accelerator_subsection.html
index 899d94d..2f7c2836 100644
--- a/ash/webui/shortcut_customization_ui/resources/js/accelerator_subsection.html
+++ b/ash/webui/shortcut_customization_ui/resources/js/accelerator_subsection.html
@@ -1,7 +1,9 @@
 <style>
   #title {
+    align-items: center;
+    display: flex;
     font-weight: bold;
-    margin-bottom: 20px;
+    height: 48px;
   }
 
   #rowList {
diff --git a/ash/webui/shortcut_customization_ui/resources/js/input_key.html b/ash/webui/shortcut_customization_ui/resources/js/input_key.html
index 80c07b6..d4f147e 100644
--- a/ash/webui/shortcut_customization_ui/resources/js/input_key.html
+++ b/ash/webui/shortcut_customization_ui/resources/js/input_key.html
@@ -1,13 +1,13 @@
 <style>
   .key-container {
     align-items: center;
-    border-radius: 5px;
+    border-radius: 12px;
     box-sizing: border-box;
     display: flex;
     font-weight: 500;
     height: 28px;
     justify-content: center;
-    margin-inline-start: 5px;
+    margin-inline-start: 8px;
     min-width: 28px;
     padding-inline: 8px;
   }
diff --git a/ash/webui/shortcut_customization_ui/resources/js/shortcut_customization_app.html b/ash/webui/shortcut_customization_ui/resources/js/shortcut_customization_app.html
index 060ff895..9ea69ec 100644
--- a/ash/webui/shortcut_customization_ui/resources/js/shortcut_customization_app.html
+++ b/ash/webui/shortcut_customization_ui/resources/js/shortcut_customization_app.html
@@ -1,10 +1,20 @@
-<style include="shortcut-customization-fonts shortcut-customization-shared">
+<style include="shortcut-customization-shared">
   :host {
-    font-family: var(--shortcuts-default-font-family);
-    font-size: var(--shortcuts-default-font-size);
+    font-family: var(--shortcuts-font-family-default);
+    font-size: var(--shortcuts-font-size-default);
     font-weight: var(--shortcuts-font-weight-regular);
   }
 
+  #navigationPanel::part(top-nav) {
+    height: 72px;
+  }
+
+  #navigationPanel::part(toolbar-container) {
+    align-items: flex-end;
+    display: flex;
+    height: 100%;
+  }
+
   #navigationPanel::part(title) {
     padding-inline-start: 8px;
   }
diff --git a/base/test/task_environment.cc b/base/test/task_environment.cc
index 0848818..387826dd 100644
--- a/base/test/task_environment.cc
+++ b/base/test/task_environment.cc
@@ -865,6 +865,7 @@
 void TaskEnvironment::TestTaskTracker::RunTask(internal::Task task,
                                                internal::TaskSource* sequence,
                                                const TaskTraits& traits) {
+  const Location posted_from = task.posted_from;
   int task_number;
   {
     AutoLock auto_lock(lock_);
@@ -873,27 +874,24 @@
       can_run_tasks_cv_.Wait();
 
     task_number = next_task_number_++;
-    auto pair = running_tasks_.emplace(task_number, task.posted_from);
+    auto pair = running_tasks_.emplace(task_number, posted_from);
     CHECK(pair.second);  // If false, the |task_number| was already present.
   }
 
-  {
-    // Using TimeTicksNowIgnoringOverride() because in tests that mock time,
-    // Now() can advance very far very fast, and that's not a problem. This is
-    // watching for tests that have actually long running tasks which cause our
-    // test suites to run slowly.
-    base::TimeTicks before = base::subtle::TimeTicksNowIgnoringOverride();
-    const Location posted_from = task.posted_from;
-    internal::ThreadPoolImpl::TaskTrackerImpl::RunTask(std::move(task),
-                                                       sequence, traits);
-    base::TimeTicks after = base::subtle::TimeTicksNowIgnoringOverride();
+  // Using TimeTicksNowIgnoringOverride() because in tests that mock time,
+  // Now() can advance very far very fast, and that's not a problem. This is
+  // watching for tests that have actually long running tasks which cause our
+  // test suites to run slowly.
+  base::TimeTicks before = base::subtle::TimeTicksNowIgnoringOverride();
+  internal::ThreadPoolImpl::TaskTrackerImpl::RunTask(std::move(task), sequence,
+                                                     traits);
+  base::TimeTicks after = base::subtle::TimeTicksNowIgnoringOverride();
 
-    const TimeDelta kTimeout = TestTimeouts::action_max_timeout();
-    if ((after - before) > kTimeout) {
-      ADD_FAILURE() << "TaskEnvironment: RunTask took more than "
-                    << kTimeout.InSeconds() << " seconds. Posted from "
-                    << posted_from.ToString();
-    }
+  const TimeDelta kTimeout = TestTimeouts::action_max_timeout();
+  if ((after - before) > kTimeout) {
+    ADD_FAILURE() << "TaskEnvironment: RunTask took more than "
+                  << kTimeout.InSeconds() << " seconds. Posted from "
+                  << posted_from.ToString();
   }
 
   {
diff --git a/build/android/apk_operations.py b/build/android/apk_operations.py
index 2664a16..976f654 100755
--- a/build/android/apk_operations.py
+++ b/build/android/apk_operations.py
@@ -212,6 +212,8 @@
   start_idx = next((i for i, l in enumerate(lines)
                     if l.startswith('Activity Resolver Table:')), None)
   if start_idx is None:
+    if not device.IsApplicationInstalled(package_name):
+      raise Exception('Package not installed: ' + package_name)
     raise Exception('No Activity Resolver Table in:\n' + '\n'.join(lines))
   line_count = next(i for i, l in enumerate(lines[start_idx + 1:])
                     if l and not l[0].isspace())
@@ -220,19 +222,37 @@
   # Split on each Activity entry.
   entries = re.split(r'^        [0-9a-f]+ ', data, flags=re.MULTILINE)
 
+  def activity_name_from_entry(entry):
+    assert entry.startswith(package_name), 'Got: ' + entry
+    activity_name = entry[len(package_name) + 1:].split(' ', 1)[0]
+    if activity_name[0] == '.':
+      activity_name = package_name + activity_name
+    return activity_name
+
   # Find the one with the text we want.
   category_text = f'Category: "{category}"'
   action_text = f'Action: "{action}"'
-  matched_entry = next(
-      (e for e in entries[1:] if category_text in e and action_text in e), None)
-  if matched_entry is None:
-    raise Exception(f'Did not find {category_text}, {action_text} in\n{data}')
+  matched_entries = [
+      e for e in entries[1:] if category_text in e and action_text in e
+  ]
 
-  assert matched_entry.startswith(package_name), 'Got: ' + matched_entry
-  activity_name = matched_entry[len(package_name) + 1:].split(' ', 1)[0]
-  if activity_name[0] == '.':
-    activity_name = package_name + activity_name
-  return activity_name
+  if not matched_entries:
+    raise Exception(f'Did not find {category_text}, {action_text} in\n{data}')
+  if len(matched_entries) > 1:
+    # When there are multiple matches, look for the one marked as default.
+    # Necessary for Monochrome, which also has MonochromeLauncherActivity.
+    default_entries = [
+        e for e in matched_entries if 'android.intent.category.DEFAULT' in e
+    ]
+    matched_entries = default_entries or matched_entries
+
+  # See if all matches point to the same activity.
+  activity_names = {activity_name_from_entry(e) for e in matched_entries}
+
+  if len(activity_names) > 1:
+    raise Exception('Found multiple launcher activities:\n * ' +
+                    '\n * '.join(sorted(activity_names)))
+  return next(iter(activity_names))
 
 
 def _LaunchUrl(devices,
@@ -1445,10 +1465,6 @@
   def Run(self):
     if self.is_test_apk:
       raise Exception('Use the bin/run_* scripts to run test apks.')
-    if self.args.url and self.is_bundle:
-      # TODO(digit): Support this, maybe by using 'dumpsys' as described
-      # in the _LaunchUrl() comment.
-      raise Exception('Launching with URL not supported for bundles yet!')
     _LaunchUrl(self.devices,
                self.args.package_name,
                argv=self.args.args,
diff --git a/build/android/gyp/proguard.py b/build/android/gyp/proguard.py
index f259374a..8c392209 100755
--- a/build/android/gyp/proguard.py
+++ b/build/android/gyp/proguard.py
@@ -205,6 +205,48 @@
     shutil.move(tmp_jar_output, self.final_output_path)
 
 
+def _DeDupeInputJars(split_contexts_by_name):
+  """Moves jars used by multiple splits into common ancestors.
+
+  Updates |input_jars| for each _SplitContext.
+  """
+
+  def count_ancestors(split_context):
+    ret = 0
+    if split_context.parent_name:
+      ret += 1
+      ret += count_ancestors(split_contexts_by_name[split_context.parent_name])
+    return ret
+
+  base_context = split_contexts_by_name['base']
+  # Sort by tree depth so that ensure children are visited before their parents.
+  sorted_contexts = list(split_contexts_by_name.values())
+  sorted_contexts.remove(base_context)
+  sorted_contexts.sort(key=count_ancestors, reverse=True)
+
+  # If a jar is present in multiple siblings, promote it to their parent.
+  seen_jars_by_parent = defaultdict(set)
+  for split_context in sorted_contexts:
+    seen_jars = seen_jars_by_parent[split_context.parent_name]
+    new_dupes = seen_jars.intersection(split_context.input_jars)
+    parent_context = split_contexts_by_name[split_context.parent_name]
+    parent_context.input_jars.update(new_dupes)
+    seen_jars.update(split_context.input_jars)
+
+  def ancestor_jars(parent_name, dest=None):
+    dest = dest or set()
+    if not parent_name:
+      return dest
+    parent_context = split_contexts_by_name[parent_name]
+    dest.update(parent_context.input_jars)
+    return ancestor_jars(parent_context.parent_name, dest)
+
+  # Now that jars have been moved up the tree, remove those that appear in
+  # ancestors.
+  for split_context in sorted_contexts:
+    split_context.input_jars -= ancestor_jars(split_context.parent_name)
+
+
 def _OptimizeWithR8(options,
                     config_paths,
                     libraries,
@@ -299,6 +341,8 @@
       for main_dex_rule in options.main_dex_rules_path:
         cmd += ['--main-dex-rules', main_dex_rule]
 
+    _DeDupeInputJars(split_contexts_by_name)
+
     # Add any extra inputs to the base context (e.g. desugar runtime).
     extra_jars = set(options.input_paths)
     for split_context in split_contexts_by_name.values():
diff --git a/build/android/gyp/write_build_config.py b/build/android/gyp/write_build_config.py
index 65ca0e1..45b25553 100755
--- a/build/android/gyp/write_build_config.py
+++ b/build/android/gyp/write_build_config.py
@@ -114,10 +114,10 @@
 Only seen for the [`android_app_bundle`](#target_android_app_bundle) type.
 Path to the base module for the bundle.
 
-* `deps_info['module_name']`:
+* `deps_info['is_base_module']`:
 Only seen for the
 [`android_app_bundle_module`](#target_android_app_bundle_module)
-type. The name of the feature module.
+type. Whether or not this module is the base module for some bundle.
 
 * `deps_info['dependency_zips']`:
 List of `deps_info['resources_zip']` entries for all `android_resources`
@@ -329,10 +329,6 @@
 collection of all `deps_info['device_jar_path']` entries for the target and all
 its dependencies.
 
-* `deps_info['all_dex_files']`:
-The list of paths to all `deps_info['dex_path']` entries for all libraries
-that comprise this APK. Valid only for debug builds.
-
 
 ## <a name="target_robolectric_binary">Target type `robolectric_binary`</a>:
 
@@ -371,7 +367,11 @@
 
 * `deps_info['final_dex']['path']`:
 Path to the final classes.dex file (or classes.zip in case of multi-dex)
-for this APK - only used for proguarded builds.
+for this APK.
+
+* `deps_info['final_dex']['all_dex_files']`:
+The list of paths to all `deps_info['dex_path']` entries for all libraries
+that comprise this APK. Valid only for debug builds.
 
 * `native['libraries']`
 List of native libraries for the primary ABI to be embedded in this APK.
@@ -929,86 +929,6 @@
   return 1 if dep.get('low_classpath_priority') else 0
 
 
-def _DedupFeatureModuleSharedCode(uses_split_arg, modules,
-                                  field_names_to_dedup):
-  child_to_ancestors = collections.defaultdict(list)
-  if uses_split_arg:
-    for split_pair in uses_split_arg:
-      child, parent = split_pair.split(':')
-      assert child in modules
-      assert parent in modules
-      child_to_ancestors[child] = [parent]
-
-  # Create a full list of ancestors for each module.
-  for name in modules:
-    if name == 'base':
-      continue
-    curr_name = name
-    while curr_name in child_to_ancestors:
-      parent = child_to_ancestors[curr_name][0]
-      if parent not in child_to_ancestors[name]:
-        child_to_ancestors[name].append(parent)
-      curr_name = parent
-
-    if curr_name != 'base':
-      child_to_ancestors[name].append('base')
-
-  # Strip out duplicates from ancestors.
-  for name, module in modules.items():
-    if name == 'base':
-      continue
-    # Make sure we get all ancestors, not just direct parent.
-    for ancestor in child_to_ancestors[name]:
-      for f in field_names_to_dedup:
-        if f in module:
-          RemoveObjDups(module, modules[ancestor], f)
-
-  # Strip out duplicates from siblings/cousins.
-  for f in field_names_to_dedup:
-    _PromoteToCommonAncestor(modules, child_to_ancestors, f)
-
-
-def _PromoteToCommonAncestor(modules, child_to_ancestors, field_name):
-  module_to_fields_set = {}
-  for module_name, module in modules.items():
-    if field_name in module:
-      module_to_fields_set[module_name] = set(module[field_name])
-
-  seen = set()
-  dupes = set()
-  for fields in module_to_fields_set.values():
-    new_dupes = seen & fields
-    if new_dupes:
-      dupes |= new_dupes
-    seen |= fields
-
-  for d in dupes:
-    owning_modules = []
-    for module_name, fields in module_to_fields_set.items():
-      if d in fields:
-        owning_modules.append(module_name)
-    assert len(owning_modules) >= 2
-    # Rely on the fact that ancestors are inserted from closest to
-    # farthest, where "base" should always be the last element.
-    # Arbitrarily using the first owning module - any would work.
-    for ancestor in child_to_ancestors[owning_modules[0]]:
-      ancestor_is_shared_with_all = True
-      for o in owning_modules[1:]:
-        if ancestor not in child_to_ancestors[o]:
-          ancestor_is_shared_with_all = False
-          break
-      if ancestor_is_shared_with_all:
-        common_ancestor = ancestor
-        break
-    for o in owning_modules:
-      module_to_fields_set[o].remove(d)
-    module_to_fields_set[common_ancestor].add(d)
-
-  for module_name, module in modules.items():
-    if field_name in module:
-      module[field_name] = sorted(list(module_to_fields_set[module_name]))
-
-
 def _CopyBuildConfigsForDebugging(debug_dir):
   shutil.rmtree(debug_dir, ignore_errors=True)
   os.makedirs(debug_dir)
@@ -1212,12 +1132,15 @@
   parser.add_option(
       '--base-allowlist-rtxt-path',
       help='Path to R.txt file for the base resources allowlist.')
+  parser.add_option(
+      '--is-base-module',
+      action='store_true',
+      help='Specifies that this module is a base module for some app bundle.')
 
   parser.add_option('--generate-markdown-format-doc', action='store_true',
                     help='Dump the Markdown .build_config format documentation '
                     'then exit immediately.')
 
-  parser.add_option('--module-name', help='The name of this feature module.')
   parser.add_option(
       '--base-module-build-config',
       help='Path to the base module\'s build config '
@@ -1227,11 +1150,6 @@
       '--module-build-configs',
       help='For bundles, the paths of all non-async module .build_configs '
       'for modules that are part of the bundle.')
-  parser.add_option(
-      '--uses-split',
-      action='append',
-      help='List of name pairs separated by : mapping a feature module to a '
-      'dependent feature module.')
 
   parser.add_option(
       '--trace-events-jar-dir',
@@ -1259,7 +1177,8 @@
   required_options_map = {
       'android_apk': ['build_config'] + lib_options + device_lib_options,
       'android_app_bundle_module':
-      ['build_config', 'res_size_info'] + lib_options + device_lib_options,
+      ['build_config', 'final_dex_path', 'res_size_info'] + lib_options +
+      device_lib_options,
       'android_assets': ['build_config'],
       'android_resources': ['build_config', 'resources_zip'],
       'dist_aar': ['build_config'],
@@ -1288,8 +1207,8 @@
     if options.base_allowlist_rtxt_path:
       raise Exception('--base-allowlist-rtxt-path can only be used with '
                       '--type=android_app_bundle_module')
-    if options.module_name:
-      raise Exception('--module-name can only be used with '
+    if options.is_base_module:
+      raise Exception('--is-base-module can only be used with '
                       '--type=android_app_bundle_module')
 
   is_apk_or_module_target = options.type in ('android_apk',
@@ -1407,7 +1326,7 @@
     gradle['apk_under_test'] = tested_apk_config['name']
 
   if options.type == 'android_app_bundle_module':
-    deps_info['module_name'] = options.module_name
+    deps_info['is_base_module'] = bool(options.is_base_module)
 
   # Required for generating gradle files.
   if options.type == 'java_library':
@@ -1788,12 +1707,9 @@
       deps_info['lint_android_manifest'] = options.android_manifest
 
   if options.type == 'android_app_bundle':
-    module_config_paths = build_utils.ParseGnList(options.module_build_configs)
-    module_configs = [GetDepConfig(c) for c in module_config_paths]
-    module_configs_by_name = {d['module_name']: d for d in module_configs}
-    per_module_fields = [
-        'device_classpath', 'trace_event_rewritten_device_classpath',
-        'all_dex_files'
+    module_configs = [
+        GetDepConfig(c)
+        for c in build_utils.ParseGnList(options.module_build_configs)
     ]
     jni_all_source = set()
     lint_aars = set()
@@ -1802,10 +1718,8 @@
     lint_resource_sources = set()
     lint_resource_zips = set()
     lint_extra_android_manifests = set()
-    config['modules'] = {}
-    modules = config['modules']
-    for n, c in module_configs_by_name.items():
-      if c['module_name'] == 'base':
+    for c in module_configs:
+      if c['is_base_module']:
         assert 'base_module_config' not in deps_info, (
             'Must have exactly 1 base module!')
         deps_info['package_name'] = c['package_name']
@@ -1820,10 +1734,6 @@
       lint_java_sources.update(c['lint_java_sources'])
       lint_resource_sources.update(c['lint_resource_sources'])
       lint_resource_zips.update(c['lint_resource_zips'])
-      module = modules[n] = {}
-      for f in per_module_fields:
-        if f in c:
-          module[f] = c[f]
     deps_info['jni'] = {'all_source': sorted(jni_all_source)}
     deps_info['lint_aars'] = sorted(lint_aars)
     deps_info['lint_srcjars'] = sorted(lint_srcjars)
@@ -1833,9 +1743,6 @@
     deps_info['lint_extra_android_manifests'] = sorted(
         lint_extra_android_manifests)
 
-    _DedupFeatureModuleSharedCode(options.uses_split, modules,
-                                  per_module_fields)
-
   if is_apk_or_module_target or options.type in ('group', 'java_library',
                                                  'robolectric_binary',
                                                  'dist_aar'):
@@ -1945,11 +1852,14 @@
     deps_info['proguard_classpath_jars'] = sorted(
         set(extra_proguard_classpath_jars))
 
-  if options.final_dex_path:
-    config['final_dex'] = {'path': options.final_dex_path}
+  # Dependencies for the final dex file of an apk.
+  if (is_apk_or_module_target or options.final_dex_path
+      or options.type == 'dist_jar'):
+    config['final_dex'] = {}
+    dex_config = config['final_dex']
+    dex_config['path'] = options.final_dex_path
   if is_apk_or_module_target or options.type == 'dist_jar':
-    # Dependencies for the final dex file of an apk.
-    deps_info['all_dex_files'] = all_dex_files
+    dex_config['all_dex_files'] = all_dex_files
 
   if is_java_target:
     config['javac']['classpath'] = sorted(javac_classpath)
@@ -2118,21 +2028,22 @@
     deps_info['java_resources_jar'] = options.java_resources_jar_path
 
   # DYNAMIC FEATURE MODULES:
-  # Make sure that dependencies that exist on the base module are not
-  # duplicated on the feature module. Note: this is only approximately correct,
-  # and doesn't take into account other parent modules. If we are able to read
-  # the build config of the whole bundle (instead of reading the individual
-  # modules'), we can use _DedupFeatureModuleSharedCode() and have the
-  # fully-deduplicated values.
+  # Make sure that dependencies that exist on the base module
+  # are not duplicated on the feature module.
   if base_module_build_config:
     base = base_module_build_config
     RemoveObjDups(config, base, 'deps_info', 'dependency_zips')
     RemoveObjDups(config, base, 'deps_info', 'dependency_zip_overlays')
     RemoveObjDups(config, base, 'deps_info', 'extra_package_names')
+    RemoveObjDups(config, base, 'deps_info', 'device_classpath')
     RemoveObjDups(config, base, 'deps_info', 'javac_full_classpath')
     RemoveObjDups(config, base, 'deps_info', 'javac_full_interface_classpath')
     RemoveObjDups(config, base, 'deps_info', 'jni', 'all_source')
+    RemoveObjDups(config, base, 'final_dex', 'all_dex_files')
     RemoveObjDups(config, base, 'extra_android_manifests')
+    if options.trace_events_jar_dir:
+      RemoveObjDups(config, base, 'deps_info',
+                    'trace_event_rewritten_device_classpath')
 
   if is_java_target:
     jar_to_target = {}
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 79b50b88..0fa567baa 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -419,6 +419,10 @@
       ]
     }
 
+    if (defined(invoker.is_base_module) && invoker.is_base_module) {
+      args += [ "--is-base-module" ]
+    }
+
     if (defined(invoker.loadable_modules)) {
       _rebased_loadable_modules =
           rebase_path(invoker.loadable_modules, root_build_dir)
@@ -543,19 +547,6 @@
         rebase_path(_base_module_build_config, root_build_dir),
       ]
     }
-    if (defined(invoker.module_name)) {
-      args += [
-        "--module-name",
-        invoker.module_name,
-      ]
-    }
-    if (defined(invoker.modules)) {
-      foreach(_module, invoker.modules) {
-        if (defined(_module.uses_split)) {
-          args += [ "--uses-split=${_module.name}:${_module.uses_split}" ]
-        }
-      }
-    }
     if (defined(invoker.module_build_configs)) {
       inputs += invoker.module_build_configs
       _rebased_configs =
@@ -1217,13 +1208,11 @@
           "--dex-dest=@FileArg($_rebased_module_build_config:final_dex:path)",
         ]
 
-        # The bundle's build config has the correct classpaths - the individual
-        # modules' build configs may double-use some jars.
         if (defined(invoker.add_view_trace_events) &&
             invoker.add_view_trace_events) {
-          _args += [ "--feature-jars=@FileArg($_rebased_build_config:modules:${_feature_module.name}:trace_event_rewritten_device_classpath)" ]
+          _args += [ "--feature-jars=@FileArg($_rebased_module_build_config:deps_info:trace_event_rewritten_device_classpath)" ]
         } else {
-          _args += [ "--feature-jars=@FileArg($_rebased_build_config:modules:${_feature_module.name}:device_classpath)" ]
+          _args += [ "--feature-jars=@FileArg($_rebased_module_build_config:deps_info:device_classpath)" ]
         }
 
         if (defined(_feature_module.uses_split)) {
@@ -3480,7 +3469,6 @@
                                "low_classpath_priority",
                                "main_class",
                                "mergeable_android_manifests",
-                               "module_name",
                                "proguard_configs",
                                "proguard_enabled",
                                "proguard_mapping_path",
@@ -3520,6 +3508,7 @@
                                [
                                  "add_view_trace_events",
                                  "base_module_target",
+                                 "is_base_module",
                                  "module_pathmap_path",
                                  "proto_resources_path",
                                  "version_name",
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index 9d53c7b..e548492f 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -1911,7 +1911,7 @@
       } else {
         _rebased_build_config = rebase_path(_build_config, root_build_dir)
         input_dex_filearg =
-            "@FileArg(${_rebased_build_config}:deps_info:all_dex_files)"
+            "@FileArg(${_rebased_build_config}:final_dex:all_dex_files)"
       }
     }
   }
@@ -2626,10 +2626,10 @@
 
     if (!_incremental_apk && !_omit_dex) {
       # Bundle modules don't build the dex here, but need to write this path
-      # to their .build_config.json file only when proguarding.
+      # to their .build_config.json file.
       if (_proguard_enabled) {
         _final_dex_path = "$_base_path.r8dex.jar"
-      } else if (!_is_bundle_module) {
+      } else {
         _final_dex_path = "$_base_path.mergeddex.jar"
       }
     }
@@ -2724,6 +2724,7 @@
                                "max_sdk_version",
                                "no_xml_namespaces",
                                "package_id",
+                               "package_name",
                                "png_to_webp",
                                "r_java_root_package_name",
                                "resource_exclusion_exceptions",
@@ -2748,10 +2749,6 @@
         resource_ids_provider_dep = _resource_ids_provider_dep
       }
 
-      if (defined(invoker.module_name)) {
-        package_name = invoker.module_name
-      }
-
       if (defined(invoker.post_process_package_resources_script)) {
         post_process_script = invoker.post_process_package_resources_script
       }
@@ -3041,11 +3038,7 @@
       if (_is_bundle_module) {
         type = "android_app_bundle_module"
         res_size_info_path = _res_size_info_path
-        if (defined(invoker.module_name)) {
-          module_name = invoker.module_name
-        } else {
-          module_name = "base"
-        }
+        is_base_module = _is_base_module
         forward_variables_from(invoker,
                                [
                                  "version_code",
@@ -3117,9 +3110,8 @@
       }
     }
 
-    if (_is_bundle_module || _omit_dex) {
-      # Dex generation for app bundle modules take place in the
-      # android_app_bundle template.
+    if ((_is_bundle_module && _proguard_enabled) || _omit_dex) {
+      # No library dep needed.
       not_needed(invoker, [ "custom_assertion_handler" ])
     } else if (_incremental_apk) {
       not_needed(invoker,
@@ -3128,6 +3120,8 @@
                    "custom_assertion_handler",
                  ])
     } else {
+      # Dex generation for app bundle modules with proguarding enabled takes
+      # place later due to synchronized proguarding.
       _final_dex_target_name = "${_template_name}__final_dex"
       dex(_final_dex_target_name) {
         forward_variables_from(invoker,
@@ -3156,7 +3150,7 @@
             # Enable dex merging only when min_sdk_version is >= what the library
             # .dex files were created with.
             input_dex_filearg =
-                "@FileArg(${_rebased_build_config}:deps_info:all_dex_files)"
+                "@FileArg(${_rebased_build_config}:final_dex:all_dex_files)"
 
             # Pure dex-merge.
             enable_desugar = false
@@ -3323,7 +3317,7 @@
         args = [
           "--apk-path=$_rebased_incremental_apk_path",
           "--output-path=$_rebased_incremental_install_json_path",
-          "--dex-file=@FileArg($_rebased_build_config:deps_info:all_dex_files)",
+          "--dex-file=@FileArg($_rebased_build_config:final_dex:all_dex_files)",
         ]
         if (_proguard_enabled) {
           args += [ "--show-proguard-warning" ]
@@ -3684,10 +3678,10 @@
                                "manual_jni_registration",
                                "max_sdk_version",
                                "min_sdk_version",
-                               "module_name",
                                "native_lib_placeholders",
                                "no_xml_namespaces",
                                "package_id",
+                               "package_name",
                                "png_to_webp",
                                "processor_args_javac",
                                "proguard_configs",
@@ -4961,7 +4955,6 @@
       build_config = _build_config
       proguard_enabled = _proguard_enabled
       module_build_configs = _module_build_configs
-      modules = _modules
 
       if (_proguard_enabled) {
         add_view_trace_events = _add_view_trace_events
@@ -4970,6 +4963,8 @@
     }
 
     if (_proguard_enabled) {
+      # If this Bundle uses a static library, the static library APK will
+      # create the synchronized dex file path.
       if (_add_view_trace_events) {
         _trace_event_rewriter_target =
             "//build/android/bytecode:trace_event_adder"
@@ -5040,33 +5035,14 @@
     _all_module_unused_resources_deps = []
     foreach(_module, _modules) {
       _module_target = _module.module_target
-      _module_target_name = get_label_info(_module_target, "name")
       _module_build_config = _module.build_config
       _module_build_config_target = _module.build_config_target
 
       if (!_proguard_enabled) {
-        _dex_target = "${_module_target_name}__final_dex"
-        _rebased_module_build_config =
-            rebase_path(_module_build_config, root_build_dir)
-        _dex_path = "$target_out_dir/$_module_target_name/$_module_target_name.mergeddex.jar"
-        dex(_dex_target) {
-          forward_variables_from(invoker,
-                                 [
-                                   "custom_assertion_handler",
-                                   "min_sdk_version",
-                                 ])
-          enable_multidex = _enable_multidex
-          output = _dex_path
-          build_config = _build_config
-
-          # This will be a pure dex-merge.
-          input_dex_filearg = "@FileArg($_rebased_build_config:modules:${_module.name}:all_dex_files)"
-          enable_desugar = false
-
-          deps = [ ":$_build_config_target" ]
-        }
+        _dex_target_for_module = "${_module_target}__final_dex"
+      } else {
+        _dex_target_for_module = ":$_dex_target"
       }
-      _dex_target_for_module = ":$_dex_target"
 
       # Generate one module .zip file per bundle module.
       #
@@ -5086,10 +5062,6 @@
         build_config = _module_build_config
         module_zip_path = _module_zip_path
         native_libraries_config = _native_libraries_config
-        if (!_proguard_enabled) {
-          dex_path = _dex_path
-          # dex_path is read from the build_config in the proguard case.
-        }
 
         if (module_name == "base" &&
             defined(invoker.expected_libs_and_assets)) {
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1
index d05849c..230006e 100644
--- a/build/fuchsia/linux_internal.sdk.sha1
+++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@
-11.20221229.1.1
+11.20221230.0.1
diff --git a/cc/paint/paint_op_buffer_unittest.cc b/cc/paint/paint_op_buffer_unittest.cc
index e06e7c08..bfb1bfdc 100644
--- a/cc/paint/paint_op_buffer_unittest.cc
+++ b/cc/paint/paint_op_buffer_unittest.cc
@@ -3305,6 +3305,37 @@
   }
 }
 
+TEST(PaintOpBufferTest, RecordPaintFilterDeserializationInvalidPaintOp) {
+  float rect_size = 0x8.765432p1;
+  PaintOpBuffer buffer;
+  buffer.push<ClipRectOp>(SkRect::MakeWH(rect_size, rect_size),
+                          SkClipOp::kDifference, true);
+  auto filter = sk_make_sp<RecordPaintFilter>(buffer.ReleaseAsRecord(),
+                                              SkRect::MakeWH(100, 100));
+
+  TestOptionsProvider options_provider;
+  std::vector<uint8_t> memory(kDefaultBufferSize);
+  PaintOpWriter writer(memory.data(), memory.size(),
+                       options_provider.serialize_options(), false);
+  writer.Write(filter.get(), SkM44());
+  ASSERT_GT(writer.size(), sizeof(float));
+
+  // Replace the first occurrence of rect_size with NaN to make the ClipRectOp
+  // invalid.
+  for (size_t i = 0; i < writer.size(); i += sizeof(float)) {
+    float* f = reinterpret_cast<float*>(memory.data() + i);
+    if (*f == rect_size) {
+      *f = std::numeric_limits<float>::quiet_NaN();
+      break;
+    }
+  }
+  sk_sp<PaintFilter> deserialized_filter;
+  PaintOpReader reader(memory.data(), writer.size(),
+                       options_provider.deserialize_options(), false);
+  reader.Read(&deserialized_filter);
+  EXPECT_FALSE(deserialized_filter);
+}
+
 TEST(PaintOpBufferTest, PaintRecordShaderSerialization) {
   auto memory = AllocateDefaultBuffer();
   PaintOpBuffer shader_buffer;
diff --git a/cc/paint/paint_op_reader.cc b/cc/paint/paint_op_reader.cc
index 09706bf..eb48ca6 100644
--- a/cc/paint/paint_op_reader.cc
+++ b/cc/paint/paint_op_reader.cc
@@ -1384,12 +1384,13 @@
   if (!valid_)
     return 0;
 
-  *record = PaintOpBuffer::MakeFromMemory(memory_, size_bytes, *options_)
-                ->ReleaseAsRecord();
-  if (!*record) {
+  sk_sp<PaintOpBuffer> buffer =
+      PaintOpBuffer::MakeFromMemory(memory_, size_bytes, *options_);
+  if (!buffer) {
     SetInvalid(DeserializationError::kPaintOpBufferMakeFromMemoryFailure);
     return 0;
   }
+  *record = buffer->ReleaseAsRecord();
   DidRead(size_bytes);
   return size_bytes;
 }
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn
index 2ef38ef..e08a382 100644
--- a/chrome/BUILD.gn
+++ b/chrome/BUILD.gn
@@ -411,7 +411,7 @@
       "//components/policy:generated",
       "//content/public/app",
       "//crypto",
-      "//headless:headless_renderer",
+      "//headless:headless_non_renderer",
       "//headless:headless_shell_browser_lib",
       "//net:net_resources",
       "//ppapi/buildflags",
diff --git a/chrome/VERSION b/chrome/VERSION
index 9afdb81..d9db1e2 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=111
 MINOR=0
-BUILD=5508
+BUILD=5509
 PATCH=0
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java
index e5ecdc07..b204cf8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java
@@ -514,7 +514,7 @@
                 intent, EXTRA_ENABLE_BACKGROUND_INTERACTION, BACKGROUND_INTERACT_DEFAULT);
         mInteractWithBackground = backgroundInteractBehavior != BACKGROUND_INTERACT_OFF;
 
-        logCustomTabFeatures(intent, colorScheme);
+        logCustomTabFeatures(intent, colorScheme, usingDynamicFeatures);
     }
 
     /** Returns the toolbar corner radius in px. */
@@ -740,8 +740,11 @@
      * usage by apps.
      * @param intent The intent used to launch the CCT.
      * @param colorScheme The requested color scheme to use with the CCT.
+     * @param isUsingDynamicFeatures Whether the intent specified Features to dynamically enable or
+     *                               disable.
      */
-    private void logCustomTabFeatures(Intent intent, int colorScheme) {
+    private void logCustomTabFeatures(
+            Intent intent, int colorScheme, boolean isUsingDynamicFeatures) {
         if (!CustomTabsFeatureUsage.isEnabled()) return;
         CustomTabsFeatureUsage featureUsage = new CustomTabsFeatureUsage();
 
@@ -845,6 +848,9 @@
             featureUsage.log(CustomTabsFeature.EXTRA_ADDITIONAL_TRUSTED_ORIGINS);
         }
         if (mEnableUrlBarHiding) featureUsage.log(CustomTabsFeature.EXTRA_ENABLE_URLBAR_HIDING);
+        if (isUsingDynamicFeatures) {
+            featureUsage.log(CustomTabsFeature.EXTRA_INTENT_FEATURE_OVERRIDES);
+        }
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsFeatureUsage.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsFeatureUsage.java
index 2349e5a0..1a136d9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsFeatureUsage.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsFeatureUsage.java
@@ -45,7 +45,8 @@
             CustomTabsFeature.EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY,
             CustomTabsFeature.EXTRA_ADDITIONAL_TRUSTED_ORIGINS,
             CustomTabsFeature.EXTRA_ENABLE_URLBAR_HIDING,
-            CustomTabsFeature.EXTRA_AUTO_TRANSLATE_LANGUAGE, CustomTabsFeature.COUNT})
+            CustomTabsFeature.EXTRA_AUTO_TRANSLATE_LANGUAGE,
+            CustomTabsFeature.EXTRA_INTENT_FEATURE_OVERRIDES, CustomTabsFeature.COUNT})
     @Retention(RetentionPolicy.SOURCE)
     public @interface CustomTabsFeature {
         /** Special enum for the start of a session. */
@@ -92,9 +93,10 @@
         int EXTRA_ADDITIONAL_TRUSTED_ORIGINS = 40;
         int EXTRA_ENABLE_URLBAR_HIDING = 41;
         int EXTRA_AUTO_TRANSLATE_LANGUAGE = 42;
+        int EXTRA_INTENT_FEATURE_OVERRIDES = 43;
 
         /** Total count of entries. */
-        int COUNT = 43;
+        int COUNT = 44;
     }
 
     // Whether flag-enabled or not.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java
index 36e4964..a340a3b9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java
@@ -5,6 +5,7 @@
 
 import android.content.Context;
 import android.content.res.Resources;
+import android.os.Build;
 
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
@@ -58,6 +59,7 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.HashSet;
+import java.util.Locale;
 
 /**
  * Utilities for requesting desktop sites support.
@@ -70,6 +72,8 @@
     static final double DEFAULT_GLOBAL_SETTING_DEFAULT_ON_DISPLAY_SIZE_THRESHOLD_INCHES = 12.0;
     static final String PARAM_GLOBAL_SETTING_DEFAULT_ON_ON_LOW_END_DEVICES =
             "default_on_on_low_end_devices";
+    static final String PARAM_GLOBAL_SETTING_DEFAULT_ON_ON_X86_DEVICES =
+            "default_on_on_x86_devices";
     static final String PARAM_GLOBAL_SETTING_DEFAULT_ON_SMALLEST_SCREEN_WIDTH =
             "default_on_smallest_screen_width";
     static final int DEFAULT_GLOBAL_SETTING_DEFAULT_ON_SMALLEST_SCREEN_WIDTH_THRESHOLD_DP = 600;
@@ -86,6 +90,7 @@
             "opt_in_display_size_max_threshold_inches";
     static final double DEFAULT_GLOBAL_SETTING_OPT_IN_DISPLAY_SIZE_MAX_THRESHOLD_INCHES =
             Double.MAX_VALUE;
+    static final String PARAM_GLOBAL_SETTING_OPT_IN_ON_X86_DEVICES = "opt_in_on_x86_devices";
     static final String PARAM_GLOBAL_SETTING_OPT_IN_SMALLEST_SCREEN_WIDTH =
             "opt_in_smallest_screen_width";
     static final int DEFAULT_GLOBAL_SETTING_OPT_IN_SMALLEST_SCREEN_WIDTH_THRESHOLD_DP = 600;
@@ -358,6 +363,13 @@
             return false;
         }
 
+        // Check whether default-on for x86 devices is disabled.
+        if (!ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean(
+                    feature, PARAM_GLOBAL_SETTING_DEFAULT_ON_ON_X86_DEVICES, true)
+                && !isCpuArchitectureArm()) {
+            return false;
+        }
+
         // If the smallest screen size in dp is below threshold, avoid default-enabling the setting.
         if (context.getResources().getConfiguration().smallestScreenWidthDp
                 < ChromeFeatureList.getFieldTrialParamByFeatureAsInt(feature,
@@ -574,6 +586,13 @@
             return false;
         }
 
+        // Check whether opt-in for x86 devices is disabled.
+        if (!ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean(
+                    feature, PARAM_GLOBAL_SETTING_OPT_IN_ON_X86_DEVICES, true)
+                && !isCpuArchitectureArm()) {
+            return false;
+        }
+
         // If the smallest screen size in dp is below threshold, avoid presenting the message.
         if (context.getResources().getConfiguration().smallestScreenWidthDp
                 < ChromeFeatureList.getFieldTrialParamByFeatureAsInt(feature,
@@ -804,4 +823,15 @@
                         ChromePreferenceKeys.DESKTOP_SITE_EXCEPTIONS_DOWNGRADE_TAB_SETTING_SET)
                 .contains(String.valueOf(tabId));
     }
+
+    /**
+     * Check if the CPU architecture is ARM.
+     */
+    private static boolean isCpuArchitectureArm() {
+        String[] abiStrings = Build.SUPPORTED_ABIS;
+        if (abiStrings == null || abiStrings.length == 0) {
+            return false;
+        }
+        return abiStrings[0].toLowerCase(Locale.ROOT).contains("arm");
+    }
 }
\ No newline at end of file
diff --git a/chrome/android/modules/chrome_feature_module_tmpl.gni b/chrome/android/modules/chrome_feature_module_tmpl.gni
index 8ea32c9..4ac6f48 100644
--- a/chrome/android/modules/chrome_feature_module_tmpl.gni
+++ b/chrome/android/modules/chrome_feature_module_tmpl.gni
@@ -116,7 +116,7 @@
     # Don't embed more translations than required (http://crbug.com/932017).
     aapt_locale_allowlist = platform_pak_locales
     proguard_enabled = !is_java_debug
-    module_name = _module_desc.name
+    package_name = _module_desc.name
 
     # Determine whether to assign native libraries to the primary or secondary
     # ABI.
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm
index ae3083a..9a82eef 100644
--- a/chrome/browser/app_controller_mac.mm
+++ b/chrome/browser/app_controller_mac.mm
@@ -164,10 +164,13 @@
 // not possible. If the last active browser is minimized (in particular, if
 // there are only minimized windows), it will unminimize it.
 Browser* ActivateBrowser(Profile* profile) {
-  Browser* browser = chrome::FindLastActiveWithProfile(
-      profile->IsGuestSession()
-          ? profile->GetPrimaryOTRProfile(/*create_if_needed=*/true)
-          : profile);
+  Browser* browser =
+      chrome::FindLastActiveWithProfile(
+          profile->IsGuestSession()
+              ? profile->GetPrimaryOTRProfile(/*create_if_needed=*/true)
+              : profile)
+          ->GetBrowserForOpeningWebUi();
+
   if (browser)
     browser->window()->Activate();
   return browser;
diff --git a/chrome/browser/ash/arc/policy/arc_policy_bridge.cc b/chrome/browser/ash/arc/policy/arc_policy_bridge.cc
index 453bd7a..1bd7b33b 100644
--- a/chrome/browser/ash/arc/policy/arc_policy_bridge.cc
+++ b/chrome/browser/ash/arc/policy/arc_policy_bridge.cc
@@ -170,7 +170,7 @@
     }
   }
 
-  base::Value ca_certs(base::Value::Type::LIST);
+  base::Value::List ca_certs;
   for (const auto& certificate : certificates) {
     if (!certificate.is_dict()) {
       DLOG(FATAL) << "Value of a certificate entry is not a dictionary "
@@ -178,18 +178,19 @@
       continue;
     }
 
+    const base::Value::Dict& cert_dict = certificate.GetDict();
     const std::string* const cert_type =
-        certificate.FindStringKey(::onc::certificate::kType);
+        cert_dict.FindString(::onc::certificate::kType);
     if (!cert_type || *cert_type != ::onc::certificate::kAuthority)
       continue;
 
-    const base::Value* const trust_list =
-        certificate.FindListKey(::onc::certificate::kTrustBits);
+    const base::Value::List* const trust_list =
+        cert_dict.FindList(::onc::certificate::kTrustBits);
     if (!trust_list)
       continue;
 
     bool web_trust_flag = false;
-    for (const auto& list_val : trust_list->GetList()) {
+    for (const auto& list_val : *trust_list) {
       if (!list_val.is_string())
         NOTREACHED();
 
@@ -204,16 +205,17 @@
       continue;
 
     const std::string* const x509_data =
-        certificate.FindStringKey(::onc::certificate::kX509);
+        cert_dict.FindString(::onc::certificate::kX509);
     if (!x509_data)
       continue;
 
-    base::Value data(base::Value::Type::DICTIONARY);
-    data.SetStringKey("X509", *x509_data);
+    base::Value::Dict data;
+    data.Set("X509", *x509_data);
     ca_certs.Append(std::move(data));
   }
-  if (!ca_certs.GetList().empty())
+  if (!ca_certs.empty()) {
     filtered_policies->Set("credentialsConfigDisabled", base::Value(true));
+  }
   filtered_policies->Set(kArcCaCerts, std::move(ca_certs));
 }
 
@@ -221,10 +223,10 @@
                          base::Value::Dict* filtered_policies) {
   if (!cert_store_service)
     return;
-  base::Value cert_names(base::Value::Type::LIST);
+  base::Value::List cert_names;
   for (const auto& name : cert_store_service->get_required_cert_names()) {
-    base::Value value(base::Value::Type::DICTIONARY);
-    value.SetStringKey("alias", name);
+    base::Value::Dict value;
+    value.Set("alias", name);
     cert_names.Append(std::move(value));
   }
   filtered_policies->Set(kArcRequiredKeyPairs, std::move(cert_names));
@@ -243,21 +245,21 @@
 
   auto app_ids = chromeos::platform_keys::ExtensionKeyPermissionsService::
       GetCorporateKeyUsageAllowedAppIds(policy_service);
-  base::Value arc_app_ids(base::Value::Type::LIST);
+  base::Value::List arc_app_ids;
   for (const auto& app_id : app_ids) {
     if (LooksLikeAndroidPackageName(app_id))
       arc_app_ids.Append(app_id);
   }
-  if (arc_app_ids.GetList().empty() ||
+  if (arc_app_ids.empty() ||
       cert_store_service->get_required_cert_names().empty()) {
     return;
   }
 
-  base::Value rules(base::Value::Type::LIST);
+  base::Value::List rules;
   for (const auto& name : cert_store_service->get_required_cert_names()) {
-    base::Value value(base::Value::Type::DICTIONARY);
-    value.SetStringKey("privateKeyAlias", name);
-    value.SetKey("packageNames", arc_app_ids.Clone());
+    base::Value::Dict value;
+    value.Set("privateKeyAlias", name);
+    value.Set("packageNames", arc_app_ids.Clone());
     rules.Append(std::move(value));
   }
 
diff --git a/chrome/browser/ash/arc/policy/arc_policy_bridge_unittest.cc b/chrome/browser/ash/arc/policy/arc_policy_bridge_unittest.cc
index de9e99c..54756b12 100644
--- a/chrome/browser/ash/arc/policy/arc_policy_bridge_unittest.cc
+++ b/chrome/browser/ash/arc/policy/arc_policy_bridge_unittest.cc
@@ -115,12 +115,12 @@
 constexpr char kChromeAppId[] = "chromeappid";
 constexpr char kAndroidAppId[] = "android.app.id";
 
-void AddKeyPermissionForAppId(base::Value* key_permissions,
+void AddKeyPermissionForAppId(base::Value::Dict& key_permissions,
                               const std::string& app_id,
                               bool allowed) {
-  base::Value cert_key_permission(base::Value::Type::DICTIONARY);
-  cert_key_permission.SetKey("allowCorporateKeyUsage", base::Value(allowed));
-  key_permissions->SetKey(app_id, std::move(cert_key_permission));
+  base::Value::Dict cert_key_permission;
+  cert_key_permission.Set("allowCorporateKeyUsage", base::Value(allowed));
+  key_permissions.Set(app_id, std::move(cert_key_permission));
 }
 
 MATCHER_P(ValueEquals, expected, "value matches") {
@@ -896,13 +896,13 @@
   // One certificate is required to be installed.
   cert_store_service()->set_required_cert_names_for_testing({kFakeCertName});
 
-  base::Value key_permissions(base::Value::Type::DICTIONARY);
-  AddKeyPermissionForAppId(&key_permissions, kAndroidAppId, true /* allowed */);
-  AddKeyPermissionForAppId(&key_permissions, kChromeAppId, true /* allowed */);
+  base::Value::Dict key_permissions;
+  AddKeyPermissionForAppId(key_permissions, kAndroidAppId, true /* allowed */);
+  AddKeyPermissionForAppId(key_permissions, kChromeAppId, true /* allowed */);
 
   policy_map().Set(policy::key::kKeyPermissions, policy::POLICY_LEVEL_MANDATORY,
                    policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
-                   std::move(key_permissions),
+                   base::Value(std::move(key_permissions)),
                    /* external_data_fetcher */ nullptr);
   GetPoliciesAndVerifyResult(base::StrCat(
       {"{\"apkCacheEnabled\":true,",
@@ -917,17 +917,16 @@
 // Tests that if cert store service is non-null, corporate usage key exists and
 // not to any ARC apps, ChoosePrivateKeyRules policy is not set.
 TEST_F(ArcPolicyBridgeCertStoreTest, KeyPermissionsEmptyTest) {
-  base::Value key_permissions(base::Value::Type::DICTIONARY);
-  AddKeyPermissionForAppId(&key_permissions, kAndroidAppId,
-                           false /* allowed */);
-  AddKeyPermissionForAppId(&key_permissions, kChromeAppId, true /* allowed */);
+  base::Value::Dict key_permissions;
+  AddKeyPermissionForAppId(key_permissions, kAndroidAppId, false /* allowed */);
+  AddKeyPermissionForAppId(key_permissions, kChromeAppId, true /* allowed */);
 
   // One certificate is required to be installed.
   cert_store_service()->set_required_cert_names_for_testing({kFakeCertName});
 
   policy_map().Set(policy::key::kKeyPermissions, policy::POLICY_LEVEL_MANDATORY,
                    policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
-                   std::move(key_permissions),
+                   base::Value(std::move(key_permissions)),
                    /* external_data_fetcher */ nullptr);
   GetPoliciesAndVerifyResult(base::StrCat(
       {"{\"apkCacheEnabled\":true,\"guid\":\"", instance_guid(), "\",",
@@ -939,15 +938,15 @@
 // exist, but in theory are available to ARC apps, ChoosePrivateKeyRules policy
 // is not set.
 TEST_F(ArcPolicyBridgeCertStoreTest, KeyPermissionsNoCertsTest) {
-  base::Value key_permissions(base::Value::Type::DICTIONARY);
-  AddKeyPermissionForAppId(&key_permissions, kAndroidAppId, true /* allowed */);
-  AddKeyPermissionForAppId(&key_permissions, kChromeAppId, true /* allowed */);
+  base::Value::Dict key_permissions;
+  AddKeyPermissionForAppId(key_permissions, kAndroidAppId, true /* allowed */);
+  AddKeyPermissionForAppId(key_permissions, kChromeAppId, true /* allowed */);
 
   cert_store_service()->set_required_cert_names_for_testing({});
 
   policy_map().Set(policy::key::kKeyPermissions, policy::POLICY_LEVEL_MANDATORY,
                    policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
-                   std::move(key_permissions),
+                   base::Value(std::move(key_permissions)),
                    /* external_data_fetcher */ nullptr);
   GetPoliciesAndVerifyResult(
       base::StrCat({"{\"apkCacheEnabled\":true,\"guid\":\"", instance_guid(),
diff --git a/chrome/browser/ash/arc/policy/managed_configuration_variables_unittest.cc b/chrome/browser/ash/arc/policy/managed_configuration_variables_unittest.cc
index 58fc599..2fa6ec1 100644
--- a/chrome/browser/ash/arc/policy/managed_configuration_variables_unittest.cc
+++ b/chrome/browser/ash/arc/policy/managed_configuration_variables_unittest.cc
@@ -50,14 +50,15 @@
 
 Parameter SampleWithoutVariables(bool is_affiliated) {
   // Set up an |input| Value without variables.
-  base::Value input(base::Value::Type::DICTIONARY);
-  input.SetStringKey(kKey1, "value1");
-  input.SetStringKey(kKey2, "value2");
+  base::Value::Dict input;
+  input.Set(kKey1, "value1");
+  input.Set(kKey2, "value2");
 
   // Expected |output| is the same as the input.
-  base::Value output = input.Clone();
+  base::Value::Dict output = input.Clone();
 
-  return std::make_pair(std::move(input), std::move(output));
+  return std::make_pair(base::Value(std::move(input)),
+                        base::Value(std::move(output)));
 }
 
 Parameter SampleWithVariables(bool is_affiliated) {
@@ -85,30 +86,30 @@
       base::StringPrintf("${%s}", kDeviceAnnotatedLocation);
 
   // Set up an |input| Value with some variables.
-  base::Value input(base::Value::Type::DICTIONARY);
-  input.SetStringKey(kUserEmailKey, kUserEmailVariable);
-  input.SetStringKey(kUserNameKey, kUserEmailNameVariable);
-  input.SetStringKey(kUserDomainKey, kUserEmailDomainVariable);
-  input.SetStringKey(kDeviceSerialNumberKey, kDeviceSerialNumberVariable);
-  input.SetStringKey(kDeviceDirectoryIdKey, kDeviceDirectoryIdVariable);
-  input.SetStringKey(kDeviceAssetIdKey, kDeviceAssetIdVariable);
-  input.SetStringKey(kDeviceLocationKey, kDeviceAnnotatedLocationVariable);
+  base::Value::Dict input;
+  input.Set(kUserEmailKey, kUserEmailVariable);
+  input.Set(kUserNameKey, kUserEmailNameVariable);
+  input.Set(kUserDomainKey, kUserEmailDomainVariable);
+  input.Set(kDeviceSerialNumberKey, kDeviceSerialNumberVariable);
+  input.Set(kDeviceDirectoryIdKey, kDeviceDirectoryIdVariable);
+  input.Set(kDeviceAssetIdKey, kDeviceAssetIdVariable);
+  input.Set(kDeviceLocationKey, kDeviceAnnotatedLocationVariable);
 
   // Set up an |output| Value where variables have been replaced.
-  base::Value output(base::Value::Type::DICTIONARY);
-  output.SetStringKey(kUserEmailKey, kTestEmail);
-  output.SetStringKey(kUserNameKey, kTestEmailName);
-  output.SetStringKey(kUserDomainKey, kTestEmailDomain);
-  output.SetStringKey(kDeviceSerialNumberKey,
-                      is_affiliated ? kTestDeviceSerialNumber : "");
-  output.SetStringKey(kDeviceDirectoryIdKey,
-                      is_affiliated ? kTestDeviceDirectoryId : "");
-  output.SetStringKey(kDeviceAssetIdKey,
-                      is_affiliated ? kTestDeviceAssetId : "");
-  output.SetStringKey(kDeviceLocationKey,
-                      is_affiliated ? kTestDeviceAnnotatedLocation : "");
+  base::Value::Dict output;
+  output.Set(kUserEmailKey, kTestEmail);
+  output.Set(kUserNameKey, kTestEmailName);
+  output.Set(kUserDomainKey, kTestEmailDomain);
+  output.Set(kDeviceSerialNumberKey,
+             is_affiliated ? kTestDeviceSerialNumber : "");
+  output.Set(kDeviceDirectoryIdKey,
+             is_affiliated ? kTestDeviceDirectoryId : "");
+  output.Set(kDeviceAssetIdKey, is_affiliated ? kTestDeviceAssetId : "");
+  output.Set(kDeviceLocationKey,
+             is_affiliated ? kTestDeviceAnnotatedLocation : "");
 
-  return std::make_pair(std::move(input), std::move(output));
+  return std::make_pair(base::Value(std::move(input)),
+                        base::Value(std::move(output)));
 }
 
 Parameter SampleWithNestedVariables(bool is_affiliated) {
@@ -130,26 +131,27 @@
       base::StringPrintf(kVariablePattern, kDeviceSerialNumber);
 
   // Set up an |input| Value with variables in nested values.
-  base::Value nestedInput2(base::Value::Type::DICTIONARY);
-  nestedInput2.SetStringKey(kEmailKey, kUserEmailVariable);
-  nestedInput2.SetStringKey(kKey2, kValue2);
-  nestedInput2.SetStringKey(kSerialNumberKey, kDeviceSerialNumberVariable);
-  base::Value nestedInput1(base::Value::Type::DICTIONARY);
-  nestedInput1.SetKey(kSubSubKey, std::move(nestedInput2));
-  nestedInput1.SetStringKey(kKey1, kValue1);
-  base::Value input(base::Value::Type::DICTIONARY);
-  input.SetStringKey(kKey0, kValue0);
-  input.SetKey(kSubKey, std::move(nestedInput1));
-  input.SetStringKey(kNameKey, kTestEmailName);
+  base::Value::Dict nestedInput2;
+  nestedInput2.Set(kEmailKey, kUserEmailVariable);
+  nestedInput2.Set(kKey2, kValue2);
+  nestedInput2.Set(kSerialNumberKey, kDeviceSerialNumberVariable);
+  base::Value::Dict nestedInput1;
+  nestedInput1.Set(kSubSubKey, std::move(nestedInput2));
+  nestedInput1.Set(kKey1, kValue1);
+  base::Value::Dict input;
+  input.Set(kKey0, kValue0);
+  input.Set(kSubKey, std::move(nestedInput1));
+  input.Set(kNameKey, kTestEmailName);
 
   // |output| is the same as |input| except the variables have been replaced.
-  base::Value output = input.Clone();
-  output.SetStringKey(kNameKey, kTestEmailName);
-  output.SetStringPath(kNestedEmailKey, kTestEmail);
-  output.SetStringPath(kNestedSerialNumberKey,
-                       is_affiliated ? kTestDeviceSerialNumber : "");
+  base::Value::Dict output = input.Clone();
+  output.Set(kNameKey, kTestEmailName);
+  output.SetByDottedPath(kNestedEmailKey, kTestEmail);
+  output.SetByDottedPath(kNestedSerialNumberKey,
+                         is_affiliated ? kTestDeviceSerialNumber : "");
 
-  return std::make_pair(std::move(input), std::move(output));
+  return std::make_pair(base::Value(std::move(input)),
+                        base::Value(std::move(output)));
 }
 
 Parameter SampleWithVariableChains(bool is_affiliated) {
@@ -177,18 +179,19 @@
       kChainReplacedPattern, is_affiliated ? kTestDeviceAnnotatedLocation : "");
 
   // Set up an |input| Value with some variable chains.
-  base::Value input(base::Value::Type::DICTIONARY);
-  input.SetStringKey(kChain1, kChainVariable1);
-  input.SetStringKey(kChain2, kChainVariable2);
-  input.SetStringKey(kChain3, kChainVariable3);
+  base::Value::Dict input;
+  input.Set(kChain1, kChainVariable1);
+  input.Set(kChain2, kChainVariable2);
+  input.Set(kChain3, kChainVariable3);
 
   // Set up an |output| Value where variables have been replaced.
-  base::Value output(base::Value::Type::DICTIONARY);
-  output.SetStringKey(kChain1, kReplacedChain1);
-  output.SetStringKey(kChain2, kReplacedChain2);
-  output.SetStringKey(kChain3, kReplacedChain3);
+  base::Value::Dict output;
+  output.Set(kChain1, kReplacedChain1);
+  output.Set(kChain2, kReplacedChain2);
+  output.Set(kChain3, kReplacedChain3);
 
-  return std::make_pair(std::move(input), std::move(output));
+  return std::make_pair(base::Value(std::move(input)),
+                        base::Value(std::move(output)));
 }
 
 }  // namespace
@@ -295,35 +298,35 @@
   const std::string kChain =
       base::StringPrintf("${%s:%s:%s}", kDeviceAnnotatedLocation,
                          kDeviceAssetId, kDeviceDirectoryId);
-  base::Value dict(base::Value::Type::DICTIONARY);
-  dict.SetStringKey(kKey, kChain);
+  base::Value dict(base::Value::Type::DICT);
+  dict.GetDict().Set(kKey, kChain);
 
   // Initially all values in the chain are set, expect annotated location will
   // be returned.
   RecursivelyReplaceManagedConfigurationVariables(profile(),
                                                   device_attributes(), &dict);
-  EXPECT_EQ(*dict.FindStringKey(kKey), kTestDeviceAnnotatedLocation);
+  EXPECT_EQ(*dict.GetDict().FindString(kKey), kTestDeviceAnnotatedLocation);
 
   // Clear location and expect chain resolves to asset ID.
   device_attributes()->SetFakeDeviceAnnotatedLocation("");
-  dict.SetStringKey(kKey, kChain);
+  dict.GetDict().Set(kKey, kChain);
   RecursivelyReplaceManagedConfigurationVariables(profile(),
                                                   device_attributes(), &dict);
-  EXPECT_EQ(*dict.FindStringKey(kKey), kTestDeviceAssetId);
+  EXPECT_EQ(*dict.GetDict().FindString(kKey), kTestDeviceAssetId);
 
   // Clear asset ID and expect chain resolves to directory ID.
   device_attributes()->SetFakeDeviceAssetId("");
-  dict.SetStringKey(kKey, kChain);
+  dict.GetDict().Set(kKey, kChain);
   RecursivelyReplaceManagedConfigurationVariables(profile(),
                                                   device_attributes(), &dict);
-  EXPECT_EQ(*dict.FindStringKey(kKey), kTestDeviceDirectoryId);
+  EXPECT_EQ(*dict.GetDict().FindString(kKey), kTestDeviceDirectoryId);
 
   // Clear directory ID and expect chain resolves to the empty string.
   device_attributes()->SetFakeDirectoryApiId("");
-  dict.SetStringKey(kKey, kChain);
+  dict.GetDict().Set(kKey, kChain);
   RecursivelyReplaceManagedConfigurationVariables(profile(),
                                                   device_attributes(), &dict);
-  EXPECT_EQ(*dict.FindStringKey(kKey), "");
+  EXPECT_EQ(*dict.GetDict().FindString(kKey), "");
 }
 
 TEST_F(ManagedConfigurationVariablesTest, IgnoresInvalidVariables) {
@@ -344,22 +347,22 @@
   const std::string kInvalidChain3 = base::StringPrintf(
       "${%s:DEVICE_ASsEt_ID:%s}", kDeviceAnnotatedLocation, kDeviceAssetId);
 
-  base::Value dict(base::Value::Type::DICTIONARY);
-  dict.SetStringKey(kValidKey, kValidChain);
-  dict.SetStringKey(kInvalidKey1, kInvalidChain1);
-  dict.SetStringKey(kInvalidKey2, kInvalidChain2);
-  dict.SetStringKey(kInvalidKey3, kInvalidChain3);
+  base::Value dict(base::Value::Type::DICT);
+  dict.GetDict().Set(kValidKey, kValidChain);
+  dict.GetDict().Set(kInvalidKey1, kInvalidChain1);
+  dict.GetDict().Set(kInvalidKey2, kInvalidChain2);
+  dict.GetDict().Set(kInvalidKey3, kInvalidChain3);
 
   // Clear location, valid chain should resolve to asset ID.
   device_attributes()->SetFakeDeviceAnnotatedLocation("");
   RecursivelyReplaceManagedConfigurationVariables(profile(),
                                                   device_attributes(), &dict);
   // Expect the valid chain was replaced.
-  EXPECT_EQ(*dict.FindStringKey(kValidKey), kTestDeviceAssetId);
+  EXPECT_EQ(*dict.GetDict().FindString(kValidKey), kTestDeviceAssetId);
   // Expect none of the invalid chains were replaced.
-  EXPECT_EQ(*dict.FindStringKey(kInvalidKey1), kInvalidChain1);
-  EXPECT_EQ(*dict.FindStringKey(kInvalidKey2), kInvalidChain2);
-  EXPECT_EQ(*dict.FindStringKey(kInvalidKey3), kInvalidChain3);
+  EXPECT_EQ(*dict.GetDict().FindString(kInvalidKey1), kInvalidChain1);
+  EXPECT_EQ(*dict.GetDict().FindString(kInvalidKey2), kInvalidChain2);
+  EXPECT_EQ(*dict.GetDict().FindString(kInvalidKey3), kInvalidChain3);
 }
 
 TEST_F(ManagedConfigurationVariablesTest, RespectsSpecialCharacters) {
@@ -367,8 +370,8 @@
   const std::string kVariable =
       base::StringPrintf(kVariablePattern, kDeviceAssetId);
 
-  base::Value dict(base::Value::Type::DICTIONARY);
-  dict.SetStringKey(kKey1, kVariable);
+  base::Value dict(base::Value::Type::DICT);
+  dict.GetDict().Set(kKey1, kVariable);
 
   // Setup a fake asset ID using special characters.
   constexpr char kSpecialCharacters[] =
@@ -377,7 +380,7 @@
   RecursivelyReplaceManagedConfigurationVariables(profile(),
                                                   device_attributes(), &dict);
   // Expect special characters were replaced correctly.
-  EXPECT_EQ(*dict.FindStringKey(kKey1), kSpecialCharacters);
+  EXPECT_EQ(*dict.GetDict().FindString(kKey1), kSpecialCharacters);
 }
 
 TEST_F(ManagedConfigurationVariablesTest, RecursiveValuesAreReplacedCorrectly) {
@@ -387,9 +390,9 @@
   const std::string kVariable2 =
       base::StringPrintf(kVariablePattern, kDeviceAnnotatedLocation);
 
-  base::Value dict(base::Value::Type::DICTIONARY);
-  dict.SetStringKey(kKey1, kVariable1);
-  dict.SetStringKey(kKey2, kVariable2);
+  base::Value dict(base::Value::Type::DICT);
+  dict.GetDict().Set(kKey1, kVariable1);
+  dict.GetDict().Set(kKey2, kVariable2);
 
   // Setup fake asset ID and location that are also valid variables.
   device_attributes()->SetFakeDeviceAssetId(kVariable2);
@@ -397,8 +400,8 @@
   RecursivelyReplaceManagedConfigurationVariables(profile(),
                                                   device_attributes(), &dict);
   // Expect variables are replaced only once without an infinite loop.
-  EXPECT_EQ(*dict.FindStringKey(kKey1), kVariable2);
-  EXPECT_EQ(*dict.FindStringKey(kKey2), kVariable1);
+  EXPECT_EQ(*dict.GetDict().FindString(kKey1), kVariable2);
+  EXPECT_EQ(*dict.GetDict().FindString(kKey2), kVariable1);
 }
 
 TEST_P(ManagedConfigurationVariablesAffiliatedTest, ReplacesVariables) {
diff --git a/chrome/browser/ash/crosapi/browser_manager.h b/chrome/browser/ash/crosapi/browser_manager.h
index 74d17c7..3cd2038 100644
--- a/chrome/browser/ash/crosapi/browser_manager.h
+++ b/chrome/browser/ash/crosapi/browser_manager.h
@@ -262,8 +262,9 @@
       base::OnceCallback<void(crosapi::mojom::DeskTemplateStatePtr)>;
   // Gets URLs and active indices of the tab strip models from the Lacros
   // browser window.
-  void GetBrowserInformation(const std::string& window_unique_id,
-                             GetBrowserInformationCallback callback);
+  // Virtual for testing.
+  virtual void GetBrowserInformation(const std::string& window_unique_id,
+                                     GetBrowserInformationCallback callback);
 
   void AddObserver(BrowserManagerObserver* observer);
   void RemoveObserver(BrowserManagerObserver* observer);
diff --git a/chrome/browser/ash/crosapi/crosapi_util_unittest.cc b/chrome/browser/ash/crosapi/crosapi_util_unittest.cc
index 6f81a74..7132cf1 100644
--- a/chrome/browser/ash/crosapi/crosapi_util_unittest.cc
+++ b/chrome/browser/ash/crosapi/crosapi_util_unittest.cc
@@ -10,8 +10,8 @@
 #include "chrome/browser/ash/crosapi/browser_util.h"
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
-#include "chrome/common/chrome_constants.h"
 #include "chrome/test/base/testing_profile.h"
+#include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
 #include "chromeos/ash/components/settings/cros_settings_names.h"
 #include "chromeos/crosapi/mojom/keystore_service.mojom.h"
 #include "components/user_manager/scoped_user_manager.h"
@@ -70,7 +70,8 @@
 
 TEST_F(CrosapiUtilTest, IsSigninProfileOrBelongsToAffiliatedUserSigninProfile) {
   TestingProfile::Builder builder;
-  builder.SetPath(base::FilePath(FILE_PATH_LITERAL(chrome::kInitialProfile)));
+  builder.SetPath(
+      base::FilePath(ash::BrowserContextHelper::kSigninBrowserContextBaseName));
   std::unique_ptr<Profile> signin_profile = builder.Build();
 
   EXPECT_TRUE(browser_util::IsSigninProfileOrBelongsToAffiliatedUser(
@@ -112,8 +113,8 @@
 TEST_F(CrosapiUtilTest,
        IsSigninProfileOrBelongsToAffiliatedUserLockScreenProfile) {
   TestingProfile::Builder builder;
-  builder.SetPath(
-      base::FilePath(FILE_PATH_LITERAL(chrome::kLockScreenProfile)));
+  builder.SetPath(base::FilePath(
+      ash::BrowserContextHelper::kLockScreenBrowserContextBaseName));
   std::unique_ptr<Profile> lock_screen_profile = builder.Build();
 
   EXPECT_FALSE(browser_util::IsSigninProfileOrBelongsToAffiliatedUser(
diff --git a/chrome/browser/ash/extensions/file_manager/file_manager_private_apitest.cc b/chrome/browser/ash/extensions/file_manager/file_manager_private_apitest.cc
index 8cbc253..ca322c42 100644
--- a/chrome/browser/ash/extensions/file_manager/file_manager_private_apitest.cc
+++ b/chrome/browser/ash/extensions/file_manager/file_manager_private_apitest.cc
@@ -699,6 +699,29 @@
   EXPECT_STREQ(target_url, active_web_contents->GetVisibleURL().spec().c_str());
 }
 
+IN_PROC_BROWSER_TEST_F(FileManagerPrivateApiTest, SearchFiles) {
+  const base::FilePath downloads_dir = temp_dir_.GetPath();
+  ASSERT_TRUE(file_manager::VolumeManager::Get(browser()->profile())
+                  ->RegisterDownloadsDirectoryForTesting(downloads_dir));
+
+  {
+    base::ScopedAllowBlockingForTesting allow_io;
+    base::File root_image_file(
+        downloads_dir.Append("foo.jpg"),
+        base::File::FLAG_CREATE | base::File::FLAG_WRITE);
+    ASSERT_TRUE(root_image_file.IsValid());
+
+    ASSERT_TRUE(base::CreateDirectory(downloads_dir.AppendASCII("images")));
+    base::File nested_image_file(
+        downloads_dir.Append("images").Append("foo.jpg"),
+        base::File::FLAG_CREATE | base::File::FLAG_WRITE);
+    ASSERT_TRUE(nested_image_file.IsValid());
+  }
+
+  ASSERT_TRUE(RunExtensionTest("file_browser/search_files", {},
+                               {.load_as_component = true}));
+}
+
 class FileManagerPrivateApiDlpTest : public FileManagerPrivateApiTest {
  public:
   FileManagerPrivateApiDlpTest() {
diff --git a/chrome/browser/ash/extensions/file_manager/private_api_file_system.cc b/chrome/browser/ash/extensions/file_manager/private_api_file_system.cc
index 2a02851..9a46f9665 100644
--- a/chrome/browser/ash/extensions/file_manager/private_api_file_system.cc
+++ b/chrome/browser/ash/extensions/file_manager/private_api_file_system.cc
@@ -1372,11 +1372,12 @@
   Respond(WithArguments(std::move(result)));
 }
 
-FileManagerPrivateSearchFilesFunction::FileManagerPrivateSearchFilesFunction() =
-    default;
+FileManagerPrivateInternalSearchFilesFunction::
+    FileManagerPrivateInternalSearchFilesFunction() = default;
 
-ExtensionFunction::ResponseAction FileManagerPrivateSearchFilesFunction::Run() {
-  using api::file_manager_private::SearchFiles::Params;
+ExtensionFunction::ResponseAction
+FileManagerPrivateInternalSearchFilesFunction::Run() {
+  using api::file_manager_private_internal::SearchFiles::Params;
   const std::unique_ptr<Params> params(Params::Create(args()));
   EXTENSION_FUNCTION_VALIDATE(params);
 
@@ -1384,21 +1385,34 @@
     return RespondNow(Error("maxResults must be non-negative"));
   }
 
-  base::FilePath root = file_manager::util::GetMyFilesFolderForProfile(
-      Profile::FromBrowserContext(browser_context()));
+  base::FilePath root;
+
+  Profile* profile = Profile::FromBrowserContext(browser_context());
+  const std::string root_url = params->search_params.root_url.value_or("");
+  if (root_url.empty()) {
+    root = file_manager::util::GetMyFilesFolderForProfile(profile);
+  } else {
+    const scoped_refptr<storage::FileSystemContext> file_system_context =
+        file_manager::util::GetFileSystemContextForRenderFrameHost(
+            profile, render_frame_host());
+    const storage::FileSystemURL url =
+        file_system_context->CrackURLInFirstPartyContext(GURL(root_url));
+    root = url.path();
+  }
 
   base::ThreadPool::PostTaskAndReplyWithResult(
       FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
       base::BindOnce(&SearchByPattern, root, params->search_params.query,
                      base::internal::checked_cast<size_t>(
                          params->search_params.max_results)),
-      base::BindOnce(&FileManagerPrivateSearchFilesFunction::OnSearchByPattern,
-                     this));
+      base::BindOnce(
+          &FileManagerPrivateInternalSearchFilesFunction::OnSearchByPattern,
+          this));
 
   return RespondLater();
 }
 
-void FileManagerPrivateSearchFilesFunction::OnSearchByPattern(
+void FileManagerPrivateInternalSearchFilesFunction::OnSearchByPattern(
     const std::vector<std::pair<base::FilePath, bool>>& results) {
   Profile* const profile = Profile::FromBrowserContext(browser_context());
   auto my_files_path = file_manager::util::GetMyFilesFolderForProfile(profile);
@@ -1429,9 +1443,7 @@
     entries.Append(std::move(entry));
   }
 
-  base::Value::Dict result;
-  result.Set("entries", std::move(entries));
-  Respond(WithArguments(std::move(result)));
+  Respond(WithArguments(std::move(entries)));
 }
 
 ExtensionFunction::ResponseAction
diff --git a/chrome/browser/ash/extensions/file_manager/private_api_file_system.h b/chrome/browser/ash/extensions/file_manager/private_api_file_system.h
index c9e2acaf..7c65b13 100644
--- a/chrome/browser/ash/extensions/file_manager/private_api_file_system.h
+++ b/chrome/browser/ash/extensions/file_manager/private_api_file_system.h
@@ -463,15 +463,16 @@
                         const std::vector<drive::HashAndFilePath>& results);
 };
 
-class FileManagerPrivateSearchFilesFunction : public LoggedExtensionFunction {
+class FileManagerPrivateInternalSearchFilesFunction
+    : public LoggedExtensionFunction {
  public:
-  FileManagerPrivateSearchFilesFunction();
+  FileManagerPrivateInternalSearchFilesFunction();
 
-  DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.searchFiles",
-                             FILEMANAGERPRIVATE_SEARCHFILES)
+  DECLARE_EXTENSION_FUNCTION("fileManagerPrivateInternal.searchFiles",
+                             FILEMANAGERPRIVATEINTERNAL_SEARCHFILES)
 
  protected:
-  ~FileManagerPrivateSearchFilesFunction() override = default;
+  ~FileManagerPrivateInternalSearchFilesFunction() override = default;
 
  private:
   // ExtensionFunction overrides.
diff --git a/chrome/browser/ash/file_manager/volume_manager.cc b/chrome/browser/ash/file_manager/volume_manager.cc
index 4b29194a..f2cf71a 100644
--- a/chrome/browser/ash/file_manager/volume_manager.cc
+++ b/chrome/browser/ash/file_manager/volume_manager.cc
@@ -1396,8 +1396,9 @@
 
   // Remove the fusebox FSP storage device from chrome::storage.
   auto* mount_points = storage::ExternalMountPoints::GetSystemInstance();
-  mount_points->RevokeFileSystem(base::StrCat(
-      {util::kFuseBoxMountNamePrefix, util::kFuseBoxSubdirPrefixFSP, fsid}));
+  const std::string fusebox_fsid = base::StrCat(
+      {util::kFuseBoxMountNamePrefix, util::kFuseBoxSubdirPrefixFSP, fsid});
+  mount_points->RevokeFileSystem(fusebox_fsid);
 
   // Detach the fusebox FSP storage device from the fusebox daemon.
   fusebox_mounter_.DetachStorage(subdir);
@@ -1549,7 +1550,7 @@
 
   // Register the MTP storage device with chrome::storage.
   auto* mount_points = storage::ExternalMountPoints::GetSystemInstance();
-  if (!profile_->IsIncognitoProfile()) {
+  if (!FindExternalMountPoint(fsid)) {
     bool result = mount_points->RegisterFileSystem(
         fsid, storage::kFileSystemTypeDeviceMediaAsFileStorage,
         storage::FileSystemMountOption(), path);
@@ -1584,11 +1585,12 @@
       Volume::CreateForFuseBoxMTP(mount_path, label, read_only);
 
   // Register the fusebox MTP storage device with chrome::storage.
-  if (!profile_->IsIncognitoProfile()) {
+  const std::string fusebox_fsid =
+      base::StrCat({util::kFuseBoxMountNamePrefix, subdir});
+  if (!FindExternalMountPoint(fusebox_fsid)) {
     bool result = mount_points->RegisterFileSystem(
-        base::StrCat({util::kFuseBoxMountNamePrefix, subdir}),
-        storage::kFileSystemTypeFuseBox, storage::FileSystemMountOption(),
-        fusebox_volume->mount_path());
+        fusebox_fsid, storage::kFileSystemTypeFuseBox,
+        storage::FileSystemMountOption(), fusebox_volume->mount_path());
     DCHECK(result);
   }
 
@@ -1636,8 +1638,9 @@
 
   // Remove the fusebox MTP storage device from chrome::storage.
   std::string subdir = FuseBoxSubdirMTP(info.device_id());
-  mount_points->RevokeFileSystem(
-      base::StrCat({util::kFuseBoxMountNamePrefix, subdir}));
+  const std::string fusebox_fsid =
+      base::StrCat({util::kFuseBoxMountNamePrefix, subdir});
+  mount_points->RevokeFileSystem(fusebox_fsid);
 
   // Detach the fusebox MTP storage device from the fusebox daemon.
   fusebox_mounter_.DetachStorage(subdir);
@@ -1677,11 +1680,12 @@
                                          summary, icon_url, read_only, subdir);
 
   // Register the fusebox ADP storage device with chrome::storage.
-  if (!profile_->IsIncognitoProfile()) {
+  const std::string fusebox_fsid =
+      base::StrCat({util::kFuseBoxMountNamePrefix, subdir});
+  if (!FindExternalMountPoint(fusebox_fsid)) {
     bool result = mount_points->RegisterFileSystem(
-        base::StrCat({util::kFuseBoxMountNamePrefix, subdir}),
-        storage::kFileSystemTypeFuseBox, storage::FileSystemMountOption(),
-        fusebox_volume->mount_path());
+        fusebox_fsid, storage::kFileSystemTypeFuseBox,
+        storage::FileSystemMountOption(), fusebox_volume->mount_path());
     DCHECK(result);
   }
 
@@ -1710,8 +1714,9 @@
   // Remove the fusebox ADP storage device from chrome::storage.
   std::string subdir = FuseBoxSubdirADP(authority, root_id);
   auto* mount_points = storage::ExternalMountPoints::GetSystemInstance();
-  mount_points->RevokeFileSystem(
-      base::StrCat({util::kFuseBoxMountNamePrefix, subdir}));
+  const std::string fusebox_fsid =
+      base::StrCat({util::kFuseBoxMountNamePrefix, subdir});
+  mount_points->RevokeFileSystem(fusebox_fsid);
 
   // Detach the fusebox ADP storage device from the fusebox daemon.
   fusebox_mounter_.DetachStorage(subdir);
diff --git a/chrome/browser/ash/lock_screen_apps/fake_lock_screen_profile_creator.cc b/chrome/browser/ash/lock_screen_apps/fake_lock_screen_profile_creator.cc
index 14375bf..6f785fb 100644
--- a/chrome/browser/ash/lock_screen_apps/fake_lock_screen_profile_creator.cc
+++ b/chrome/browser/ash/lock_screen_apps/fake_lock_screen_profile_creator.cc
@@ -8,9 +8,9 @@
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/location.h"
-#include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/extensions/test_extension_system.h"
 #include "chrome/test/base/testing_profile_manager.h"
+#include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
 
 namespace lock_screen_apps {
 
@@ -24,7 +24,7 @@
   OnLockScreenProfileCreateStarted();
 
   Profile* profile = profile_manager_->CreateTestingProfile(
-      ash::ProfileHelper::GetLockScreenAppProfileName());
+      ash::BrowserContextHelper::kLockScreenAppBrowserContextBaseName);
 
   extensions::TestExtensionSystem* extension_system =
       static_cast<extensions::TestExtensionSystem*>(
diff --git a/chrome/browser/ash/login/screens/gaia_screen.cc b/chrome/browser/ash/login/screens/gaia_screen.cc
index cc71a18e..9dee31ad 100644
--- a/chrome/browser/ash/login/screens/gaia_screen.cc
+++ b/chrome/browser/ash/login/screens/gaia_screen.cc
@@ -7,26 +7,13 @@
 #include "ash/constants/ash_features.h"
 #include "ash/shell.h"
 #include "base/memory/weak_ptr.h"
-#include "base/metrics/histogram_functions.h"
 #include "base/values.h"
-#include "chrome/browser/ash/login/signin_partition_manager.h"
-#include "chrome/browser/ash/login/startup_utils.h"
 #include "chrome/browser/ash/login/ui/login_display_host.h"
 #include "chrome/browser/ash/login/wizard_context.h"
-#include "chrome/browser/ash/profiles/profile_helper.h"
-#include "chrome/browser/ash/settings/cros_settings.h"
-#include "chrome/browser/browser_process.h"
 #include "chrome/browser/ui/webui/ash/login/gaia_screen_handler.h"
-#include "chromeos/ash/components/login/auth/public/sync_trusted_vault_keys.h"
-#include "chromeos/ash/components/settings/cros_settings_names.h"
 #include "components/account_id/account_id.h"
-#include "components/session_manager/core/session_manager.h"
-#include "components/sync/base/features.h"
-#include "components/user_manager/known_user.h"
 #include "components/user_manager/user.h"
 #include "components/user_manager/user_manager.h"
-#include "google_apis/gaia/gaia_auth_util.h"
-#include "third_party/re2/src/re2/re2.h"
 
 namespace ash {
 namespace {
@@ -36,91 +23,6 @@
 constexpr char kUserActionStartEnrollment[] = "startEnrollment";
 constexpr char kUserActionReloadDefault[] = "reloadDefault";
 constexpr char kUserActionRetry[] = "retry";
-constexpr char kUserActionCompleteAuth[] = "completeAuthentication";
-constexpr char kUserActionCompleteLoginForTesting[] = "completeLoginForTesting";
-constexpr char kUserActionEnterIdentifier[] = "identifierEntered";
-constexpr char kUserActionEnterPassword[] = "passwordEntered";
-constexpr char kUserActionGaiaLoaded[] = "gaiaLoaded";
-constexpr char kUserActionUseSAMLAPI[] = "usingSAMLAPI";
-
-constexpr char kLeadingWhitespaceRegex[] = R"(^[\x{0000}-\x{0020}].*)";
-constexpr char kTrailingWhitespaceRegex[] = R"(.*[\x{0000}-\x{0020}]$)";
-
-// Returns `true` if the provided string has leading or trailing whitespaces.
-// Whitespace is defined as a character with code from '\u0000' to '\u0020'.
-bool HasLeadingOrTrailingWhitespaces(const std::string& str) {
-  return RE2::FullMatch(str, kLeadingWhitespaceRegex) ||
-         RE2::FullMatch(str, kTrailingWhitespaceRegex);
-}
-
-absl::optional<SyncTrustedVaultKeys> GetSyncTrustedVaultKeysForUserContext(
-    const base::Value::Dict& js_object,
-    const std::string& gaia_id) {
-  SyncTrustedVaultKeys parsed_keys = SyncTrustedVaultKeys::FromJs(js_object);
-  if (parsed_keys.gaia_id() != gaia_id)
-    return absl::nullopt;
-
-  return absl::make_optional(std::move(parsed_keys));
-}
-
-// Must be kept consistent with ChromeOSSamlApiUsed in enums.xml
-// These values are persisted to logs. Entries should not be renumbered and
-// numeric values should never be reused
-enum class ChromeOSSamlApiUsed {
-  kNotSamlLogin = 0,
-  kSamlApiUsed = 1,
-  kSamlApiNotUsed = 2,
-  kMaxValue = kSamlApiNotUsed,
-};
-
-void RecordAPILogin(bool is_third_party_idp, bool is_api_used) {
-  ChromeOSSamlApiUsed login_type;
-  if (!is_third_party_idp) {
-    login_type = ChromeOSSamlApiUsed::kNotSamlLogin;
-  } else if (is_api_used) {
-    login_type = ChromeOSSamlApiUsed::kSamlApiUsed;
-  } else {
-    login_type = ChromeOSSamlApiUsed::kSamlApiNotUsed;
-  }
-  base::UmaHistogramEnumeration("ChromeOS.SAML.APILogin", login_type);
-}
-
-bool ShouldCheckUserTypeBeforeAllowing() {
-  if (!features::IsFamilyLinkOnSchoolDeviceEnabled())
-    return false;
-
-  CrosSettings* cros_settings = CrosSettings::Get();
-  bool family_link_allowed = false;
-  cros_settings->GetBoolean(kAccountsPrefFamilyLinkAccountsAllowed,
-                            &family_link_allowed);
-
-  return family_link_allowed;
-}
-
-AccountId GetAccountId(const std::string& authenticated_email,
-                       const std::string& id,
-                       const AccountType& account_type) {
-  const std::string canonicalized_email =
-      gaia::CanonicalizeEmail(gaia::SanitizeEmail(authenticated_email));
-
-  user_manager::KnownUser known_user(g_browser_process->local_state());
-  const AccountId account_id =
-      known_user.GetAccountId(authenticated_email, id, account_type);
-
-  if (account_id.GetUserEmail() != canonicalized_email) {
-    LOG(WARNING) << "Existing user '" << account_id.GetUserEmail()
-                 << "' authenticated by alias '" << canonicalized_email << "'.";
-  }
-
-  return account_id;
-}
-
-user_manager::UserType CalculateUserType(const AccountId& account_id) {
-  if (account_id.GetAccountType() == AccountType::ACTIVE_DIRECTORY)
-    return user_manager::USER_TYPE_ACTIVE_DIRECTORY;
-
-  return user_manager::USER_TYPE_REGULAR;
-}
 
 }  // namespace
 
@@ -135,8 +37,6 @@
       return "EnterpriseEnroll";
     case Result::START_CONSUMER_KIOSK:
       return "StartConsumerKiosk";
-    case Result::LOGIN_SUCCESS:
-      return "LoginSuccess";
   }
 }
 
@@ -161,21 +61,21 @@
       gaia_path = GaiaView::GaiaPath::kReauth;
   }
   view_->SetGaiaPath(gaia_path);
-  LoadGaiaAsync(account);
+  view_->LoadGaiaAsync(account);
 }
 
 void GaiaScreen::LoadOnlineForChildSignup() {
   if (!view_)
     return;
   view_->SetGaiaPath(GaiaView::GaiaPath::kChildSignup);
-  LoadGaiaAsync(EmptyAccountId());
+  view_->LoadGaiaAsync(EmptyAccountId());
 }
 
 void GaiaScreen::LoadOnlineForChildSignin() {
   if (!view_)
     return;
   view_->SetGaiaPath(GaiaView::GaiaPath::kChildSignin);
-  LoadGaiaAsync(EmptyAccountId());
+  view_->LoadGaiaAsync(EmptyAccountId());
 }
 
 void GaiaScreen::ShowAllowlistCheckFailedError() {
@@ -207,7 +107,6 @@
   // Landed on the login screen. No longer skipping enrollment for tests.
   context()->skip_to_login_for_tests = false;
   view_->Show();
-  elapsed_timer_ = std::make_unique<base::ElapsedTimer>();
 }
 
 void GaiaScreen::HideImpl() {
@@ -231,41 +130,6 @@
     LoadOnline(EmptyAccountId());
   } else if (action_id == kUserActionRetry) {
     LoadOnline(EmptyAccountId());
-  } else if (action_id == kUserActionCompleteAuth) {
-    CHECK_EQ(10u, args.size());
-    const std::string& gaia_id = args[1].GetString();
-    const std::string& email = args[2].GetString();
-    const std::string& password = args[3].GetString();
-    const base::Value::List& scraped_saml_passwords_value = args[4].GetList();
-    bool using_saml = args[5].GetBool();
-    const base::Value::List& services_list = args[6].GetList();
-    bool services_provided = args[7].GetBool();
-    const base::Value::Dict& password_attributes = args[8].GetDict();
-    const base::Value::Dict& sync_trusted_vault_keys = args[9].GetDict();
-    HandleCompleteAuthentication(gaia_id, email, password,
-                                 scraped_saml_passwords_value, using_saml,
-                                 services_list, services_provided,
-                                 password_attributes, sync_trusted_vault_keys);
-  } else if (action_id == kUserActionCompleteLoginForTesting) {
-    CHECK_EQ(5u, args.size());
-    const std::string& gaia_id = args[1].GetString();
-    const std::string& email = args[2].GetString();
-    const std::string& password = args[3].GetString();
-    bool using_saml = args[4].GetBool();
-    HandleCompleteLoginForTesting(gaia_id, email, password,  // IN-TEST
-                                  using_saml);
-  } else if (action_id == kUserActionEnterIdentifier) {
-    CHECK_EQ(2u, args.size());
-    const std::string& email = args[1].GetString();
-    HandleIdentifierEntered(email);
-  } else if (action_id == kUserActionEnterPassword) {
-    HandlePasswordEntered();
-  } else if (action_id == kUserActionGaiaLoaded) {
-    HandleGaiaLoaded();
-  } else if (action_id == kUserActionUseSAMLAPI) {
-    CHECK_EQ(2u, args.size());
-    bool is_third_party_idp = args[1].GetBool();
-    HandleUsingSAMLAPI(is_third_party_idp);
   } else {
     BaseScreen::OnUserAction(args);
   }
@@ -290,239 +154,4 @@
   exit_callback_.Run(Result::CANCEL);
 }
 
-void GaiaScreen::HandleCompleteAuthentication(
-    const std::string& gaia_id,
-    const std::string& email,
-    const std::string& password_value,
-    const base::Value::List& scraped_saml_passwords_value,
-    bool using_saml,
-    const base::Value::List& services_list,
-    bool services_provided,
-    const base::Value::Dict& password_attributes,
-    const base::Value::Dict& sync_trusted_vault_keys) {
-  if (!LoginDisplayHost::default_host())
-    return;
-
-  DCHECK(!email.empty());
-  DCHECK(!gaia_id.empty());
-
-  if (!using_saml) {
-    base::UmaHistogramEnumeration("OOBE.GaiaScreen.SuccessLoginRequests",
-                                  login_request_variant_);
-    // Report whether the password has characters ignored by Gaia
-    // (leading/trailing whitespaces).
-    base::UmaHistogramBoolean("OOBE.GaiaScreen.PasswordIgnoredChars",
-                              HasLeadingOrTrailingWhitespaces(password_value));
-  }
-  auto scraped_saml_passwords =
-      ::login::ConvertToStringList(scraped_saml_passwords_value);
-  const auto services = ::login::ConvertToStringList(services_list);
-  auto password = password_value;
-
-  if (IsSamlUserPasswordless()) {
-    // In the passwordless case, the user data will be protected by non password
-    // based mechanisms. Clear anything that got collected into passwords.
-    scraped_saml_passwords.clear();
-    password.clear();
-  }
-
-  if (using_saml && !using_saml_api_ && !IsSamlUserPasswordless()) {
-    RecordScrapedPasswordCount(scraped_saml_passwords.size());
-  }
-
-  const AccountId account_id =
-      GetAccountId(email, gaia_id, AccountType::GOOGLE);
-  // Execute delayed allowlist check that is based on user type. If Gaia done
-  // times out and doesn't provide us with services list try to use a saved
-  // UserType.
-  const user_manager::UserType user_type =
-      services_provided
-          ? login::GetUsertypeFromServicesString(services)
-          : user_manager::UserManager::Get()->GetUserType(account_id);
-  if (ShouldCheckUserTypeBeforeAllowing() &&
-      !LoginDisplayHost::default_host()->IsUserAllowlisted(account_id,
-                                                           user_type)) {
-    ShowAllowlistCheckFailedError();
-    return;
-  }
-
-  // Record amount of time from the moment screen was shown till
-  // completeAuthentication signal come. Only for no SAML flow and only during
-  // first run in OOBE.
-  if (elapsed_timer_ && !using_saml &&
-      session_manager::SessionManager::Get()->session_state() ==
-          session_manager::SessionState::OOBE) {
-    base::UmaHistogramMediumTimes("OOBE.GaiaLoginTime",
-                                  elapsed_timer_->Elapsed());
-    elapsed_timer_.reset();
-  }
-
-  const std::string sanitized_email = gaia::SanitizeEmail(email);
-  LoginDisplayHost::default_host()->SetDisplayEmail(sanitized_email);
-
-  OnlineLoginHelper::CompleteLoginCallback complete_login_callback =
-      base::BindOnce(&GaiaScreen::OnCompleteLogin, weak_factory_.GetWeakPtr());
-
-  if (password.empty() && !IsSamlUserPasswordless()) {
-    CHECK_NE(scraped_saml_passwords.size(), 1u);
-    complete_login_callback = base::BindOnce(&GaiaScreen::SAMLConfirmPassword,
-                                             weak_factory_.GetWeakPtr(),
-                                             std::move(scraped_saml_passwords));
-  }
-
-  login::SigninPartitionManager* signin_partition_manager =
-      login::SigninPartitionManager::Factory::GetForBrowserContext(
-          ProfileHelper::GetSigninProfile());
-  online_login_helper_ = std::make_unique<OnlineLoginHelper>(
-      view_->GetSigninPartitionName(), signin_partition_manager,
-      base::BindOnce(&GaiaScreen::OnCookieWaitTimeout,
-                     weak_factory_.GetWeakPtr()),
-      std::move(complete_login_callback));
-
-  auto user_context = std::make_unique<UserContext>();
-  SigninError error;
-  if (!login::BuildUserContextForGaiaSignIn(
-          user_type, account_id, using_saml, using_saml_api_, password,
-          SamlPasswordAttributes::FromJs(password_attributes),
-          GetSyncTrustedVaultKeysForUserContext(sync_trusted_vault_keys,
-                                                gaia_id),
-          *extension_provided_client_cert_usage_observer_, user_context.get(),
-          &error)) {
-    LoginDisplayHost::default_host()->GetSigninUI()->ShowSigninError(
-        error, /*details=*/std::string());
-    return;
-  }
-
-  online_login_helper_->SetUserContext(std::move(user_context));
-  online_login_helper_->RequestCookiesAndCompleteAuthentication();
-
-  view_->OnCompleteAuthentication(sanitized_email);
-}
-
-void GaiaScreen::HandleCompleteLoginForTesting(const std::string& gaia_id,
-                                               const std::string& typed_email,
-                                               const std::string& password,
-                                               bool using_saml) {
-  VLOG(1) << "HandleCompleteLoginForTesting";
-  DCHECK(!typed_email.empty());
-  DCHECK(!gaia_id.empty());
-  const std::string sanitized_email = gaia::SanitizeEmail(typed_email);
-  LoginDisplayHost::default_host()->SetDisplayEmail(sanitized_email);
-  const AccountId account_id =
-      GetAccountId(typed_email, gaia_id, AccountType::GOOGLE);
-  const user_manager::User* const user =
-      user_manager::UserManager::Get()->FindUser(account_id);
-
-  auto user_context = std::make_unique<UserContext>();
-  SigninError error;
-  if (!login::BuildUserContextForGaiaSignIn(
-          user ? user->GetType() : CalculateUserType(account_id),
-          GetAccountId(typed_email, gaia_id, AccountType::GOOGLE), using_saml,
-          using_saml_api_, password, SamlPasswordAttributes(),
-          /*sync_trusted_vault_keys=*/absl::nullopt,
-          *extension_provided_client_cert_usage_observer_, user_context.get(),
-          &error)) {
-    LoginDisplayHost::default_host()->GetSigninUI()->ShowSigninError(
-        error, /*details=*/std::string());
-    return;
-  }
-
-  OnCompleteLogin(std::move(user_context));
-}
-
-void GaiaScreen::HandleIdentifierEntered(const std::string& user_email) {
-  // We cannot tell a user type from the identifier, so we delay checking if
-  // the account should be allowed.
-  if (ShouldCheckUserTypeBeforeAllowing())
-    return;
-
-  user_manager::KnownUser known_user(g_browser_process->local_state());
-  if (LoginDisplayHost::default_host() &&
-      !LoginDisplayHost::default_host()->IsUserAllowlisted(
-          known_user.GetAccountId(user_email, std::string() /* id */,
-                                  AccountType::UNKNOWN),
-          absl::nullopt)) {
-    ShowAllowlistCheckFailedError();
-  }
-}
-
-void GaiaScreen::HandlePasswordEntered() {
-  base::UmaHistogramEnumeration("OOBE.GaiaScreen.LoginRequests",
-                                login_request_variant_);
-}
-
-void GaiaScreen::HandleGaiaLoaded() {
-  VLOG(1) << "Gaia finished loading";
-  // Recreate the client cert usage observer, in order to track only the certs
-  // used during the current sign-in attempt.
-  extension_provided_client_cert_usage_observer_ =
-      std::make_unique<LoginClientCertUsageObserver>();
-
-  // Clear old storage partitions after a new sign-in page is loaded. All
-  // reference to the old storage partitions should be cleared.
-  login::SigninPartitionManager* signin_partition_manager =
-      login::SigninPartitionManager::Factory::GetForBrowserContext(
-          ProfileHelper::GetSigninProfile());
-  signin_partition_manager->DisposeOldStoragePartitions();
-}
-
-void GaiaScreen::HandleUsingSAMLAPI(bool is_third_party_idp) {
-  OnSamlPrincipalsAPIUsed(is_third_party_idp, /*is_api_used=*/true);
-}
-
-void GaiaScreen::LoadGaiaAsync(const AccountId& account_id) {
-  login_request_variant_ = GaiaView::GaiaLoginVariant::kUnknown;
-  if (account_id.is_valid()) {
-    login_request_variant_ = GaiaView::GaiaLoginVariant::kOnlineSignin;
-  } else {
-    if (StartupUtils::IsOobeCompleted() && StartupUtils::IsDeviceOwned()) {
-      login_request_variant_ = GaiaView::GaiaLoginVariant::kAddUser;
-    } else {
-      login_request_variant_ = GaiaView::GaiaLoginVariant::kOobe;
-    }
-  }
-  view_->LoadGaiaAsync(account_id);
-}
-
-void GaiaScreen::OnSamlPrincipalsAPIUsed(bool is_third_party_idp,
-                                         bool is_api_used) {
-  using_saml_api_ = is_api_used;
-  // This correctly records the standard GAIA login and SAML flow
-  // with Chrome Credentials Passing API used/not used
-  RecordAPILogin(is_third_party_idp, is_api_used);
-}
-
-void GaiaScreen::RecordScrapedPasswordCount(int password_count) {
-  // We are handling scraped passwords here so this is SAML flow without
-  // Chrome Credentials Passing API
-  OnSamlPrincipalsAPIUsed(/*is_third_party_idp=*/true, /*is_api_used=*/false);
-  // Use a histogram that has 11 buckets, one for each of the values in [0, 9]
-  // and an overflow bucket at the end.
-  base::UmaHistogramExactLinear("ChromeOS.SAML.Scraping.PasswordCountAll",
-                                password_count, 11);
-}
-
-bool GaiaScreen::IsSamlUserPasswordless() {
-  return extension_provided_client_cert_usage_observer_ &&
-         extension_provided_client_cert_usage_observer_->ClientCertsWereUsed();
-}
-
-void GaiaScreen::OnCookieWaitTimeout() {
-  LoginDisplayHost::default_host()->GetSigninUI()->ShowSigninError(
-      SigninError::kCookieWaitTimeout, /*details=*/std::string());
-}
-
-void GaiaScreen::OnCompleteLogin(std::unique_ptr<UserContext> user_context) {
-  context()->extra_factors_auth_session = std::move(user_context);
-  exit_callback_.Run(Result::LOGIN_SUCCESS);
-}
-
-void GaiaScreen::SAMLConfirmPassword(
-    ::login::StringList scraped_saml_passwords,
-    std::unique_ptr<UserContext> user_context) {
-  // TODO(yunkez): Use exit code and move this logic to wizard controller.
-  LoginDisplayHost::default_host()->GetSigninUI()->SAMLConfirmPassword(
-      std::move(scraped_saml_passwords), std::move(user_context));
-}
-
 }  // namespace ash
diff --git a/chrome/browser/ash/login/screens/gaia_screen.h b/chrome/browser/ash/login/screens/gaia_screen.h
index 1c0485b..6fa2f7a 100644
--- a/chrome/browser/ash/login/screens/gaia_screen.h
+++ b/chrome/browser/ash/login/screens/gaia_screen.h
@@ -13,12 +13,8 @@
 #include "base/callback.h"
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observation.h"
-#include "base/timer/elapsed_timer.h"
 #include "base/values.h"
-#include "chrome/browser/ash/login/login_client_cert_usage_observer.h"
 #include "chrome/browser/ash/login/screens/base_screen.h"
-#include "chrome/browser/ui/webui/ash/login/gaia_screen_handler.h"
-#include "chrome/browser/ui/webui/ash/login/online_login_helper.h"
 #include "components/account_id/account_id.h"
 
 namespace ash {
@@ -37,7 +33,6 @@
     CANCEL,
     ENTERPRISE_ENROLL,
     START_CONSUMER_KIOSK,
-    LOGIN_SUCCESS,
   };
 
   static std::string GetResultString(Result result);
@@ -74,70 +69,12 @@
   void OnUserAction(const base::Value::List& args) override;
   bool HandleAccelerator(LoginAcceleratorAction action) override;
 
-  // Handle user actions.
-  void HandleCompleteAuthentication(
-      const std::string& gaia_id,
-      const std::string& email,
-      const std::string& password,
-      const base::Value::List& scraped_saml_passwords_value,
-      bool using_saml,
-      const base::Value::List& services_list,
-      bool services_provided,
-      const base::Value::Dict& password_attributes,
-      const base::Value::Dict& sync_trusted_vault_keys);
-  // TODO(yunkez): This is only used in `Oobe.loginForTesting` in tast tests. We
-  // could remove this or use HandleCompleteAuthentication instead.
-  void HandleCompleteLoginForTesting(const std::string& gaia_id,
-                                     const std::string& typed_email,
-                                     const std::string& password,
-                                     bool using_saml);
-  void HandleIdentifierEntered(const std::string& account_identifier);
-  void HandlePasswordEntered();
-  void HandleGaiaLoaded();
-
-  // Handles SAML/GAIA login flow metrics
-  // is_third_party_idp == false means GAIA-based authentication
-  void HandleUsingSAMLAPI(bool is_third_party_idp);
-
-  void LoadGaiaAsync(const AccountId& account_id);
-
-  // Updates the member variable and UMA histogram indicating whether the
-  // Chrome Credentials Passing API was used during SAML login.
-  void OnSamlPrincipalsAPIUsed(bool is_third_party_idp, bool is_api_used);
-
-  void RecordScrapedPasswordCount(int password_count);
-  bool IsSamlUserPasswordless();
-
-  void OnCookieWaitTimeout();
-
-  void OnCompleteLogin(std::unique_ptr<UserContext> user_context);
-  void SAMLConfirmPassword(::login::StringList scraped_saml_passwords,
-                           std::unique_ptr<UserContext> user_context);
-
-  // This flag is set when user authenticated using the Chrome Credentials
-  // Passing API (the login could happen via SAML or, with the current
-  // server-side implementation, via Gaia).
-  bool using_saml_api_ = false;
-
-  std::unique_ptr<LoginClientCertUsageObserver>
-      extension_provided_client_cert_usage_observer_;
-
-  std::unique_ptr<OnlineLoginHelper> online_login_helper_;
-
-  GaiaView::GaiaLoginVariant login_request_variant_ =
-      GaiaView::GaiaLoginVariant::kUnknown;
-
-  // Used to record amount of time user needed for successful online login.
-  std::unique_ptr<base::ElapsedTimer> elapsed_timer_;
-
   base::WeakPtr<TView> view_;
 
   ScreenExitCallback exit_callback_;
 
   base::ScopedObservation<BacklightsForcedOffSetter, ScreenBacklightObserver>
       backlights_forced_off_observation_{this};
-
-  base::WeakPtrFactory<GaiaScreen> weak_factory_{this};
 };
 
 }  // namespace ash
diff --git a/chrome/browser/ash/login/wizard_controller.cc b/chrome/browser/ash/login/wizard_controller.cc
index c6613004..5a1f6f1c 100644
--- a/chrome/browser/ash/login/wizard_controller.cc
+++ b/chrome/browser/ash/login/wizard_controller.cc
@@ -1197,10 +1197,6 @@
     case GaiaScreen::Result::START_CONSUMER_KIOSK:
       LoginDisplayHost::default_host()->AttemptShowEnableConsumerKioskScreen();
       break;
-    case GaiaScreen::Result::LOGIN_SUCCESS:
-      LoginDisplayHost::default_host()->CompleteLogin(
-          *wizard_context_->extra_factors_auth_session);
-      break;
   }
 }
 
@@ -1421,15 +1417,12 @@
     return;
   wizard_context_->skip_to_login_for_tests = true;
 
-  if (LoginDisplayHost::default_host()->HasUserPods()) {
-    AdvanceToSigninScreen();
-  } else {
-    if (!features::IsOobeConsolidatedConsentEnabled())
-      StartupUtils::MarkEulaAccepted();
-
-    PerformPostNetworkScreenActions();
-    OnDeviceDisabledChecked(false /* device_disabled */);
+  if (!features::IsOobeConsolidatedConsentEnabled()) {
+    StartupUtils::MarkEulaAccepted();
   }
+
+  PerformPostNetworkScreenActions();
+  OnDeviceDisabledChecked(false /* device_disabled */);
 }
 
 void WizardController::OnScreenExit(OobeScreenId screen,
diff --git a/chrome/browser/ash/printing/print_management/printing_manager_factory_unittest.cc b/chrome/browser/ash/printing/print_management/printing_manager_factory_unittest.cc
index 0ba1bd6..b72b823 100644
--- a/chrome/browser/ash/printing/print_management/printing_manager_factory_unittest.cc
+++ b/chrome/browser/ash/printing/print_management/printing_manager_factory_unittest.cc
@@ -6,8 +6,8 @@
 
 #include "chrome/browser/ash/printing/print_management/printing_manager.h"
 #include "chrome/browser/history/history_service_factory.h"
-#include "chrome/common/chrome_constants.h"
 #include "chrome/test/base/testing_profile.h"
+#include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
 #include "components/history/core/browser/history_service.h"
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -61,7 +61,7 @@
 TEST(PrintingManagerFactoryTest, SigninProfileNoService) {
   content::BrowserTaskEnvironment task_environment;
   std::unique_ptr<Profile> signin_profile =
-      CreateProfile(chrome::kInitialProfile);
+      CreateProfile(ash::BrowserContextHelper::kSigninBrowserContextBaseName);
 
   EXPECT_EQ(nullptr,
             PrintingManagerFactory::GetForProfile(signin_profile.get()));
@@ -69,8 +69,8 @@
 
 TEST(PrintingManagerFactoryTest, LockScreenProfileNoService) {
   content::BrowserTaskEnvironment task_environment;
-  std::unique_ptr<Profile> lockscreen_profile =
-      CreateProfile(chrome::kLockScreenAppProfile);
+  std::unique_ptr<Profile> lockscreen_profile = CreateProfile(
+      ash::BrowserContextHelper::kLockScreenAppBrowserContextBaseName);
 
   EXPECT_EQ(nullptr,
             PrintingManagerFactory::GetForProfile(lockscreen_profile.get()));
diff --git a/chrome/browser/ash/profiles/profile_helper.cc b/chrome/browser/ash/profiles/profile_helper.cc
index 758b3f86..5891afb 100644
--- a/chrome/browser/ash/profiles/profile_helper.cc
+++ b/chrome/browser/ash/profiles/profile_helper.cc
@@ -153,7 +153,7 @@
 
 // static
 base::FilePath ProfileHelper::GetSigninProfileDir() {
-  return GetImpl()->GetProfileDir(chrome::kInitialProfile);
+  return BrowserContextHelper::Get()->GetSigninBrowserContextPath();
 }
 
 // static
@@ -191,17 +191,12 @@
 
 // static
 base::FilePath ProfileHelper::GetLockScreenAppProfilePath() {
-  return GetImpl()->GetProfileDir(chrome::kLockScreenAppProfile);
-}
-
-// static
-std::string ProfileHelper::GetLockScreenAppProfileName() {
-  return chrome::kLockScreenAppProfile;
+  return BrowserContextHelper::Get()->GetLockScreenAppBrowserContextPath();
 }
 
 // static
 base::FilePath ProfileHelper::GetLockScreenProfileDir() {
-  return GetImpl()->GetProfileDir(chrome::kLockScreenProfile);
+  return BrowserContextHelper::Get()->GetLockScreenBrowserContextPath();
 }
 
 // static
diff --git a/chrome/browser/ash/profiles/profile_helper.h b/chrome/browser/ash/profiles/profile_helper.h
index f35f514..71bfd24 100644
--- a/chrome/browser/ash/profiles/profile_helper.h
+++ b/chrome/browser/ash/profiles/profile_helper.h
@@ -54,11 +54,13 @@
   static ProfileHelper* Get();
 
   // DEPRECATED: Please use
-  // BrowserContextHelper::GetBrowserContextPathByUserIdHash() instead.
+  // ash::BrowserContextHelper::GetBrowserContextPathByUserIdHash() instead.
   // Returns profile path that corresponds to a given |user_id_hash|.
   static base::FilePath GetProfilePathByUserIdHash(
       const std::string& user_id_hash);
 
+  // DEPRECATED: Please use
+  // ash::BrowserContextHelper::GetSigninBrowserContextPath() instead.
   // Returns the path that corresponds to the sign-in profile.
   static base::FilePath GetSigninProfileDir();
 
@@ -84,19 +86,20 @@
   // Returns true if the signin profile has been initialized.
   static bool IsSigninProfileInitialized();
 
+  // DEPRECATED. Please use
+  // ash::BrowserContextHelper::GetLockScreenAppBrowserContextPath() instead.
   // Returns the path used for the lock screen apps profile - profile used
   // for launching platform apps that can display windows on top of the lock
   // screen.
   static base::FilePath GetLockScreenAppProfilePath();
 
-  // Returns the name used for the lock screen app profile.
-  static std::string GetLockScreenAppProfileName();
-
   // Returns whether |profile| is the lock screen app profile - the profile used
   // for launching platform apps that can display a window on top of the lock
   // screen.
   static bool IsLockScreenAppProfile(const Profile* profile);
 
+  // DEPRECATED. Please use
+  // ash::BrowserContextHelper::GetLockScreenBrowserContextPath() instead.
   // Returns the path that corresponds to the lockscreen profile.
   static base::FilePath GetLockScreenProfileDir();
 
diff --git a/chrome/browser/ash/scanning/scan_service_factory_unittest.cc b/chrome/browser/ash/scanning/scan_service_factory_unittest.cc
index ed62f78..5801c56 100644
--- a/chrome/browser/ash/scanning/scan_service_factory_unittest.cc
+++ b/chrome/browser/ash/scanning/scan_service_factory_unittest.cc
@@ -13,8 +13,8 @@
 #include "chrome/browser/ash/scanning/lorgnette_scanner_manager_factory.h"
 #include "chrome/browser/ash/scanning/scan_service.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/common/chrome_constants.h"
 #include "chrome/test/base/testing_profile.h"
+#include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/test/browser_task_environment.h"
@@ -76,7 +76,7 @@
 TEST(ScanServiceFactoryTest, SigninProfileNoService) {
   content::BrowserTaskEnvironment task_environment;
   std::unique_ptr<Profile> signin_profile =
-      CreateProfile(chrome::kInitialProfile);
+      CreateProfile(ash::BrowserContextHelper::kSigninBrowserContextBaseName);
   EXPECT_EQ(nullptr,
             ScanServiceFactory::GetForBrowserContext(signin_profile.get()));
 }
@@ -84,8 +84,8 @@
 // Test that the ScanService cannot be created on the lock screen.
 TEST(ScanServiceFactoryTest, LockScreenProfileNoService) {
   content::BrowserTaskEnvironment task_environment;
-  std::unique_ptr<Profile> lockscreen_profile =
-      CreateProfile(chrome::kLockScreenAppProfile);
+  std::unique_ptr<Profile> lockscreen_profile = CreateProfile(
+      ash::BrowserContextHelper::kLockScreenAppBrowserContextBaseName);
   EXPECT_EQ(nullptr,
             ScanServiceFactory::GetForBrowserContext(lockscreen_profile.get()));
 }
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc
index b70e9ff..8da1364 100644
--- a/chrome/browser/chrome_browser_interface_binders.cc
+++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -42,7 +42,6 @@
 #include "chrome/browser/ui/webui/media/media_history_ui.h"
 #include "chrome/browser/ui/webui/omnibox/omnibox.mojom.h"
 #include "chrome/browser/ui/webui/omnibox/omnibox_ui.h"
-#include "chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.h"
 #include "chrome/browser/ui/webui/segmentation_internals/segmentation_internals_ui.h"
 #include "chrome/browser/ui/webui/usb_internals/usb_internals.mojom.h"
 #include "chrome/browser/ui/webui/usb_internals/usb_internals_ui.h"
@@ -167,6 +166,7 @@
 #include "chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom.h"
 #include "chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.h"
 #include "chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_ui.h"
+#include "chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.h"
 #include "chrome/browser/ui/webui/settings/settings_ui.h"
 #include "chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_side_panel_ui.h"
 #include "chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome.mojom.h"
@@ -918,7 +918,7 @@
       ash::personalization_app::PersonalizationAppUI,
       ash::settings::OSSettingsUI,
 #endif
-      NewTabPageUI>(map);
+      NewTabPageUI, OmniboxPopupUI>(map);
 
   RegisterWebUIControllerInterfaceBinder<
       new_tab_page::mojom::PageHandlerFactory, NewTabPageUI>(map);
diff --git a/chrome/browser/enterprise/reporting/browser_report_generator_unittest.cc b/chrome/browser/enterprise/reporting/browser_report_generator_unittest.cc
index a9993fee..00b950e9 100644
--- a/chrome/browser/enterprise/reporting/browser_report_generator_unittest.cc
+++ b/chrome/browser/enterprise/reporting/browser_report_generator_unittest.cc
@@ -34,7 +34,7 @@
 #endif  // !BUILDFLAG(IS_ANDROID)
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/common/chrome_constants.h"
+#include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING) && !BUILDFLAG(IS_CHROMEOS_ASH)
@@ -186,8 +186,10 @@
 #endif  // !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_ANDROID)
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-    profile_manager_.CreateTestingProfile(chrome::kInitialProfile);
-    profile_manager_.CreateTestingProfile(chrome::kLockScreenAppProfile);
+    profile_manager_.CreateTestingProfile(
+        ash::BrowserContextHelper::kSigninBrowserContextBaseName);
+    profile_manager_.CreateTestingProfile(
+        ash::BrowserContextHelper::kLockScreenAppBrowserContextBaseName);
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
   }
 
diff --git a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_apitest.cc b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_apitest.cc
index 1c05c1fa..bd5fbb3 100644
--- a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_apitest.cc
+++ b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_apitest.cc
@@ -115,6 +115,10 @@
   ASSERT_TRUE(RunExtensionTest("test_match_outcome")) << message_;
 }
 
+IN_PROC_BROWSER_TEST_F(DeclarativeNetRequestApiTest, UpdateStaticRules) {
+  ASSERT_TRUE(RunExtensionTest("update_static_rules")) << message_;
+}
+
 class DeclarativeNetRequestApiFencedFrameTest
     : public DeclarativeNetRequestApiTest {
  protected:
diff --git a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
index 04f267bb..2be3b3bf 100644
--- a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
+++ b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
@@ -32,6 +32,7 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/test/simple_test_clock.h"
 #include "base/test/test_timeouts.h"
+#include "base/test/values_test_util.h"
 #include "base/thread_annotations.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
@@ -136,6 +137,7 @@
 
 namespace dnr_api = api::declarative_net_request;
 
+using ::testing::ElementsAreArray;
 using ::testing::UnorderedElementsAre;
 using ::testing::UnorderedElementsAreArray;
 
@@ -427,6 +429,42 @@
     EXPECT_EQ(expected_error, result);
   }
 
+  void UpdateStaticRules(const ExtensionId& extension_id,
+                         const std::string& ruleset_id,
+                         const std::vector<int>& rule_ids_to_disable,
+                         const std::vector<int>& rule_ids_to_enable) {
+    static constexpr char kScript[] = R"(
+      chrome.declarativeNetRequest.updateStaticRules(
+          {rulesetId: $1, disableRuleIds: $2, enableRuleIds: $3},
+          () => {
+            window.domAutomationController.send(chrome.runtime.lastError ?
+                chrome.runtime.lastError.message : 'success');
+          });
+    )";
+
+    base::Value::List ids_to_disable =
+        ListBuilder()
+            .Append(rule_ids_to_disable.begin(), rule_ids_to_disable.end())
+            .Build();
+    base::Value::List ids_to_enable =
+        ListBuilder()
+            .Append(rule_ids_to_enable.begin(), rule_ids_to_enable.end())
+            .Build();
+
+    const std::string script = content::JsReplace(
+        kScript, ruleset_id, base::Value(std::move(ids_to_disable)),
+        base::Value(std::move(ids_to_enable)));
+    std::string result = ExecuteScriptInBackgroundPage(extension_id, script);
+
+    ASSERT_EQ("success", result);
+  }
+
+  base::flat_set<int> GetDisabledRuleIdsFromMatcher(
+      const std::string& ruleset_id_string) {
+    return GetDisabledRuleIdsFromMatcherForTesting(
+        *ruleset_manager(), *last_loaded_extension(), ruleset_id_string);
+  }
+
   void VerifyPublicRulesetIds(
       const Extension* extension,
       const std::vector<std::string>& expected_ruleset_ids) {
@@ -4831,6 +4869,55 @@
   EXPECT_FALSE(prefs->GetDNRDynamicRulesetChecksum(extension_id, &checksum));
 }
 
+// Tests that persisted disabled static rule ids are no longer kept after an
+// extension update.
+IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest_Packed,
+                       PackedUpdateAfterUpdateStaticRules) {
+  set_config_flags(ConfigFlag::kConfig_HasBackgroundScript);
+
+  std::string ruleset_id = "ruleset1";
+  std::vector<TestRulesetInfo> rulesets = {TestRulesetInfo(
+      ruleset_id, ToListValue({CreateGenericRule(1), CreateGenericRule(2),
+                               CreateGenericRule(3)}))};
+
+  const char* kDirectory1 = "dir1";
+
+  ASSERT_NO_FATAL_FAILURE(
+      LoadExtensionWithRulesets(rulesets, kDirectory1, {} /* hosts */));
+  const Extension* extension = last_loaded_extension();
+
+  CompositeMatcher* composite_matcher =
+      ruleset_manager()->GetMatcherForExtension(last_loaded_extension_id());
+  ASSERT_TRUE(composite_matcher);
+
+  EXPECT_THAT(GetPublicRulesetIDs(*extension, *composite_matcher),
+              UnorderedElementsAre(ruleset_id));
+
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(ruleset_id), testing::IsEmpty());
+
+  UpdateStaticRules(last_loaded_extension_id(), ruleset_id,
+                    {2} /* rule_ids_to_disable */, {} /* rule_ids_to_enable */);
+
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(ruleset_id), ElementsAreArray({2}));
+
+  const char* kDirectory2 = "dir2";
+  ASSERT_NO_FATAL_FAILURE(UpdateLastLoadedExtension(
+      rulesets, kDirectory2, {} /* hosts */,
+      0 /* expected_extensions_with_rulesets_count_change */,
+      false /* has_dynamic_ruleset */));
+  extension = extension_registry()->GetExtensionById(
+      last_loaded_extension_id(), extensions::ExtensionRegistry::ENABLED);
+
+  composite_matcher =
+      ruleset_manager()->GetMatcherForExtension(last_loaded_extension_id());
+  EXPECT_TRUE(composite_matcher);
+
+  EXPECT_THAT(GetPublicRulesetIDs(*extension, *composite_matcher),
+              UnorderedElementsAre(ruleset_id));
+
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(ruleset_id), testing::IsEmpty());
+}
+
 // Fixture to test the "allowAllRequests" action.
 class DeclarativeNetRequestAllowAllRequestsBrowserTest
     : public DeclarativeNetRequestBrowserTest {
diff --git a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc
index 2b418789..41857a7a 100644
--- a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc
+++ b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc
@@ -34,6 +34,7 @@
 #include "extensions/browser/api/declarative_net_request/composite_matcher.h"
 #include "extensions/browser/api/declarative_net_request/constants.h"
 #include "extensions/browser/api/declarative_net_request/declarative_net_request_api.h"
+#include "extensions/browser/api/declarative_net_request/declarative_net_request_prefs_helper.h"
 #include "extensions/browser/api/declarative_net_request/file_backed_ruleset_source.h"
 #include "extensions/browser/api/declarative_net_request/parse_info.h"
 #include "extensions/browser/api/declarative_net_request/rules_count_pair.h"
@@ -76,6 +77,7 @@
 
 namespace dnr_api = extensions::api::declarative_net_request;
 
+using ::testing::ElementsAreArray;
 using ::testing::Field;
 using ::testing::Pointee;
 using ::testing::Property;
@@ -384,6 +386,61 @@
     EXPECT_THAT(expected_ids, UnorderedElementsAreArray(actual_ids));
   }
 
+  void RunUpdateStaticRulesFunction(
+      const Extension& extension,
+      const std::string& ruleset_id,
+      const std::vector<int>& rule_ids_to_disable,
+      const std::vector<int>& rule_ids_to_enable,
+      absl::optional<std::string> expected_error) {
+    base::Value::List ids_to_disable =
+        ListBuilder()
+            .Append(rule_ids_to_disable.begin(), rule_ids_to_disable.end())
+            .Build();
+    base::Value::List ids_to_enable =
+        ListBuilder()
+            .Append(rule_ids_to_enable.begin(), rule_ids_to_enable.end())
+            .Build();
+
+    constexpr const char kParams[] = R"([{ "rulesetId": $1,
+                                           "disableRuleIds": $2,
+                                           "enableRuleIds": $3 }])";
+    const std::string json_args = content::JsReplace(
+        kParams, ruleset_id, base::Value(std::move(ids_to_disable)),
+        base::Value(std::move(ids_to_enable)));
+
+    auto function =
+        base::MakeRefCounted<DeclarativeNetRequestUpdateStaticRulesFunction>();
+    function->set_extension(&extension);
+    function->set_has_callback(true);
+
+    if (!expected_error) {
+      EXPECT_TRUE(api_test_utils::RunFunction(function.get(), json_args,
+                                              browser_context()));
+      return;
+    }
+
+    EXPECT_EQ(expected_error,
+              api_test_utils::RunFunctionAndReturnError(
+                  function.get(), json_args, browser_context()));
+  }
+
+  base::flat_set<int> GetDisabledRuleIdsFromMatcher(
+      const std::string& ruleset_id_string) {
+    return GetDisabledRuleIdsFromMatcherForTesting(*manager(), *extension(),
+                                                   ruleset_id_string);
+  }
+
+  bool RulesetExists(const std::string& ruleset_id_string) {
+    const DNRManifestData::ManifestIDToRulesetMap& public_id_map =
+        DNRManifestData::GetManifestIDToRulesetMap(*extension());
+    return base::Contains(public_id_map, ruleset_id_string);
+  }
+
+  size_t GetDisabledStaticRuleCount() const {
+    const DeclarativeNetRequestPrefsHelper helper(*extension_prefs_);
+    return helper.GetDisabledStaticRuleCount(extension()->id());
+  }
+
   void VerifyPublicRulesetIDs(
       const Extension& extension,
       const std::vector<std::string>& expected_public_ruleset_ids) {
@@ -453,7 +510,7 @@
   base::FilePath extension_dir_;
   std::unique_ptr<ChromeTestExtensionLoader> loader_;
   scoped_refptr<const Extension> extension_;
-  raw_ptr<const ExtensionPrefs> extension_prefs_ = nullptr;
+  raw_ptr<ExtensionPrefs> extension_prefs_ = nullptr;
 
   // Override the various API rule limits to prevent a timeout.
   base::AutoReset<int> guaranteed_minimum_override_ =
@@ -2273,6 +2330,216 @@
   VerifyGetAvailableStaticRuleCountFunction(*second_extension.get(), 0);
 }
 
+// Test to update disabled rule ids of static rulesets.
+TEST_P(MultipleRulesetsTest, UpdateStaticRulesDisableAndEnableRules) {
+  AddRuleset(CreateRuleset(kId1, 5, 0, true));
+  AddRuleset(CreateRuleset(kId2, 5, 0, true));
+
+  RulesetManagerObserver ruleset_waiter(manager());
+
+  LoadAndExpectSuccess(10, 10);
+
+  ruleset_waiter.WaitForExtensionsWithRulesetsCount(1);
+  VerifyPublicRulesetIDs(*extension(), {kId1, kId2});
+
+  // The initial disabled rule ids set is empty.
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId1), testing::IsEmpty());
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId2), testing::IsEmpty());
+  EXPECT_EQ(0u, GetDisabledStaticRuleCount());
+
+  // Disable rule 1, rule 2 and rule 3 of ruleset1.
+  RunUpdateStaticRulesFunction(*extension(), kId1, {1, 2, 3}, {},
+                               absl::nullopt /* expected_error */);
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId1),
+              UnorderedElementsAre(1, 2, 3));
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId2), testing::IsEmpty());
+  EXPECT_EQ(3u, GetDisabledStaticRuleCount());
+
+  // Disable rule 3, rule 4 and rule 5 of ruleset2.
+  RunUpdateStaticRulesFunction(*extension(), kId2, {3, 4, 5}, {},
+                               absl::nullopt /* expected_error */);
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId1),
+              UnorderedElementsAre(1, 2, 3));
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId2),
+              UnorderedElementsAre(3, 4, 5));
+  EXPECT_EQ(6u, GetDisabledStaticRuleCount());
+
+  // Enable rule 1, rule 2 rule 3 and rule 4 of ruleset1. Enabling rule 4
+  // doesn't make any change since rule 4 is not disabled.
+  RunUpdateStaticRulesFunction(*extension(), kId1, {}, {1, 2, 3, 4},
+                               absl::nullopt /* expected_error */);
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId1), testing::IsEmpty());
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId2),
+              UnorderedElementsAre(3, 4, 5));
+  EXPECT_EQ(3u, GetDisabledStaticRuleCount());
+
+  // Enable rule 3, rule 4, rule 5 and rule 6 of ruleset2. Enabling
+  // rule 6 doesn't make any change since rule 6 is not disabled.
+  RunUpdateStaticRulesFunction(*extension(), kId2, {}, {3, 4, 5, 6},
+                               absl::nullopt /* expected_error */);
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId1), testing::IsEmpty());
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId2), testing::IsEmpty());
+  EXPECT_EQ(0u, GetDisabledStaticRuleCount());
+}
+
+// Test UpdateStaticRules making no change.
+TEST_P(MultipleRulesetsTest, UpdateStaticRulesMakingNoChange) {
+  AddRuleset(CreateRuleset(kId1, 5, 0, true));
+  AddRuleset(CreateRuleset(kId2, 5, 0, true));
+
+  RulesetManagerObserver ruleset_waiter(manager());
+
+  LoadAndExpectSuccess(10, 10);
+
+  ruleset_waiter.WaitForExtensionsWithRulesetsCount(1);
+  VerifyPublicRulesetIDs(*extension(), {kId1, kId2});
+
+  // Disable rule 1, rule 2 and rule 3 of ruleset1.
+  // Disable rule 3, rule 4 and rule 5 of ruleset2.
+  RunUpdateStaticRulesFunction(*extension(), kId1, {1, 2, 3}, {},
+                               absl::nullopt /* expected_error */);
+  RunUpdateStaticRulesFunction(*extension(), kId2, {3, 4, 5}, {},
+                               absl::nullopt /* expected_error */);
+
+  // Updating disabled rule ids with null set doesn't make any change.
+  RunUpdateStaticRulesFunction(*extension(), kId2, {}, {},
+                               absl::nullopt /* expected_error */);
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId1),
+              UnorderedElementsAre(1, 2, 3));
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId2),
+              UnorderedElementsAre(3, 4, 5));
+  EXPECT_EQ(6u, GetDisabledStaticRuleCount());
+
+  // Fails to enable rule 8, rule 9 and rule 10 of ruleset3 since ruleset3 is
+  // invalid ruleset id.
+  RunUpdateStaticRulesFunction(
+      *extension(), kId3, {3, 4, 5}, {},
+      ErrorUtils::FormatErrorMessage(kInvalidRulesetIDError, kId3));
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId1),
+              UnorderedElementsAre(1, 2, 3));
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId2),
+              UnorderedElementsAre(3, 4, 5));
+  EXPECT_FALSE(RulesetExists(kId3));
+  EXPECT_EQ(6u, GetDisabledStaticRuleCount());
+}
+
+// Test to check UpdateStaticRules argument priority.
+TEST_P(MultipleRulesetsTest, UpdateStaticRulesArgumentPriority) {
+  AddRuleset(CreateRuleset(kId1, 5, 0, true));
+  AddRuleset(CreateRuleset(kId2, 5, 0, true));
+
+  RulesetManagerObserver ruleset_waiter(manager());
+
+  LoadAndExpectSuccess(10, 10);
+
+  ruleset_waiter.WaitForExtensionsWithRulesetsCount(1);
+  VerifyPublicRulesetIDs(*extension(), {kId1, kId2});
+
+  // Disable rule 1, rule 2 and rule 3 of ruleset1.
+  // Disable rule 3, rule 4 and rule 5 of ruleset2.
+  RunUpdateStaticRulesFunction(*extension(), kId1, {1, 2, 3}, {},
+                               absl::nullopt /* expected_error */);
+  RunUpdateStaticRulesFunction(*extension(), kId2, {3, 4, 5}, {},
+                               absl::nullopt /* expected_error */);
+
+  // Disable rule 4 and rule 5 of ruleset2 but it doesn't make any change since
+  // they are already disabled. Ignore enabling rule 5 since |ids_to_disable|
+  // takes priority over |ids_to_enable|.
+  RunUpdateStaticRulesFunction(*extension(), kId2, {4, 5}, {5},
+                               absl::nullopt /* expected_error */);
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId1),
+              UnorderedElementsAre(1, 2, 3));
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId2),
+              UnorderedElementsAre(3, 4, 5));
+  EXPECT_EQ(6u, GetDisabledStaticRuleCount());
+
+  // Enable rule 4 and disable rule 5, rule 6 and rule 7 of ruleset2. Ignore
+  // enabling rule 5 since |ids_to_disable| takes priority over |ids_to_enable|.
+  // Disabling rule 5 doesn't make any change since rule 5 is already disabled.
+  RunUpdateStaticRulesFunction(*extension(), kId2, {5, 6, 7}, {4, 5},
+                               absl::nullopt /* expected_error */);
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId1),
+              UnorderedElementsAre(1, 2, 3));
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId2),
+              UnorderedElementsAre(3, 5, 6, 7));
+  EXPECT_EQ(7u, GetDisabledStaticRuleCount());
+}
+
+// Test to check UpdateStaticRules error when rule limit exceeded.
+TEST_P(MultipleRulesetsTest, UpdateStaticRulesErrorWhenRuleLimitExceeded) {
+  // Set the disabled static rule limit as 6.
+  ScopedRuleLimitOverride scoped_disabled_static_rule_limit_override =
+      CreateScopedDisabledStaticRuleLimitOverrideForTesting(6);
+
+  AddRuleset(CreateRuleset(kId1, 5, 0, true));
+  AddRuleset(CreateRuleset(kId2, 5, 0, true));
+
+  RulesetManagerObserver ruleset_waiter(manager());
+
+  LoadAndExpectSuccess(10, 10);
+
+  ruleset_waiter.WaitForExtensionsWithRulesetsCount(1);
+  VerifyPublicRulesetIDs(*extension(), {kId1, kId2});
+
+  // Disable rule 1, rule 2 and rule 3 of ruleset1.
+  // Disable rule 3, rule 4 and rule 5 of ruleset2.
+  RunUpdateStaticRulesFunction(*extension(), kId1, {1, 2, 3}, {},
+                               absl::nullopt /* expected_error */);
+  RunUpdateStaticRulesFunction(*extension(), kId2, {3, 4, 5}, {},
+                               absl::nullopt /* expected_error */);
+
+  // Enable rule 1 and disable rule 3, rule 4 and rule 5 of ruleset2. Ignore
+  // enabling rule 3 since |ids_to_disable| takes priority over |ids_to_enable|.
+  // This operation fails since it exceeds the disabled static rule count limit.
+  RunUpdateStaticRulesFunction(*extension(), kId1, {3, 4, 5}, {1, 3},
+                               kDisabledStaticRuleCountExceeded);
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId1),
+              UnorderedElementsAre(1, 2, 3));
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId2),
+              UnorderedElementsAre(3, 4, 5));
+  EXPECT_EQ(6u, GetDisabledStaticRuleCount());
+}
+
+// Test the disabled rule ids when the extension is disabled and enabled.
+TEST_P(MultipleRulesetsTest,
+       KeepDisabledStaticRulesWhenExtensionDisabledAndEnabled) {
+  AddRuleset(CreateRuleset(kId1, 5, 0, true));
+  AddRuleset(CreateRuleset(kId2, 5, 0, true));
+
+  RulesetManagerObserver ruleset_waiter(manager());
+
+  LoadAndExpectSuccess(10, 10);
+
+  ruleset_waiter.WaitForExtensionsWithRulesetsCount(1);
+  VerifyPublicRulesetIDs(*extension(), {kId1, kId2});
+
+  // Disable rule 1, rule 2 and rule 3 of ruleset1.
+  // Disable rule 3, rule 4 and rule 5 of ruleset2.
+  RunUpdateStaticRulesFunction(*extension(), kId1, {1, 2, 3}, {},
+                               absl::nullopt /* expected_error */);
+  RunUpdateStaticRulesFunction(*extension(), kId2, {3, 4, 5}, {},
+                               absl::nullopt /* expected_error */);
+
+  // Check disabled rules after disabling and enabling extension.
+  auto extension_id = extension()->id();
+  service()->DisableExtension(extension_id,
+                              disable_reason::DISABLE_USER_ACTION);
+  ruleset_waiter.WaitForExtensionsWithRulesetsCount(0);
+  TestExtensionRegistryObserver registry_observer(registry());
+  service()->EnableExtension(extension_id);
+  scoped_refptr<const Extension> extension =
+      registry_observer.WaitForExtensionLoaded();
+  ASSERT_TRUE(extension);
+  ASSERT_EQ(extension_id, extension->id());
+  content::RunAllTasksUntilIdle();
+
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId1),
+              UnorderedElementsAre(1, 2, 3));
+  EXPECT_THAT(GetDisabledRuleIdsFromMatcher(kId2),
+              UnorderedElementsAre(3, 4, 5));
+  EXPECT_EQ(6u, GetDisabledStaticRuleCount());
+}
+
 // Test that an extension's allocation is reclaimed when unloaded in certain
 // scenarios.
 TEST_P(MultipleRulesetsTest, ReclaimAllocationOnUnload) {
diff --git a/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc b/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc
index a146ddf6..b36d4e2 100644
--- a/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc
+++ b/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc
@@ -31,8 +31,7 @@
     : custom_dictionary_(nullptr),
       context_(context),
       listening_spellcheck_(false),
-      listening_input_method_(false),
-      profile_added_(false) {
+      listening_input_method_(false) {
   // Register with the event router so we know when renderers are listening to
   // our events. We first check and see if there *is* an event router, because
   // some unit tests try to create all context services, but don't initialize
@@ -50,12 +49,8 @@
   event_router->RegisterObserver(
       this, language_settings_private::OnInputMethodRemoved::kEventName);
 
-  // SpellcheckService cannot be created until Profile::DoFinalInit() has been
-  // called. http://crbug.com/171406
-  // TODO(crbug.com/1038437): Investigate if this is still required.
-  Profile* profile = Profile::FromBrowserContext(context_);
-  profile_observation_.Observe(profile);
-  pref_change_registrar_.Init(profile->GetPrefs());
+  pref_change_registrar_.Init(
+      Profile::FromBrowserContext(context_)->GetPrefs());
 
   StartOrStopListeningForSpellcheckChanges();
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -115,8 +110,6 @@
     listening_input_method_ = false;
   }
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
-  profile_observation_.Reset();
 }
 
 void LanguageSettingsPrivateDelegate::OnListenerAdded(
@@ -149,14 +142,6 @@
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 }
 
-void LanguageSettingsPrivateDelegate::OnProfileInitializationComplete(
-    Profile* profile) {
-  DCHECK(profile_observation_.IsObservingSource(profile));
-  profile_observation_.Reset();
-  profile_added_ = true;
-  StartOrStopListeningForSpellcheckChanges();
-}
-
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 void LanguageSettingsPrivateDelegate::InputMethodChanged(
     ash::input_method::InputMethodManager* manager,
@@ -226,10 +211,8 @@
   EventRouter::Get(context_)->BroadcastEvent(std::move(extension_event));
 }
 
-void LanguageSettingsPrivateDelegate::RefreshDictionaries(
-    bool was_listening, bool should_listen) {
-  if (!profile_added_)
-    return;
+void LanguageSettingsPrivateDelegate::RefreshDictionaries(bool was_listening,
+                                                          bool should_listen) {
   if (was_listening)
     RemoveDictionaryObservers();
   hunspell_dictionaries_.clear();
diff --git a/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.h b/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.h
index bbdba0d0..83e1c76 100644
--- a/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.h
+++ b/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.h
@@ -10,9 +10,7 @@
 
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
-#include "base/scoped_observation.h"
 #include "build/chromeos_buildflags.h"
-#include "chrome/browser/profiles/profile_observer.h"
 #include "chrome/browser/spellchecker/spellcheck_custom_dictionary.h"
 #include "chrome/browser/spellchecker/spellcheck_hunspell_dictionary.h"
 #include "chrome/common/extensions/api/language_settings_private.h"
@@ -35,7 +33,6 @@
 class LanguageSettingsPrivateDelegate
     : public KeyedService,
       public EventRouter::Observer,
-      public ProfileObserver,
 #if BUILDFLAG(IS_CHROMEOS_ASH)
       public ash::input_method::InputMethodManager::Observer,
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
@@ -60,9 +57,6 @@
   // Retry downloading the spellcheck dictionary.
   virtual void RetryDownloadHunspellDictionary(const std::string& language);
 
-  // ProfileObserver implementation.
-  void OnProfileInitializationComplete(Profile* profile) override;
-
  protected:
   explicit LanguageSettingsPrivateDelegate(content::BrowserContext* context);
 
@@ -142,12 +136,7 @@
   // True if there are observers listening for input method events.
   bool listening_input_method_;
 
-  // True if the profile has finished initializing.
-  bool profile_added_;
-
   PrefChangeRegistrar pref_change_registrar_;
-
-  base::ScopedObservation<Profile, ProfileObserver> profile_observation_{this};
 };
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate_unittest.cc b/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate_unittest.cc
index 22f83e5..d292e9fd 100644
--- a/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate_unittest.cc
+++ b/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate_unittest.cc
@@ -72,7 +72,6 @@
     dictionary->RemoveObserver(this);
 
     delegate_.reset(LanguageSettingsPrivateDelegate::Create(browser_context()));
-    delegate_->OnProfileInitializationComplete(profile());
   }
 
   void TearDown() override {
diff --git a/chrome/browser/metrics/perf/metric_provider_unittest.cc b/chrome/browser/metrics/perf/metric_provider_unittest.cc
index 1de888a..ba7c08e5 100644
--- a/chrome/browser/metrics/perf/metric_provider_unittest.cc
+++ b/chrome/browser/metrics/perf/metric_provider_unittest.cc
@@ -16,10 +16,10 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/sync/sync_service_factory.h"
-#include "chrome/common/chrome_constants.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/base/testing_profile_manager.h"
+#include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
 #include "components/sync/base/user_selectable_type.h"
 #include "components/sync/test/test_sync_service.h"
 #include "content/public/test/browser_task_environment.h"
@@ -315,12 +315,14 @@
     // initialized on Chrome OS. So creating the Default profile here to reflect
     // this. The Default profile is skipped when getting the sync settings from
     // user profile(s).
-    testing_profile_manager_->CreateTestingProfile(chrome::kInitialProfile);
+    testing_profile_manager_->CreateTestingProfile(
+        ash::BrowserContextHelper::kSigninBrowserContextBaseName);
     // Also add two non-regular profiles that might appear on ChromeOS. They
     // always disable sync and are skipped when getting sync settings.
     testing_profile_manager_->CreateTestingProfile(
-        chrome::kLockScreenAppProfile);
-    testing_profile_manager_->CreateTestingProfile(chrome::kLockScreenProfile);
+        ash::BrowserContextHelper::kLockScreenAppBrowserContextBaseName);
+    testing_profile_manager_->CreateTestingProfile(
+        ash::BrowserContextHelper::kLockScreenBrowserContextBaseName);
     metric_provider_ = std::make_unique<TestMetricProvider>(
         std::make_unique<TestMetricCollector>(test_params),
         testing_profile_manager_->profile_manager());
diff --git a/chrome/browser/policy/test/content_settings_policy_browsertest.cc b/chrome/browser/policy/test/content_settings_policy_browsertest.cc
index 0426197..7576a61 100644
--- a/chrome/browser/policy/test/content_settings_policy_browsertest.cc
+++ b/chrome/browser/policy/test/content_settings_policy_browsertest.cc
@@ -250,25 +250,25 @@
   // |kTestOrigin| to access the device described by |device_info|.
   PolicyMap policies;
 
-  base::Value device_value(base::Value::Type::DICTIONARY);
-  device_value.SetKey("vendor_id", base::Value(0));
-  device_value.SetKey("product_id", base::Value(0));
+  base::Value::Dict device_value;
+  device_value.Set("vendor_id", 0);
+  device_value.Set("product_id", 0);
 
-  base::Value devices_value(base::Value::Type::LIST);
+  base::Value::List devices_value;
   devices_value.Append(std::move(device_value));
 
-  base::Value urls_value(base::Value::Type::LIST);
+  base::Value::List urls_value;
   urls_value.Append(base::Value("https://foo.com"));
 
-  base::Value entry(base::Value::Type::DICTIONARY);
-  entry.SetKey("devices", std::move(devices_value));
-  entry.SetKey("urls", std::move(urls_value));
+  base::Value::Dict entry;
+  entry.Set("devices", std::move(devices_value));
+  entry.Set("urls", std::move(urls_value));
 
-  base::Value policy_value(base::Value::Type::LIST);
+  base::Value::List policy_value;
   policy_value.Append(std::move(entry));
 
   SetPolicy(&policies, key::kWebUsbAllowDevicesForUrls,
-            std::move(policy_value));
+            base::Value(std::move(policy_value)));
   UpdateProviderPolicy(policies);
 
   EXPECT_TRUE(context->HasDevicePermission(kTestOrigin, device_info));
@@ -298,11 +298,11 @@
   EXPECT_FALSE(content_settings::ShouldAllowInsecurePrivateNetworkRequests(
       settings_map, url::Origin::Create(GURL("http://bleep.com"))));
 
-  base::Value allowlist(base::Value::Type::LIST);
+  base::Value::List allowlist;
   allowlist.Append(base::Value("http://bleep.com"));
   allowlist.Append(base::Value("http://woohoo.com:1234"));
   SetPolicy(&policies, key::kInsecurePrivateNetworkRequestsAllowedForUrls,
-            std::move(allowlist));
+            base::Value(std::move(allowlist)));
   UpdateProviderPolicy(policies);
 
   // Domain is not the in allowlist.
@@ -401,26 +401,28 @@
   }
 
   void AllowUrl(const char* url) {
-    base::Value policy_value(base::Value::Type::LIST);
+    base::Value::List policy_value;
     policy_value.Append(url);
-    SetPolicy(&policies_, key::kSensorsAllowedForUrls, std::move(policy_value));
+    SetPolicy(&policies_, key::kSensorsAllowedForUrls,
+              base::Value(std::move(policy_value)));
     UpdateProviderPolicy(policies_);
   }
 
   void BlockUrl(const char* url) {
-    base::Value policy_value(base::Value::Type::LIST);
+    base::Value::List policy_value;
     policy_value.Append(url);
-    SetPolicy(&policies_, key::kSensorsBlockedForUrls, std::move(policy_value));
+    SetPolicy(&policies_, key::kSensorsBlockedForUrls,
+              base::Value(std::move(policy_value)));
     UpdateProviderPolicy(policies_);
   }
 
   void ClearLists() {
-    base::Value policy_value_allow(base::Value::Type::LIST);
-    base::Value policy_value_block(base::Value::Type::LIST);
+    base::Value::List policy_value_allow;
+    base::Value::List policy_value_block;
     SetPolicy(&policies_, key::kSensorsAllowedForUrls,
-              std::move(policy_value_allow));
+              base::Value(std::move(policy_value_allow)));
     SetPolicy(&policies_, key::kSensorsBlockedForUrls,
-              std::move(policy_value_block));
+              base::Value(std::move(policy_value_block)));
     UpdateProviderPolicy(policies_);
   }
 
diff --git a/chrome/browser/profiles/BUILD.gn b/chrome/browser/profiles/BUILD.gn
index 6a61c35..3dd9020 100644
--- a/chrome/browser/profiles/BUILD.gn
+++ b/chrome/browser/profiles/BUILD.gn
@@ -64,7 +64,10 @@
     deps += [ "//extensions/browser" ]
   }
   if (is_chromeos_ash) {
-    deps += [ "//ash/constants" ]
+    deps += [
+      "//ash/constants",
+      "//chromeos/ash/components/browser_context_helper",
+    ]
   }
   if (is_chromeos_lacros) {
     deps += [
diff --git a/chrome/browser/profiles/profile_testing_helper.cc b/chrome/browser/profiles/profile_testing_helper.cc
index 4b4abbbe..41d7bb6 100644
--- a/chrome/browser/profiles/profile_testing_helper.cc
+++ b/chrome/browser/profiles/profile_testing_helper.cc
@@ -4,11 +4,14 @@
 
 #include "chrome/browser/profiles/profile_testing_helper.h"
 
-#include "chrome/browser/ash/profiles/profile_helper.h"
-#include "chrome/common/chrome_constants.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/ash/profiles/profile_helper.h"
+#include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
 ProfileTestingHelper::ProfileTestingHelper()
     : manager_(TestingBrowserProcess::GetGlobal()) {}
 
@@ -49,7 +52,8 @@
 #endif  // !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_ANDROID)
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  signin_profile_ = manager_.CreateTestingProfile(chrome::kInitialProfile);
+  signin_profile_ = manager_.CreateTestingProfile(
+      ash::BrowserContextHelper::kSigninBrowserContextBaseName);
   ASSERT_TRUE(signin_profile_);
   ASSERT_TRUE(ash::ProfileHelper::IsSigninProfile(signin_profile_));
   ASSERT_FALSE(ash::ProfileHelper::IsUserProfile(signin_profile_));
@@ -60,8 +64,8 @@
   ASSERT_FALSE(ash::ProfileHelper::IsUserProfile(signin_profile_otr_));
   ASSERT_TRUE(signin_profile_otr_->IsOffTheRecord());
 
-  lockscreen_profile_ =
-      manager_.CreateTestingProfile(chrome::kLockScreenProfile);
+  lockscreen_profile_ = manager_.CreateTestingProfile(
+      ash::BrowserContextHelper::kLockScreenBrowserContextBaseName);
   ASSERT_TRUE(lockscreen_profile_);
   ASSERT_TRUE(ash::ProfileHelper::IsLockScreenProfile(lockscreen_profile_));
   ASSERT_FALSE(ash::ProfileHelper::IsUserProfile(lockscreen_profile_));
@@ -72,8 +76,8 @@
   ASSERT_FALSE(ash::ProfileHelper::IsUserProfile(lockscreen_profile_otr_));
   ASSERT_TRUE(lockscreen_profile_otr_->IsOffTheRecord());
 
-  lockscreenapp_profile_ =
-      manager_.CreateTestingProfile(chrome::kLockScreenAppProfile);
+  lockscreenapp_profile_ = manager_.CreateTestingProfile(
+      ash::BrowserContextHelper::kLockScreenAppBrowserContextBaseName);
   ASSERT_TRUE(lockscreenapp_profile_);
   ASSERT_TRUE(
       ash::ProfileHelper::IsLockScreenAppProfile(lockscreenapp_profile_));
diff --git a/chrome/browser/profiles/profile_types_ash.cc b/chrome/browser/profiles/profile_types_ash.cc
index 5e8820e..ac9c68b 100644
--- a/chrome/browser/profiles/profile_types_ash.cc
+++ b/chrome/browser/profiles/profile_types_ash.cc
@@ -6,23 +6,7 @@
 
 #include "base/files/file_path.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/common/chrome_constants.h"
-
-namespace {
-
-bool IsSigninProfilePath(const base::FilePath& profile_path) {
-  return profile_path.value() == chrome::kInitialProfile;
-}
-
-bool IsLockScreenAppProfilePath(const base::FilePath& profile_path) {
-  return profile_path.value() == chrome::kLockScreenAppProfile;
-}
-
-bool IsLockScreenProfilePath(const base::FilePath& profile_path) {
-  return profile_path.value() == chrome::kLockScreenProfile;
-}
-
-}  // namespace
+#include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
 
 bool IsUserProfile(const Profile* profile) {
   return !IsSigninProfile(profile) && !IsLockScreenAppProfile(profile) &&
@@ -30,19 +14,27 @@
 }
 
 bool IsUserProfilePath(const base::FilePath& profile_path) {
-  return !IsSigninProfilePath(profile_path) &&
-         !IsLockScreenAppProfilePath(profile_path) &&
-         !IsLockScreenProfilePath(profile_path);
+  const auto& value = profile_path.value();
+  return value != ash::BrowserContextHelper::kSigninBrowserContextBaseName &&
+         value !=
+             ash::BrowserContextHelper::kLockScreenAppBrowserContextBaseName &&
+         value != ash::BrowserContextHelper::kLockScreenBrowserContextBaseName;
 }
 
 bool IsLockScreenProfile(const Profile* profile) {
-  return profile && IsLockScreenProfilePath(profile->GetBaseName());
+  return profile &&
+         profile->GetBaseName().value() ==
+             ash::BrowserContextHelper::kLockScreenBrowserContextBaseName;
 }
 
 bool IsLockScreenAppProfile(const Profile* profile) {
-  return profile && IsLockScreenAppProfilePath(profile->GetBaseName());
+  return profile &&
+         profile->GetBaseName().value() ==
+             ash::BrowserContextHelper::kLockScreenAppBrowserContextBaseName;
 }
 
 bool IsSigninProfile(const Profile* profile) {
-  return profile && IsSigninProfilePath(profile->GetBaseName());
+  return profile &&
+         profile->GetBaseName().value() ==
+             ash::BrowserContextHelper::kSigninBrowserContextBaseName;
 }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js
index 47670092..a7fbe02c 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js
@@ -671,32 +671,6 @@
   }
 
   /** @override */
-  formatAsStateValue_(data, token, options) {
-    const buff = data.outputBuffer;
-    const node = data.node;
-    const formatLog = data.outputFormatLogger;
-
-    options.annotation.push('state');
-    const stateInfo = outputTypes.OUTPUT_STATE_INFO[token];
-    let resolvedInfo = {};
-    resolvedInfo = node.state[/** @type {StateType} */ (token)] ? stateInfo.on :
-                                                                  stateInfo.off;
-    if (!resolvedInfo) {
-      return;
-    }
-    if (this.formatOptions_.speech && resolvedInfo.earcon) {
-      options.annotation.push(
-          new outputTypes.OutputEarconAction(resolvedInfo.earcon),
-          node.location || undefined);
-    }
-    const msgId = this.formatOptions_.braille ? resolvedInfo.msgId + '_brl' :
-                                                resolvedInfo.msgId;
-    const msg = Msgs.getMsg(msgId);
-    this.append_(buff, msg, options);
-    formatLog.writeTokenWithValue(token, msg);
-  }
-
-  /** @override */
   formatPhoneticReading_(data) {
     const buff = data.outputBuffer;
     const node = data.node;
@@ -1808,6 +1782,11 @@
   get formatAsBraille() {
     return this.formatOptions_.braille;
   }
+
+  /** @override */
+  get formatAsSpeech() {
+    return this.formatOptions_.speech;
+  }
 }
 
 /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_formatter.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_formatter.js
index f7a7fa03..4991744 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_formatter.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_formatter.js
@@ -106,7 +106,7 @@
     } else if (this.params_.node[token] !== undefined) {
       this.formatAsFieldAccessor_(this.params_, token, options);
     } else if (outputTypes.OUTPUT_STATE_INFO[token]) {
-      this.output_.formatAsStateValue_(this.params_, token, options);
+      this.formatAsStateValue_(this.params_, token, options);
     } else if (token === 'phoneticReading') {
       this.output_.formatPhoneticReading_(this.params_);
     } else if (token === 'listNestedLevel') {
@@ -208,6 +208,37 @@
    * @param {!{annotation: Array<*>, isUnique: (boolean|undefined)}} options
    * @private
    */
+  formatAsStateValue_(data, token, options) {
+    const buff = data.outputBuffer;
+    const node = data.node;
+    const formatLog = data.outputFormatLogger;
+
+    options.annotation.push('state');
+    const stateInfo = outputTypes.OUTPUT_STATE_INFO[token];
+    let resolvedInfo = {};
+    resolvedInfo = node.state[/** @type {StateType} */ (token)] ? stateInfo.on :
+                                                                  stateInfo.off;
+    if (!resolvedInfo) {
+      return;
+    }
+    if (this.output_.formatAsSpeech && resolvedInfo.earcon) {
+      options.annotation.push(
+          new outputTypes.OutputEarconAction(resolvedInfo.earcon),
+          node.location || undefined);
+    }
+    const msgId = this.output_.formatAsBraille ? resolvedInfo.msgId + '_brl' :
+                                                 resolvedInfo.msgId;
+    const msg = Msgs.getMsg(msgId);
+    this.output_.append_(buff, msg, options);
+    formatLog.writeTokenWithValue(token, msg);
+  }
+
+  /**
+   * @param {!outputTypes.OutputFormattingData} data
+   * @param {string} token
+   * @param {!{annotation: Array<*>, isUnique: (boolean|undefined)}} options
+   * @private
+   */
   formatCellIndexText_(data, token, options) {
     const buff = data.outputBuffer;
     const node = data.node;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_interface.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_interface.js
index 36831484..feda0f0 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_interface.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_interface.js
@@ -51,13 +51,6 @@
   /**
    * @param {!outputTypes.OutputFormattingData} data
    * @param {string} token
-   * @param {!{annotation: Array<*>, isUnique: (boolean|undefined)}} options
-   */
-  formatAsStateValue_(data, token, options) {}
-
-  /**
-   * @param {!outputTypes.OutputFormattingData} data
-   * @param {string} token
    * @param {!OutputFormatTree} tree
    * @param {!{annotation: Array<*>, isUnique: (boolean|undefined)}} options
    */
@@ -118,4 +111,7 @@
 
   /** @return {boolean} */
   get formatAsBraille() {}
+
+  /** @return {boolean} */
+  get formatAsSpeech() {}
 }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_tab_menu_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_tab_menu_background.js
index 448c2a6..e7087cc 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_tab_menu_background.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_tab_menu_background.js
@@ -10,6 +10,16 @@
 import {Msgs} from '../../common/msgs.js';
 import {PanelTabMenuItemData} from '../../common/panel_menu_data.js';
 
+async function getLastFocusedWindow() {
+  return new Promise(resolve => chrome.windows.getLastFocused(w => {
+    // lastError will be set if there is no last focused window.
+    if (chrome.runtime.lastError) {
+      w = {};
+    }
+    resolve(w);
+  }));
+}
+
 export class PanelTabMenuBackground {
   /**
    * @param {number} windowId
@@ -26,8 +36,7 @@
   /** @return {!Promise<!Array<!PanelTabMenuItemData>>} */
   static async getTabMenuData() {
     const menuData = [];
-    const lastFocusedWindow =
-        await new Promise(resolve => chrome.windows.getLastFocused(resolve));
+    const lastFocusedWindow = await getLastFocusedWindow();
     const windows = await new Promise(
         resolve => chrome.windows.getAll({populate: true}, resolve));
     for (const w of windows) {
diff --git a/chrome/browser/resources/chromeos/accessibility/common/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/common/BUILD.gn
index 76c4fab..5e6e6416 100644
--- a/chrome/browser/resources/chromeos/accessibility/common/BUILD.gn
+++ b/chrome/browser/resources/chromeos/accessibility/common/BUILD.gn
@@ -181,18 +181,13 @@
     "$root_out_dir/locales/en-US.pak",
     "$root_out_dir/locales/fr.pak",
     "$root_out_dir/resources.pak",
-    "$root_out_dir/resources/chromeos/accessibility/chromevox/",
-    "$root_out_dir/test_data/chrome/browser/resources/chromeos/accessibility/chromevox/",
 
     # The test uses data from the original location.
-    "//chrome/browser/resources/chromeos/accessibility/chromevox/",
     "//chrome/browser/resources/chromeos/accessibility/common/",
-    "//third_party/chromevox/",
   ]
   data += js2gtest_js_libraries
 }
 
-# Note that this suite of tests still uses ChromeVox's background page as a runtime environment. There should not be anything specific to ChromeVox within the tests themselves though.
 js2gtest("accessibility_tests") {
   test_type = "extension"
   sources = [
@@ -220,7 +215,6 @@
   ]
 
   gen_include_files = [
-    "../select_to_speak/select_to_speak_e2e_test_base.js",
     "testing/accessibility_test_base.js",
     "testing/assert_additions.js",
     "testing/callback_helper.js",
@@ -228,6 +222,7 @@
     "testing/doc_utils.js",
     "testing/e2e_test_base.js",
     "testing/mock_storage.js",
+    "testing/snippets.js",
   ]
 
   if (is_chromeos_ash) {
diff --git a/chrome/browser/resources/chromeos/emoji_picker/BUILD.gn b/chrome/browser/resources/chromeos/emoji_picker/BUILD.gn
index b8da072..6eab14df 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/BUILD.gn
+++ b/chrome/browser/resources/chromeos/emoji_picker/BUILD.gn
@@ -76,6 +76,7 @@
     ":emoji_data",
     ":emoji_data_remaining",
     ":emoticon_data",
+    ":gif_test_data",
     ":symbol_data",
     ":symbol_test_data",
   ]
@@ -191,6 +192,11 @@
   outputs = [ "$target_gen_dir/symbol_test_ordering.json" ]
 }
 
+copy("gif_test_data") {
+  sources = [ "./gif_test_ordering.json" ]
+  outputs = [ "$target_gen_dir/gif_test_ordering.json" ]
+}
+
 html_to_wrapper("html_wrapper_files") {
   in_files = html_files
   out_folder = preprocessed_folder
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_ordering.grdp b/chrome/browser/resources/chromeos/emoji_picker/emoji_ordering.grdp
index 0aa2eb1..47fa671 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/emoji_ordering.grdp
+++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_ordering.grdp
@@ -8,4 +8,5 @@
       <include name="IDR_EMOJI_PICKER_EMOTICON_TEST_ORDERING_JSON" compress="gzip" file="${root_gen_dir}/chrome/browser/resources/chromeos/emoji_picker/emoticon_test_ordering.json" resource_path="emoticon_test_ordering.json" use_base_dir="false" type="chrome_html" />
       <include name="IDR_EMOJI_PICKER_SYMBOL_ORDERING_JSON" compress="gzip" file="${root_gen_dir}/chrome/browser/resources/chromeos/emoji_picker/symbol_ordering.json" resource_path="symbol_ordering.json" use_base_dir="false" type="chrome_html" />
       <include name="IDR_EMOJI_PICKER_SYMBOL_TEST_ORDERING_JSON" compress="gzip" file="${root_gen_dir}/chrome/browser/resources/chromeos/emoji_picker/symbol_test_ordering.json" resource_path="symbol_test_ordering.json" use_base_dir="false" type="chrome_html" />
+      <include name="IDR_EMOJI_PICKER_GIF_TEST_ORDERING_JSON" compress="gzip" file="${root_gen_dir}/chrome/browser/resources/chromeos/emoji_picker/gif_test_ordering.json" resource_path="gif_test_ordering.json" use_base_dir="false" type="chrome_html" />
 </grit-part>
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.ts b/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.ts
index 49248cd..7fe198b 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.ts
+++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.ts
@@ -23,7 +23,7 @@
 import * as events from './events.js';
 import {CATEGORY_METADATA, CATEGORY_TABS, EMOJI_GROUP_TABS, GIF_CATEGORY_METADATA, gifCategoryTabs, SUBCATEGORY_TABS, TABS_CATEGORY_START_INDEX} from './metadata_extension.js';
 import {RecentlyUsedStore} from './store.js';
-import {CategoryEnum, EmojiGroupData, EmojiGroupElement, EmojiVariants, SubcategoryData} from './types.js';
+import {CategoryEnum, EmojiGroupData, EmojiGroupElement, EmojiVariants, GifSubcategoryData, SubcategoryData} from './types.js';
 
 export class EmojiPicker extends PolymerElement {
   static get is() {
@@ -223,7 +223,7 @@
         await Promise
             .all(
                 [
-                  this.fetchOrderingData(firstResult.url),
+                  this.fetchOrderingData<EmojiGroupData>(firstResult.url),
                   this.apiProxy.getFeatureList().then(
                       (response: {featureList: number[]}) =>
                           this.setActiveFeatures(response.featureList)),
@@ -240,17 +240,14 @@
     });
 
     if (this.gifSupport) {
-      // TODO (b/263062502): Get data from API instead.
-      const gifCategoriesData = ['excited', 'happy'];
-
-      const gifCategoriesTabs = gifCategoriesData.map(
-          (categoryData: string) => ({name: categoryData}));
-
+      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: gifCategoriesTabs,
+        gif: categories,
       };
-
       this.allCategoryTabs = gifCategoryTabs(categoryTabs);
     }
 
@@ -308,7 +305,7 @@
     this.gifSupport = featureList.includes(Feature.EMOJI_PICKER_GIF_SUPPORT);
   }
 
-  fetchOrderingData(url: string): Promise<EmojiGroupData> {
+  fetchOrderingData<T>(url: string): Promise<T> {
     return new Promise((resolve) => {
       const xhr = new XMLHttpRequest();
       xhr.onloadend = () => resolve(JSON.parse(xhr.responseText));
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 ec9737c..56b5110 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
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 import {PageHandlerFactory, PageHandlerRemote} from './emoji_picker.mojom-webui.js';
+import {GifSubcategoryData} from './types.js';
 
 /** @interface */
 export interface EmojiPickerApiProxy {
@@ -12,6 +13,16 @@
   isIncognitoTextField(): Promise<{incognito: boolean}>;
 
   getFeatureList(): Promise<{featureList: number[]}>;
+
+  getCategories(): Promise<{categories: GifSubcategoryData[]}>;
+}
+
+// https://developers.google.com/tenor/guides/response-objects-and-errors#category-object
+declare interface CategoryObject {
+  searchterm: string;  // the search term that corresponds to the category
+  path: string;        // the search url to request
+  image: string;       // a url to the category's example GIF
+  name: string;        // category name
 }
 
 export class EmojiPickerApiProxyImpl implements EmojiPickerApiProxy {
@@ -41,6 +52,15 @@
     return this.handler.getFeatureList();
   }
 
+  /** @override */
+  async getCategories(): Promise<{categories: GifSubcategoryData[]}> {
+    const {categories} = await this.handler.getCategories();
+    return {
+      categories: JSON.parse(categories)
+                      .tags.map((tag: CategoryObject) => ({name: tag.name})),
+    };
+  }
+
   static getInstance(): EmojiPickerApiProxy {
     if (EmojiPickerApiProxyImpl.instance === null) {
       EmojiPickerApiProxyImpl.instance = new EmojiPickerApiProxyImpl();
diff --git a/chrome/browser/resources/chromeos/emoji_picker/gif_test_ordering.json b/chrome/browser/resources/chromeos/emoji_picker/gif_test_ordering.json
new file mode 100644
index 0000000..00867f0
--- /dev/null
+++ b/chrome/browser/resources/chromeos/emoji_picker/gif_test_ordering.json
@@ -0,0 +1 @@
+[{"name":"#EXCITED"},{"name":"#ANGRY"},{"name":"#CRY"},{"name":"#CHILL OUT"},{"name":"#KISS"}]
diff --git a/chrome/browser/resources/chromeos/emoji_picker/metadata_extension.ts b/chrome/browser/resources/chromeos/emoji_picker/metadata_extension.ts
index 620040d4..0fd8e67b 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/metadata_extension.ts
+++ b/chrome/browser/resources/chromeos/emoji_picker/metadata_extension.ts
@@ -10,7 +10,7 @@
  */
 
 
-import {CategoryEnum, SubcategoryData} from './types.js';
+import {CategoryEnum, GifSubcategoryData, SubcategoryData} from './types.js';
 
 const RECENTLY_USED_NAME = 'Recently used';
 
@@ -173,12 +173,8 @@
     CATEGORY_TABS,
 );
 
-export const gifCategoryTabs = (categories: Record<string, Array<{
-                                                     name: string,
-                                                     pagination?: number,
-                                                     icon?: string,
-                                                   }>>) =>
-    makeGroupTabs(
+export const gifCategoryTabs =
+    (categories: Record<string, GifSubcategoryData[]>) => makeGroupTabs(
         GIF_CATEGORY_METADATA.map(item => item.name),
         categories,
     );
diff --git a/chrome/browser/resources/chromeos/emoji_picker/types.ts b/chrome/browser/resources/chromeos/emoji_picker/types.ts
index e1e2bc2..d01bc7f 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/types.ts
+++ b/chrome/browser/resources/chromeos/emoji_picker/types.ts
@@ -62,3 +62,9 @@
   SYMBOL = 'symbol',
   GIF = 'gif',
 }
+
+export interface GifSubcategoryData {
+  name: string;
+  pagination?: number;
+  icon?: string;
+}
diff --git a/chrome/browser/resources/chromeos/login/components/gaia_dialog.js b/chrome/browser/resources/chromeos/login/components/gaia_dialog.js
index 9fd630a72..44f4681a 100644
--- a/chrome/browser/resources/chromeos/login/components/gaia_dialog.js
+++ b/chrome/browser/resources/chromeos/login/components/gaia_dialog.js
@@ -326,7 +326,7 @@
         chrome.send(
             'metricsHandler:recordBooleanHistogram',
             [CHROMEOS_GAIA_PASSWORD_METRIC, false]);
-        chrome.send('login.GaiaSigninScreen.userActed', ['passwordEntered']);
+        chrome.send('passwordEntered');
       },
       'authCompleted': (e) => {
         // Only record the metric for Gaia flow without 3rd-party SAML IdP.
diff --git a/chrome/browser/resources/chromeos/login/cr_ui.js b/chrome/browser/resources/chromeos/login/cr_ui.js
index 9b85c2a6..9f449ff 100644
--- a/chrome/browser/resources/chromeos/login/cr_ui.js
+++ b/chrome/browser/resources/chromeos/login/cr_ui.js
@@ -143,9 +143,7 @@
       chrome.send('OobeTestApi.skipToLoginForTesting');
 
       if (!enterpriseEnroll) {
-        chrome.send(
-            'login.GaiaSigninScreen.userActed',
-            ['completeLoginForTesting', gaia_id, username, password, false]);
+        chrome.send('completeLogin', [gaia_id, username, password, false]);
       } else {
         waitForOobeScreen('gaia-signin', function() {
           // TODO(crbug.com/1100910): migrate logic to dedicated test api.
diff --git a/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.js b/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.js
index ff521f0a..23f5353c 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.js
@@ -611,7 +611,7 @@
     this.authenticatorParams_ = params;
 
     this.loadAuthenticator_(params.doSamlRedirect);
-    this.userActed('gaiaLoaded');
+    chrome.send('authExtensionLoaded');
   }
 
   /**
@@ -765,7 +765,7 @@
    * @private
    */
   samlApiUsed_(isThirdPartyIdP) {
-    this.userActed(['usingSAMLAPI', isThirdPartyIdP]);
+    chrome.send('usingSAMLAPI', [isThirdPartyIdP]);
   }
 
   /**
@@ -789,8 +789,7 @@
       this.email_ = credentials.email;
       chrome.send('launchSAMLPublicSession', [credentials.email]);
     } else {
-      this.userActed([
-        'completeAuthentication',
+      chrome.send('completeAuthentication', [
         credentials.gaiaId,
         credentials.email,
         credentials.password,
@@ -839,7 +838,7 @@
    * @private
    */
   onIdentifierEnteredMessage_(e) {
-    this.userActed(['identifierEntered', e.detail.accountIdentifier]);
+    chrome.send('identifierEntered', [e.detail.accountIdentifier]);
   }
 
   /**
diff --git a/chrome/browser/resources/omnibox_popup/BUILD.gn b/chrome/browser/resources/omnibox_popup/BUILD.gn
index ace04aa..49f0b61 100644
--- a/chrome/browser/resources/omnibox_popup/BUILD.gn
+++ b/chrome/browser/resources/omnibox_popup/BUILD.gn
@@ -18,6 +18,7 @@
   ts_deps = [
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources:library",
+    "//ui/webui/resources/cr_components/color_change_listener:build_ts",
     "//ui/webui/resources/cr_components/omnibox:build_ts",
     "//ui/webui/resources/js/metrics_reporter:build_ts",
   ]
diff --git a/chrome/browser/resources/omnibox_popup/OWNERS b/chrome/browser/resources/omnibox_popup/OWNERS
new file mode 100644
index 0000000..7d3db3b
--- /dev/null
+++ b/chrome/browser/resources/omnibox_popup/OWNERS
@@ -0,0 +1,2 @@
+mahmadi@chromium.org
+file://components/omnibox/OWNERS
diff --git a/chrome/browser/resources/omnibox_popup/app.html b/chrome/browser/resources/omnibox_popup/app.html
index d22ab1ab..847b738 100644
--- a/chrome/browser/resources/omnibox_popup/app.html
+++ b/chrome/browser/resources/omnibox_popup/app.html
@@ -1,2 +1,8 @@
-<ntp-realbox-dropdown result="[[result_]]" on-dom-change="onResultRepaint_">
+<style>
+  :host {
+    font-size: 14.6px; /* closely resembles the omnibox input font size. */
+  }
+</style>
+<ntp-realbox-dropdown id="matches" result="[[result_]]"
+    on-dom-change="onResultRepaint_">
 </ntp-realbox-dropdown>
diff --git a/chrome/browser/resources/omnibox_popup/app.ts b/chrome/browser/resources/omnibox_popup/app.ts
index 863caa6..2378adb 100644
--- a/chrome/browser/resources/omnibox_popup/app.ts
+++ b/chrome/browser/resources/omnibox_popup/app.ts
@@ -5,7 +5,9 @@
 import '//resources/cr_components/omnibox/realbox_dropdown.js';
 import './strings.m.js';
 
+import {startColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
 import {PageCallbackRouter, RealboxBrowserProxy} from '//resources/cr_components/omnibox/realbox_browser_proxy.js';
+import {RealboxDropdownElement} from '//resources/cr_components/omnibox/realbox_dropdown.js';
 import {assert} from '//resources/js/assert_ts.js';
 import {MetricsReporterImpl} from '//resources/js/metrics_reporter/metrics_reporter.js';
 import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -13,6 +15,12 @@
 import {getTemplate} from './app.html.js';
 import {AutocompleteResult} from './omnibox.mojom-webui.js';
 
+export interface OmniboxPopupAppElement {
+  $: {
+    matches: RealboxDropdownElement,
+  };
+}
+
 // Displays the autocomplete matches in the autocomplete result.
 export class OmniboxPopupAppElement extends PolymerElement {
   static get is() {
@@ -32,10 +40,12 @@
   private callbackRouter_: PageCallbackRouter;
   private omniboxAutocompleteResultChangedListenerId_: number|null = null;
   private result_: AutocompleteResult;
+  private selectMatchAtLineListenerId_: number|null = null;
 
   constructor() {
     super();
     this.callbackRouter_ = RealboxBrowserProxy.getInstance().callbackRouter;
+    startColorChangeUpdater();
   }
 
   override connectedCallback() {
@@ -43,6 +53,9 @@
     this.omniboxAutocompleteResultChangedListenerId_ =
         this.callbackRouter_.omniboxAutocompleteResultChanged.addListener(
             this.onOmniboxAutocompleteResultChanged_.bind(this));
+    this.selectMatchAtLineListenerId_ =
+        this.callbackRouter_.selectMatchAtLine.addListener(
+            this.onSelectMatchAtLine_.bind(this));
   }
 
   override disconnectedCallback() {
@@ -50,10 +63,18 @@
     assert(this.omniboxAutocompleteResultChangedListenerId_);
     this.callbackRouter_.removeListener(
         this.omniboxAutocompleteResultChangedListenerId_);
+    assert(this.selectMatchAtLineListenerId_);
+    this.callbackRouter_.removeListener(this.selectMatchAtLineListenerId_);
   }
 
   private onOmniboxAutocompleteResultChanged_(result: AutocompleteResult) {
     this.result_ = result;
+
+    if (result.matches[0]?.allowedToBeDefaultMatch) {
+      this.$.matches.selectFirst();
+    } else if (this.$.matches.selectedMatchIndex >= result.matches.length) {
+      this.$.matches.unselect();
+    }
   }
 
   private onResultRepaint_() {
@@ -66,6 +87,10 @@
         // Ignore silently if mark 'ResultChanged' is missing.
         .catch(() => {});
   }
+
+  private onSelectMatchAtLine_(line: number) {
+    this.$.matches.selectIndex(line);
+  }
 }
 
 declare global {
diff --git a/chrome/browser/resources/omnibox_popup/omnibox_popup.html b/chrome/browser/resources/omnibox_popup/omnibox_popup.html
index f8d6aa7..b4c6772 100644
--- a/chrome/browser/resources/omnibox_popup/omnibox_popup.html
+++ b/chrome/browser/resources/omnibox_popup/omnibox_popup.html
@@ -3,9 +3,8 @@
 <head>
   <meta charset="utf-8">
   <title>Omnibox Popup</title>
-  <link rel="stylesheet" href="//resources/css/md_colors.css">
   <link rel="stylesheet" href="//resources/css/text_defaults_md.css">
-  <link rel="stylesheet" href="//theme/colors.css?sets=ui,chrome">
+  <link rel="stylesheet" href="chrome://theme/colors.css?sets=ui,chrome">
   <style>
     html {
       height: 100%;
diff --git a/chrome/browser/resources/pdf/manifest.json b/chrome/browser/resources/pdf/manifest.json
index dbc6ccd..f355f92 100644
--- a/chrome/browser/resources/pdf/manifest.json
+++ b/chrome/browser/resources/pdf/manifest.json
@@ -12,6 +12,7 @@
     "chrome://webui-test/",
     "contentSettings",
     "metricsPrivate",
+    "pdfViewerPrivate",
     "resourcesPrivate",
     "tabs",
     {"fileSystem": ["write"]}
diff --git a/chrome/browser/resources/pdf/navigator.ts b/chrome/browser/resources/pdf/navigator.ts
index 7976b59..32a7efc 100644
--- a/chrome/browser/resources/pdf/navigator.ts
+++ b/chrome/browser/resources/pdf/navigator.ts
@@ -24,6 +24,12 @@
    * Called when navigation should happen in the new window.
    */
   navigateInNewWindow(url: string): void;
+
+  /*
+   * Returns true if `url` should be allowed to access local files, false
+   * otherwise.
+   */
+  isAllowedLocalFileAccess(url: string): Promise<boolean>;
 }
 
 // NavigatorDelegate for calling browser-specific functions to do the actual
@@ -58,6 +64,14 @@
       window.open(url, '_blank');
     }
   }
+
+
+  isAllowedLocalFileAccess(url: string): Promise<boolean> {
+    return new Promise(resolve => {
+      chrome.pdfViewerPrivate.isAllowedLocalFileAccess(
+          url, result => resolve(result));
+    });
+  }
 }
 
 // Navigator for navigating to links inside or outside the PDF.
@@ -95,7 +109,7 @@
    *     URL.
    * @return When navigation has completed (used for testing).
    */
-  navigate(urlString: string, disposition: WindowOpenDisposition):
+  async navigate(urlString: string, disposition: WindowOpenDisposition):
       Promise<void> {
     if (urlString.length === 0) {
       return Promise.resolve();
@@ -113,7 +127,7 @@
 
     // If there's no scheme, then take a guess at the scheme.
     if (!urlString.includes('://') && !urlString.includes('mailto:')) {
-      urlString = this.guessUrlWithoutScheme_(urlString);
+      urlString = await this.guessUrlWithoutScheme_(urlString);
     }
 
     let url = null;
@@ -123,7 +137,7 @@
       return Promise.reject(err);
     }
 
-    if (!this.isValidUrl_(url)) {
+    if (!(await this.isValidUrl_(url))) {
       return Promise.resolve();
     }
 
@@ -181,17 +195,19 @@
   /**
    * Checks if the URL starts with a scheme and is not just a scheme.
    */
-  private isValidUrl_(url: URL): boolean {
+  private async isValidUrl_(url: URL): Promise<boolean> {
     // Make sure |url| starts with a valid scheme.
     const validSchemes = ['http:', 'https:', 'ftp:', 'file:', 'mailto:'];
     if (!validSchemes.includes(url.protocol)) {
       return false;
     }
 
-    // Navigations to file:-URLs are only allowed from file:-URLs.
+    // Navigations to file:-URLs are only allowed from file:-URLs or allowlisted
+    // domains.
     if (url.protocol === 'file:' && this.originalUrl_ &&
         this.originalUrl_.protocol !== 'file:') {
-      return false;
+      return this.navigatorDelegate_.isAllowedLocalFileAccess(
+          this.originalUrl_.toString());
     }
 
     return true;
@@ -202,13 +218,13 @@
    * @return The URL with a scheme or the original URL if it is not
    *     possible to determine the scheme.
    */
-  private guessUrlWithoutScheme_(url: string): string {
+  private async guessUrlWithoutScheme_(url: string): Promise<string> {
     // If the original URL is mailto:, that does not make sense to start with,
     // and neither does adding |url| to it.
     // If the original URL is not a valid URL, this cannot make a valid URL.
     // In both cases, just bail out.
     if (!this.originalUrl_ || this.originalUrl_.protocol === 'mailto:' ||
-        !this.isValidUrl_(this.originalUrl_)) {
+        !(await this.isValidUrl_(this.originalUrl_))) {
       return url;
     }
 
diff --git a/chrome/browser/resources/pdf/pdf.gni b/chrome/browser/resources/pdf/pdf.gni
index f848900..eb8049d 100644
--- a/chrome/browser/resources/pdf/pdf.gni
+++ b/chrome/browser/resources/pdf/pdf.gni
@@ -178,6 +178,7 @@
   "//tools/typescript/definitions/file_system.d.ts",
   "//tools/typescript/definitions/metrics_private.d.ts",
   "//tools/typescript/definitions/mime_handler_private.d.ts",
+  "//tools/typescript/definitions/pdf_viewer_private.d.ts",
   "//tools/typescript/definitions/pending.d.ts",
   "//tools/typescript/definitions/resources_private.d.ts",
   "//tools/typescript/definitions/runtime.d.ts",
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 931cb46..fa8c32d 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -2648,6 +2648,8 @@
       "webui/ash/emoji/emoji_page_handler.h",
       "webui/ash/emoji/emoji_ui.cc",
       "webui/ash/emoji/emoji_ui.h",
+      "webui/ash/emoji/gif_tenor_api_fetcher.cc",
+      "webui/ash/emoji/gif_tenor_api_fetcher.h",
       "webui/ash/guest_os_installer/guest_os_installer_dialog.cc",
       "webui/ash/guest_os_installer/guest_os_installer_dialog.h",
       "webui/ash/human_presence_internals_ui.cc",
@@ -3286,6 +3288,7 @@
       "//components/consent_auditor:consent_auditor",
       "//components/desks_storage",
       "//components/digital_asset_links",
+      "//components/endpoint_fetcher",
       "//components/exo",
       "//components/login",
       "//components/metrics/structured:structured_events",
@@ -4711,6 +4714,8 @@
       "views/omnibox/remove_suggestion_bubble.h",
       "views/omnibox/rounded_omnibox_results_frame.cc",
       "views/omnibox/rounded_omnibox_results_frame.h",
+      "views/omnibox/webui_omnibox_popup_view.cc",
+      "views/omnibox/webui_omnibox_popup_view.h",
       "views/overlay/back_to_tab_label_button.cc",
       "views/overlay/back_to_tab_label_button.h",
       "views/overlay/close_image_button.cc",
diff --git a/chrome/browser/ui/DEPS b/chrome/browser/ui/DEPS
index 70b6b66d..908c5f8 100644
--- a/chrome/browser/ui/DEPS
+++ b/chrome/browser/ui/DEPS
@@ -6,6 +6,7 @@
   "+components/browser_ui/client_certificate",
   "+components/browser_ui/util/android/url_constants.h",
   "+components/country_codes",
+  "+components/endpoint_fetcher",
   "+components/enterprise",
   "+components/infobars/android",
   "+components/image_service",
diff --git a/chrome/browser/ui/ash/desks/chrome_desks_templates_delegate.cc b/chrome/browser/ui/ash/desks/chrome_desks_templates_delegate.cc
index 9ac941b2..c1b0b5f 100644
--- a/chrome/browser/ui/ash/desks/chrome_desks_templates_delegate.cc
+++ b/chrome/browser/ui/ash/desks/chrome_desks_templates_delegate.cc
@@ -424,6 +424,10 @@
 // Returns true if `window` is supported in desk templates feature.
 bool ChromeDesksTemplatesDelegate::IsWindowSupportedForDeskTemplate(
     aura::Window* window) const {
+  if (!window) {
+    return false;
+  }
+
   if (!ash::DeskTemplate::IsAppTypeSupported(window))
     return false;
 
@@ -448,10 +452,14 @@
     GetAppLaunchDataCallback callback,
     std::unique_ptr<app_restore::AppLaunchInfo> app_launch_info,
     crosapi::mojom::DeskTemplateStatePtr state) {
-  if (state) {
-    app_launch_info->urls = state->urls;
-    app_launch_info->active_tab_index = state->active_index;
+  if (state.is_null()) {
+    std::move(callback).Run({});
+    return;
   }
+
+  app_launch_info->urls = state->urls;
+  app_launch_info->active_tab_index = state->active_index;
+
   std::move(callback).Run(std::move(app_launch_info));
 }
 
diff --git a/chrome/browser/ui/ash/desks/chrome_desks_templates_delegate_unittest.cc b/chrome/browser/ui/ash/desks/chrome_desks_templates_delegate_unittest.cc
new file mode 100644
index 0000000..3d513db
--- /dev/null
+++ b/chrome/browser/ui/ash/desks/chrome_desks_templates_delegate_unittest.cc
@@ -0,0 +1,205 @@
+// 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/ui/ash/desks/chrome_desks_templates_delegate.h"
+
+#include "ash/constants/app_types.h"
+#include "ash/public/cpp/ash_public_export.h"
+#include "base/test/bind.h"
+#include "base/test/task_environment.h"
+#include "chrome/browser/ash/crosapi/browser_loader.h"
+#include "chrome/browser/ash/crosapi/browser_manager.h"
+#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
+#include "chrome/browser/ash/profiles/profile_helper.h"
+#include "chrome/browser/ui/ash/desks/desks_client.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "chrome/test/base/testing_profile.h"
+#include "chrome/test/base/testing_profile_manager.h"
+#include "components/app_restore/app_launch_info.h"
+#include "components/app_restore/full_restore_save_handler.h"
+#include "components/app_restore/full_restore_utils.h"
+#include "components/app_restore/window_info.h"
+#include "components/app_restore/window_properties.h"
+#include "components/user_manager/scoped_user_manager.h"
+#include "content/public/test/browser_task_environment.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/aura/client/aura_constants.h"
+#include "ui/aura/client/window_types.h"
+#include "ui/aura/window.h"
+#include "ui/compositor/layer_type.h"
+
+using ::testing::_;
+using ::testing::Invoke;
+using ::testing::Return;
+
+namespace {
+constexpr char kTestProfileEmail[] = "test@test.com";
+constexpr int32_t kLacrosWindowId = 123456;
+constexpr int32_t kActivationIndex1 = 100;
+
+std::unique_ptr<aura::Window> CreateLacrosWindow(
+    const std::string& lacros_window_id) {
+  auto window =
+      std::make_unique<aura::Window>(nullptr, aura::client::WINDOW_TYPE_NORMAL);
+
+  window->SetProperty(aura::client::kAppType,
+                      static_cast<int>(ash::AppType::LACROS));
+  window->SetProperty(app_restore::kLacrosWindowId,
+                      std::string(lacros_window_id));
+
+  window->Init(ui::LAYER_NOT_DRAWN);
+
+  return window;
+}
+
+class MockDesksClient : public DesksClient {
+ public:
+  MOCK_CONST_METHOD1(GetAppIdForLacrosWindow,
+                     absl::optional<std::string>(aura::Window* window));
+};
+
+class MockBrowserManager : public crosapi::BrowserManager {
+ public:
+  MockBrowserManager()
+      : BrowserManager(std::unique_ptr<crosapi::BrowserLoader>(), nullptr) {}
+  MOCK_CONST_METHOD0(IsRunning, bool());
+  MOCK_METHOD2(GetBrowserInformation,
+               void(const std::string&,
+                    crosapi::BrowserManager::GetBrowserInformationCallback));
+};
+
+void ReturnEmptyGetBrowserInformation(
+    const std::string& window_unique_id,
+    crosapi::BrowserManager::GetBrowserInformationCallback callback) {
+  // Returns empty Lacros browser information.
+  std::move(callback).Run({});
+}
+}  // namespace
+
+class ChromeDesksTemplatesDelegateTest : public testing::Test {
+ public:
+  ChromeDesksTemplatesDelegateTest()
+      : user_manager_enabler_(std::make_unique<ash::FakeChromeUserManager>()) {}
+
+  ChromeDesksTemplatesDelegateTest(const ChromeDesksTemplatesDelegateTest&) =
+      delete;
+  ChromeDesksTemplatesDelegateTest& operator=(
+      const ChromeDesksTemplatesDelegateTest&) = delete;
+
+  ~ChromeDesksTemplatesDelegateTest() override = default;
+
+  void SetUp() override {
+    // Create a test user and profile so the ChromeDesksTemplatesDelegate does
+    // not return empty result simply because of missing user profile.
+    auto account_id = AccountId::FromUserEmail(kTestProfileEmail);
+    const auto* user = GetFakeUserManager()->AddUser(account_id);
+
+    ASSERT_TRUE(profile_dir_.CreateUniqueTempDir());
+    TestingProfile::Builder profile_builder;
+    profile_builder.SetProfileName(kTestProfileEmail);
+    profile_builder.SetPath(profile_dir_.GetPath());
+    profile_ = profile_builder.Build();
+
+    ash::ProfileHelper::Get()->SetUserToProfileMappingForTesting(
+        user, profile_.get());
+
+    // Set up Full Restore Save Handler so that ChromeDesksTemplatesDelegate can
+    // get launch info for a Lacros window.
+    full_restore::FullRestoreSaveHandler* save_handler = GetSaveHandler();
+    save_handler->SetPrimaryProfilePath(profile_dir_.GetPath());
+
+    chrome_desks_templates_delegate_ =
+        std::make_unique<ChromeDesksTemplatesDelegate>();
+  }
+
+  void TearDown() override { chrome_desks_templates_delegate_.reset(); }
+
+  ash::FakeChromeUserManager* GetFakeUserManager() const {
+    return static_cast<ash::FakeChromeUserManager*>(
+        user_manager::UserManager::Get());
+  }
+
+  ChromeDesksTemplatesDelegate* chrome_desks_templates_delegate() {
+    return chrome_desks_templates_delegate_.get();
+  }
+
+  content::BrowserTaskEnvironment& task_environment() {
+    return task_environment_;
+  }
+
+  MockBrowserManager& mock_browser_manager() { return mock_browser_manager_; }
+  MockDesksClient& mock_desks_client() { return mock_desks_client_; }
+
+  full_restore::FullRestoreSaveHandler* GetSaveHandler(
+      bool start_save_timer = true) {
+    auto* save_handler = full_restore::FullRestoreSaveHandler::GetInstance();
+    save_handler->SetActiveProfilePath(profile_->GetPath());
+    save_handler->AllowSave();
+    return save_handler;
+  }
+
+  void SaveWindowInfo(aura::Window* window, int32_t activation_index) {
+    app_restore::WindowInfo window_info;
+    window_info.window = window;
+    window_info.activation_index = activation_index;
+    full_restore::SaveWindowInfo(window_info);
+  }
+
+ private:
+  // Browser profiles need to be created on UI thread.
+  content::BrowserTaskEnvironment task_environment_{
+      base::test::TaskEnvironment::MainThreadType::UI};
+
+  base::ScopedTempDir profile_dir_;
+  std::unique_ptr<TestingProfile> profile_;
+
+  testing::NiceMock<MockBrowserManager> mock_browser_manager_;
+  testing::NiceMock<MockDesksClient> mock_desks_client_;
+
+  std::unique_ptr<ChromeDesksTemplatesDelegate>
+      chrome_desks_templates_delegate_;
+
+  user_manager::ScopedUserManager user_manager_enabler_;
+};
+
+TEST_F(ChromeDesksTemplatesDelegateTest, NullWindowReturnsEmptyAppLaunchData) {
+  base::RunLoop loop;
+  chrome_desks_templates_delegate()->GetAppLaunchDataForDeskTemplate(
+      /*window*/ nullptr,
+      base::BindLambdaForTesting(
+          [&](std::unique_ptr<app_restore::AppLaunchInfo> app_launch_info) {
+            EXPECT_FALSE(app_launch_info);
+            loop.Quit();
+          }));
+  loop.Run();
+}
+
+TEST_F(ChromeDesksTemplatesDelegateTest,
+       EmptyLacrosWindowInfoReturnsEmptyAppLaunchData) {
+  ASSERT_EQ(&mock_desks_client(), DesksClient::Get());
+
+  std::unique_ptr<aura::Window> window =
+      CreateLacrosWindow(base::NumberToString(kLacrosWindowId));
+
+  // Saves window info so that GetAppLaunchDataForDeskTemplate will attempt to
+  // get Lacros window information.
+  SaveWindowInfo(window.get(), kActivationIndex1);
+
+  EXPECT_CALL(mock_browser_manager(), IsRunning()).WillOnce(Return(true));
+  EXPECT_CALL(mock_browser_manager(), GetBrowserInformation(_, _))
+      .WillOnce(Invoke(ReturnEmptyGetBrowserInformation));
+
+  task_environment().RunUntilIdle();
+
+  base::RunLoop loop;
+  chrome_desks_templates_delegate()->GetAppLaunchDataForDeskTemplate(
+      window.get(),
+      base::BindLambdaForTesting(
+          [&](std::unique_ptr<app_restore::AppLaunchInfo> app_launch_info) {
+            EXPECT_FALSE(app_launch_info);
+            loop.Quit();
+          }));
+  loop.Run();
+}
diff --git a/chrome/browser/ui/ash/desks/desks_client.cc b/chrome/browser/ui/ash/desks/desks_client.cc
index 35dd622..5a932f5 100644
--- a/chrome/browser/ui/ash/desks/desks_client.cc
+++ b/chrome/browser/ui/ash/desks/desks_client.cc
@@ -34,6 +34,7 @@
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/apps/app_service/browser_app_instance_observer.h"
 #include "chrome/browser/apps/app_service/browser_app_instance_registry.h"
+#include "chrome/browser/ash/crosapi/browser_util.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -222,13 +223,17 @@
 DesksClient::DesksClient() : desks_controller_(ash::DesksController::Get()) {
   DCHECK(!g_desks_client_instance);
   g_desks_client_instance = this;
-  ash::SessionController::Get()->AddObserver(this);
+  if (ash::SessionController::Get()) {
+    ash::SessionController::Get()->AddObserver(this);
+  }
 }
 
 DesksClient::~DesksClient() {
   DCHECK_EQ(this, g_desks_client_instance);
   g_desks_client_instance = nullptr;
-  ash::SessionController::Get()->RemoveObserver(this);
+  if (ash::SessionController::Get()) {
+    ash::SessionController::Get()->RemoveObserver(this);
+  }
 }
 
 // static
@@ -451,6 +456,14 @@
   if (restore_data->app_id_to_launch_list().empty())
     return;
 
+  // Since we default the browser to launch as ash chrome, we want to to check
+  // to see if lacros is enabled and primary. If so, update the app id of the
+  // browser app to launch lacros instead of ash.
+  if (crosapi::browser_util::IsLacrosEnabled() &&
+      crosapi::browser_util::IsLacrosPrimaryBrowser()) {
+    restore_data->UpdateBrowserAppIdToLacros();
+  }
+
   // Make window IDs of the template unique. This is a requirement for launching
   // templates concurrently since the contained window IDs are used as lookup
   // keys in many places. We must also do this *before* creating the performance
@@ -468,8 +481,9 @@
   auto& handler = app_launch_handlers_[launch_id];
   // Some tests reach into this class and install a handler ahead of time. In
   // all other cases, we create a handler for the launch here.
-  if (!handler)
+  if (!handler) {
     handler = std::make_unique<DesksTemplatesAppLaunchHandler>(active_profile_);
+  }
 
   handler->LaunchTemplate(*desk_template);
 
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 4b19fe4..3490be7e 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -901,6 +901,23 @@
     session_service->SetWindowUserTitle(session_id(), user_title);
 }
 
+Browser* Browser::GetBrowserForOpeningWebUi() {
+  if (!is_type_picture_in_picture()) {
+    return this;
+  }
+
+  if (!opener_browser_) {
+    auto* opener_web_contents =
+        PictureInPictureWindowManager::GetInstance()->GetWebContents();
+    // We should always have an opener web contents if the current browser is a
+    // picture-in-picture type.
+    DCHECK(opener_web_contents);
+    opener_browser_ = chrome::FindBrowserWithWebContents(opener_web_contents);
+  }
+
+  return opener_browser_;
+}
+
 StatusBubble* Browser::GetStatusBubbleForTesting() {
   return GetStatusBubble();
 }
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h
index ace44445..25a4953 100644
--- a/chrome/browser/ui/browser.h
+++ b/chrome/browser/ui/browser.h
@@ -751,6 +751,11 @@
   // Sets the browser's user title. Setting it to an empty string clears it.
   void SetWindowUserTitle(const std::string& user_title);
 
+  // Gets the browser for opening chrome:// pages. This will return the opener
+  // browser if the current browser is in picture-in-picture mode, otherwise
+  // returns the current browser.
+  Browser* GetBrowserForOpeningWebUi();
+
   StatusBubble* GetStatusBubbleForTesting();
 
 #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
@@ -1307,6 +1312,10 @@
 
   const base::ElapsedTimer creation_timer_;
 
+  // The opener browser of the document picture-in-picture browser. Null if the
+  // current browser is a regular browser.
+  raw_ptr<Browser> opener_browser_ = nullptr;
+
   WebContentsCollection web_contents_collection_{this};
 
   // The following factory is used for chrome update coalescing.
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc
index e249fd2..154e9c94 100644
--- a/chrome/browser/ui/browser_command_controller.cc
+++ b/chrome/browser/ui/browser_command_controller.cc
@@ -765,7 +765,7 @@
       break;
 
     case IDC_SHOW_BOOKMARK_MANAGER:
-      ShowBookmarkManager(browser_);
+      ShowBookmarkManager(browser_->GetBrowserForOpeningWebUi());
       break;
     case IDC_SHOW_APP_MENU:
       base::RecordAction(base::UserMetricsAction("Accel_Show_App_Menu"));
@@ -775,31 +775,33 @@
       ShowAvatarMenu(browser_);
       break;
     case IDC_SHOW_HISTORY:
-      ShowHistory(browser_);
+      ShowHistory(browser_->GetBrowserForOpeningWebUi());
       break;
     case IDC_SHOW_DOWNLOADS:
-      ShowDownloads(browser_);
+      ShowDownloads(browser_->GetBrowserForOpeningWebUi());
       break;
     case IDC_MANAGE_EXTENSIONS:
-      ShowExtensions(browser_, std::string());
+      ShowExtensions(browser_->GetBrowserForOpeningWebUi(), std::string());
       break;
     case IDC_PERFORMANCE:
-      ShowSettingsSubPage(browser_, chrome::kPerformanceSubPage);
+      ShowSettingsSubPage(browser_->GetBrowserForOpeningWebUi(),
+                          chrome::kPerformanceSubPage);
       break;
     case IDC_OPTIONS:
-      ShowSettings(browser_);
+      ShowSettings(browser_->GetBrowserForOpeningWebUi());
       break;
     case IDC_EDIT_SEARCH_ENGINES:
-      ShowSearchEngineSettings(browser_);
+      ShowSearchEngineSettings(browser_->GetBrowserForOpeningWebUi());
       break;
     case IDC_VIEW_PASSWORDS:
-      ShowPasswordManager(browser_);
+      ShowPasswordManager(browser_->GetBrowserForOpeningWebUi());
       break;
     case IDC_CLEAR_BROWSING_DATA: {
       if (profile()->IsIncognitoProfile()) {
-        ShowIncognitoClearBrowsingDataDialog(browser_);
+        ShowIncognitoClearBrowsingDataDialog(
+            browser_->GetBrowserForOpeningWebUi());
       } else {
-        ShowClearBrowsingDataDialog(browser_);
+        ShowClearBrowsingDataDialog(browser_->GetBrowserForOpeningWebUi());
       }
       break;
     }
@@ -810,7 +812,7 @@
       ToggleRequestTabletSite(browser_);
       break;
     case IDC_ABOUT:
-      ShowAboutChrome(browser_);
+      ShowAboutChrome(browser_->GetBrowserForOpeningWebUi());
       break;
     case IDC_UPGRADE_DIALOG:
       OpenUpdateChromeDialog(browser_);
diff --git a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
index 303561d..f490b1f 100644
--- a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
@@ -78,10 +78,11 @@
 #include "chrome/browser/web_applications/test/fake_web_app_provider.h"
 #include "chrome/browser/web_applications/test/web_app_test_observers.h"
 #include "chrome/browser/web_applications/user_display_mode.h"
+#include "chrome/browser/web_applications/web_app_command_scheduler.h"
 #include "chrome/browser/web_applications/web_app_constants.h"
-#include "chrome/browser/web_applications/web_app_install_finalizer.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_app_install_manager.h"
+#include "chrome/browser/web_applications/web_app_install_params.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/common/buildflags.h"
 #include "chrome/common/chrome_constants.h"
@@ -2481,31 +2482,24 @@
   // the PRE test.
   WebAppProvider* const provider =
       WebAppProvider::GetForTest(browser()->profile());
-  web_app::WebAppInstallFinalizer& web_app_finalizer =
-      provider->install_finalizer();
-
-  web_app::WebAppInstallFinalizer::FinalizeOptions options(
-      webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON);
 
   // Install web app set to open as a tab.
   {
-    base::RunLoop run_loop;
-    WebAppInstallInfo info;
-    info.start_url = GURL(kStartUrl);
-    info.title = kAppName;
-    info.user_display_mode = web_app::UserDisplayMode::kStandalone;
-    web_app_finalizer.FinalizeInstall(
-        info, options,
-        base::BindLambdaForTesting([&](const web_app::AppId& app_id,
-                                       webapps::InstallResultCode code,
-                                       web_app::OsHooksErrors os_hooks_errors) {
-          EXPECT_EQ(app_id, kAppId);
-          EXPECT_EQ(code, webapps::InstallResultCode::kSuccessNewInstall);
-          EXPECT_TRUE(os_hooks_errors.none());
-          run_loop.Quit();
-        }));
-    run_loop.Run();
+    std::unique_ptr<WebAppInstallInfo> info =
+        std::make_unique<WebAppInstallInfo>();
+    info->start_url = GURL(kStartUrl);
+    info->title = kAppName;
+    info->user_display_mode = web_app::UserDisplayMode::kStandalone;
+    base::test::TestFuture<const web_app::AppId&, webapps::InstallResultCode>
+        result;
+    provider->scheduler().InstallFromInfoWithParams(
+        std::move(info), /*overwrite_existing_manifest_fields=*/true,
+        webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON,
+        result.GetCallback(), web_app::WebAppInstallParams());
 
+    EXPECT_EQ(result.Get<web_app::AppId>(), kAppId);
+    EXPECT_EQ(result.Get<webapps::InstallResultCode>(),
+              webapps::InstallResultCode::kSuccessNewInstall);
     EXPECT_EQ(provider->registrar_unsafe().GetAppUserDisplayMode(kAppId),
               web_app::UserDisplayMode::kStandalone);
   }
diff --git a/chrome/browser/ui/tab_contents/core_tab_helper.cc b/chrome/browser/ui/tab_contents/core_tab_helper.cc
index f97addb..301bbbb3 100644
--- a/chrome/browser/ui/tab_contents/core_tab_helper.cc
+++ b/chrome/browser/ui/tab_contents/core_tab_helper.cc
@@ -135,9 +135,13 @@
 }
 
 bool CoreTabHelper::IsSidePanelEnabled() {
+#if BUILDFLAG(ENABLE_LENS_DESKTOP_GOOGLE_BRANDED_FEATURES)
   return GetTemplateURLService()
              ->IsSideImageSearchSupportedForDefaultSearchProvider() &&
          !IsInProgressiveWebApp();
+#else
+  return false;
+#endif
 }
 
 bool CoreTabHelper::IsSidePanelEnabledFor3PDse() {
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
index 9e2e18e..7aa8206 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
@@ -18,6 +18,7 @@
 #include "chrome/browser/ui/views/omnibox/omnibox_row_view.h"
 #include "chrome/browser/ui/views/omnibox/omnibox_view_views.h"
 #include "chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.h"
+#include "chrome/browser/ui/views/omnibox/webui_omnibox_popup_view.h"
 #include "chrome/browser/ui/views/theme_copying_widget.h"
 #include "chrome/browser/ui/views/user_education/browser_feature_promo_controller.h"
 #include "components/omnibox/browser/omnibox_edit_model.h"
@@ -243,6 +244,10 @@
 }
 
 OmniboxResultView* OmniboxPopupContentsView::result_view_at(size_t i) {
+  DCHECK(!base::FeatureList::IsEnabled(omnibox::kWebUIOmniboxPopup))
+      << "With the WebUI omnibox popup enabled, the code should not try to "
+         "fetch the child result view.";
+
   // TODO(tommycli): https://crbug.com/1063071
   // Making this method public was a mistake. Outside callers have no idea about
   // our internal state, and there's now a crash in this area. For now, let's
@@ -254,6 +259,13 @@
 }
 
 OmniboxResultView* OmniboxPopupContentsView::GetSelectedResultView() {
+  // Do not return the native result view if the WebUI omnibox popup is enabled.
+  // TODO(crbug.com/1396174): Ideally outside callers should not try to access
+  // child views, but rather should interact with the OmniboxPopupModel instead.
+  if (base::FeatureList::IsEnabled(omnibox::kWebUIOmniboxPopup)) {
+    return nullptr;
+  }
+
   size_t selected_line = GetSelection().line;
   if (selected_line == OmniboxPopupSelection::kNoMatch)
     return nullptr;
@@ -280,6 +292,11 @@
 void OmniboxPopupContentsView::OnSelectionChanged(
     OmniboxPopupSelection old_selection,
     OmniboxPopupSelection new_selection) {
+  if (base::FeatureList::IsEnabled(omnibox::kWebUIOmniboxPopup)) {
+    webui_view_->OnSelectedLineChanged(old_selection.line, new_selection.line);
+    return;
+  }
+
   // Do not invalidate the same line twice, in order to avoid redundant
   // accessibility events.
   if (old_selection.line != OmniboxPopupSelection::kNoMatch &&
@@ -341,60 +358,69 @@
 
   // Update the match cached by each row, in the process of doing so make sure
   // we have enough row views.
-  const size_t result_size = edit_model_->result().size();
-  std::u16string previous_row_header = u"";
-  PrefService* const pref_service = GetPrefService();
-  for (size_t i = 0; i < result_size; ++i) {
-    // Create child views lazily.  Since especially the first result view may
-    // be expensive to create due to loading font data, this saves time and
-    // memory during browser startup. https://crbug.com/1021323
-    if (children().size() == i) {
-      AddChildView(std::make_unique<OmniboxRowView>(
-          i, edit_model_,
-          std::make_unique<OmniboxResultView>(this, edit_model_, i),
-          pref_service));
+  if (base::FeatureList::IsEnabled(omnibox::kWebUIOmniboxPopup)) {
+    if (!webui_view_) {
+      webui_view_ = AddChildView(std::make_unique<WebUIOmniboxPopupView>(
+          location_bar_view_->profile()));
     }
+  } else {
+    const size_t result_size = edit_model_->result().size();
+    std::u16string previous_row_header = u"";
+    PrefService* const pref_service = GetPrefService();
+    for (size_t i = 0; i < result_size; ++i) {
+      // Create child views lazily.  Since especially the first result view may
+      // be expensive to create due to loading font data, this saves time and
+      // memory during browser startup. https://crbug.com/1021323
+      if (children().size() == i) {
+        AddChildView(std::make_unique<OmniboxRowView>(
+            i, edit_model_,
+            std::make_unique<OmniboxResultView>(this, edit_model_, i),
+            pref_service));
+      }
 
-    OmniboxRowView* const row_view =
-        static_cast<OmniboxRowView*>(children()[i]);
-    row_view->SetVisible(true);
+      OmniboxRowView* const row_view =
+          static_cast<OmniboxRowView*>(children()[i]);
+      row_view->SetVisible(true);
 
-    // Show the header if it's distinct from the previous match's header.
-    const AutocompleteMatch& match = GetMatchAtIndex(i);
-    std::u16string current_row_header =
-        match.suggestion_group_id.has_value()
-            ? edit_model_->result().GetHeaderForSuggestionGroup(
-                  match.suggestion_group_id.value())
-            : u"";
-    if (!current_row_header.empty() &&
-        current_row_header != previous_row_header) {
-      row_view->ShowHeader(match.suggestion_group_id.value(),
-                           current_row_header);
-    } else {
-      row_view->HideHeader();
+      // Show the header if it's distinct from the previous match's header.
+      const AutocompleteMatch& match = GetMatchAtIndex(i);
+      std::u16string current_row_header =
+          match.suggestion_group_id.has_value()
+              ? edit_model_->result().GetHeaderForSuggestionGroup(
+                    match.suggestion_group_id.value())
+              : u"";
+      if (!current_row_header.empty() &&
+          current_row_header != previous_row_header) {
+        row_view->ShowHeader(match.suggestion_group_id.value(),
+                             current_row_header);
+      } else {
+        row_view->HideHeader();
+      }
+      previous_row_header = current_row_header;
+
+      OmniboxResultView* const result_view = row_view->result_view();
+      result_view->SetMatch(match);
+
+      // Set visibility of the result view based on whether the group is hidden.
+      bool match_hidden = pref_service &&
+                          match.suggestion_group_id.has_value() &&
+                          edit_model_->result().IsSuggestionGroupHidden(
+                              pref_service, match.suggestion_group_id.value());
+      result_view->SetVisible(!match_hidden);
+
+      const SkBitmap* bitmap = edit_model_->GetPopupRichSuggestionBitmap(i);
+      if (bitmap) {
+        result_view->SetRichSuggestionImage(
+            gfx::ImageSkia::CreateFrom1xBitmap(*bitmap));
+      }
     }
-    previous_row_header = current_row_header;
-
-    OmniboxResultView* const result_view = row_view->result_view();
-    result_view->SetMatch(match);
-
-    // Set visibility of the result view based on whether the group is hidden.
-    bool match_hidden = pref_service && match.suggestion_group_id.has_value() &&
-                        edit_model_->result().IsSuggestionGroupHidden(
-                            pref_service, match.suggestion_group_id.value());
-    result_view->SetVisible(!match_hidden);
-
-    const SkBitmap* bitmap = edit_model_->GetPopupRichSuggestionBitmap(i);
-    if (bitmap) {
-      result_view->SetRichSuggestionImage(
-          gfx::ImageSkia::CreateFrom1xBitmap(*bitmap));
+    // If we have more views than matches, hide the surplus ones.
+    for (auto i = children().begin() + result_size; i != children().end();
+         ++i) {
+      (*i)->SetVisible(false);
     }
   }
 
-  // If we have more views than matches, hide the surplus ones.
-  for (auto i = children().begin() + result_size; i != children().end(); ++i)
-    (*i)->SetVisible(false);
-
   popup_->SetTargetBounds(GetTargetBounds());
 
   if (popup_created) {
@@ -402,8 +428,9 @@
 
     // Popup is now expanded and first item will be selected.
     NotifyAccessibilityEvent(ax::mojom::Event::kExpandedChanged, true);
-    if (auto* first_result_view = result_view_at(0)) {
-      FireAXEventsForNewActiveDescendant(first_result_view);
+    if (!base::FeatureList::IsEnabled(omnibox::kWebUIOmniboxPopup) &&
+        result_view_at(0)) {
+      FireAXEventsForNewActiveDescendant(result_view_at(0));
     }
 
 #if BUILDFLAG(IS_MAC)
@@ -422,7 +449,13 @@
 }
 
 void OmniboxPopupContentsView::ProvideButtonFocusHint(size_t line) {
+  // TODO(crbug.com/1396174): Not implemented for WebUI omnibox popup yet.
+  if (base::FeatureList::IsEnabled(omnibox::kWebUIOmniboxPopup)) {
+    return;
+  }
+
   DCHECK(GetSelection().IsButtonFocused());
+
   views::View* active_button = static_cast<OmniboxRowView*>(children()[line])
                                    ->GetActiveAuxiliaryButtonForAccessibility();
   // TODO(tommycli): |active_button| can sometimes be nullptr, because the
@@ -432,6 +465,11 @@
 }
 
 void OmniboxPopupContentsView::OnMatchIconUpdated(size_t match_index) {
+  // TODO(crbug.com/1396174): Not implemented for WebUI omnibox popup yet.
+  if (base::FeatureList::IsEnabled(omnibox::kWebUIOmniboxPopup)) {
+    return;
+  }
+
   result_view_at(match_index)->OnMatchIconUpdated();
 }
 
@@ -440,6 +478,11 @@
 }
 
 bool OmniboxPopupContentsView::OnMouseDragged(const ui::MouseEvent& event) {
+  // TODO(crbug.com/1396174): Not implemented for WebUI omnibox popup yet.
+  if (base::FeatureList::IsEnabled(omnibox::kWebUIOmniboxPopup)) {
+    return true;
+  }
+
   size_t index = GetIndexForPoint(event.location());
 
   // If the drag event is over the bounds of one of the result views, pass
@@ -511,12 +554,18 @@
 gfx::Rect OmniboxPopupContentsView::GetTargetBounds() const {
   int popup_height = 0;
 
-  DCHECK_GE(children().size(), edit_model_->result().size());
-  popup_height = std::accumulate(
-      children().cbegin(), children().cbegin() + edit_model_->result().size(),
-      0, [](int height, const auto* v) {
-        return height + v->GetPreferredSize().height();
-      });
+  if (base::FeatureList::IsEnabled(omnibox::kWebUIOmniboxPopup)) {
+    if (webui_view_) {
+      popup_height = webui_view_->GetPreferredSize().height();
+    }
+  } else {
+    DCHECK_GE(children().size(), edit_model_->result().size());
+    popup_height = std::accumulate(
+        children().cbegin(), children().cbegin() + edit_model_->result().size(),
+        0, [](int height, const auto* v) {
+          return height + v->GetPreferredSize().height();
+        });
+  }
 
   // Add enough space on the top and bottom so it looks like there is the same
   // amount of space between the text and the popup border as there is in the
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.h b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.h
index a874baa..d1879d6 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.h
+++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.h
@@ -24,6 +24,7 @@
 class OmniboxEditModel;
 class OmniboxResultView;
 class OmniboxViewViews;
+class WebUIOmniboxPopupView;
 
 // A view representing the contents of the autocomplete popup.
 class OmniboxPopupContentsView : public views::View,
@@ -135,6 +136,10 @@
   // The location bar view that owns |omnibox_view_|. May be nullptr in tests.
   raw_ptr<LocationBarView> location_bar_view_;
 
+  // The reference to the child suggestions WebView. Added only if
+  // omnibox::kWebUIOmniboxPopup is enabled.
+  raw_ptr<WebUIOmniboxPopupView> webui_view_;
+
   // A pref change registrar for toggling result view visibility.
   PrefChangeRegistrar pref_change_registrar_;
 
diff --git a/chrome/browser/ui/views/omnibox/webui_omnibox_popup_view.cc b/chrome/browser/ui/views/omnibox/webui_omnibox_popup_view.cc
new file mode 100644
index 0000000..6f20102
--- /dev/null
+++ b/chrome/browser/ui/views/omnibox/webui_omnibox_popup_view.cc
@@ -0,0 +1,35 @@
+// 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/ui/views/omnibox/webui_omnibox_popup_view.h"
+
+#include "chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.h"
+#include "chrome/browser/ui/webui/realbox/realbox_handler.h"
+#include "chrome/common/webui_url_constants.h"
+#include "ui/base/metadata/metadata_impl_macros.h"
+
+WebUIOmniboxPopupView::WebUIOmniboxPopupView(
+    content::BrowserContext* browser_context)
+    : views::WebView(browser_context) {
+  // TODO(crbug.com/1396174): Should be dynamically sized based on WebContents.
+  SetPreferredSize(gfx::Size(640, 480));
+  LoadInitialURL(GURL(chrome::kChromeUIOmniboxPopupURL));
+}
+
+void WebUIOmniboxPopupView::OnSelectedLineChanged(size_t old_selected_line,
+                                                  size_t new_selected_line) {
+  RealboxHandler* handler = GetWebUIHandler();
+  if (handler) {
+    handler->SelectMatchAtLine(old_selected_line, new_selected_line);
+  }
+}
+
+RealboxHandler* WebUIOmniboxPopupView::GetWebUIHandler() {
+  OmniboxPopupUI* omnibox_popup_ui = static_cast<OmniboxPopupUI*>(
+      GetWebContents()->GetWebUI()->GetController());
+  return omnibox_popup_ui->webui_handler();
+}
+
+BEGIN_METADATA(WebUIOmniboxPopupView, views::WebView)
+END_METADATA
diff --git a/chrome/browser/ui/views/omnibox/webui_omnibox_popup_view.h b/chrome/browser/ui/views/omnibox/webui_omnibox_popup_view.h
new file mode 100644
index 0000000..fa82796
--- /dev/null
+++ b/chrome/browser/ui/views/omnibox/webui_omnibox_popup_view.h
@@ -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.
+
+#ifndef CHROME_BROWSER_UI_VIEWS_OMNIBOX_WEBUI_OMNIBOX_POPUP_VIEW_H_
+#define CHROME_BROWSER_UI_VIEWS_OMNIBOX_WEBUI_OMNIBOX_POPUP_VIEW_H_
+
+#include "ui/base/metadata/metadata_header_macros.h"
+#include "ui/views/controls/webview/webview.h"
+
+class RealboxHandler;
+
+// A WebView to display WebUI suggestions in the Views OmniboxPopupContentsView.
+class WebUIOmniboxPopupView : public views::WebView {
+ public:
+  METADATA_HEADER(WebUIOmniboxPopupView);
+  explicit WebUIOmniboxPopupView(content::BrowserContext* browser_context);
+  WebUIOmniboxPopupView(const WebUIOmniboxPopupView&) = delete;
+  WebUIOmniboxPopupView& operator=(const WebUIOmniboxPopupView&) = delete;
+  ~WebUIOmniboxPopupView() override = default;
+
+  // TODO(crbug.com/1396174): OmniboxPopupView and WebUIOmniboxPopupView could
+  //  potentially implement the same interface which is better suited for WebUI.
+  void OnSelectedLineChanged(size_t old_selected_line,
+                             size_t new_selected_line);
+
+ private:
+  RealboxHandler* GetWebUIHandler();
+};
+
+#endif  // CHROME_BROWSER_UI_VIEWS_OMNIBOX_WEBUI_OMNIBOX_POPUP_VIEW_H_
diff --git a/chrome/browser/ui/web_applications/web_app_browsertest.cc b/chrome/browser/ui/web_applications/web_app_browsertest.cc
index b7c890ce..f974fcf 100644
--- a/chrome/browser/ui/web_applications/web_app_browsertest.cc
+++ b/chrome/browser/ui/web_applications/web_app_browsertest.cc
@@ -1607,7 +1607,7 @@
       public ::testing::WithParamInterface<OsIntegrationSubManagersState> {
  public:
   WebAppBrowserTestUpdateShortcutResult() {
-    if (GetParam() == OsIntegrationSubManagersState::kEnabled) {
+    if (GetParam() == OsIntegrationSubManagersState::kSaveStateToDB) {
       scoped_feature_list_.InitWithFeaturesAndParameters(
           {{features::kOsIntegrationSubManagers, {{"stage", "write_config"}}}},
           /*disabled_features=*/{});
@@ -1703,7 +1703,7 @@
 INSTANTIATE_TEST_SUITE_P(
     All,
     WebAppBrowserTestUpdateShortcutResult,
-    ::testing::Values(OsIntegrationSubManagersState::kEnabled,
+    ::testing::Values(OsIntegrationSubManagersState::kSaveStateToDB,
                       OsIntegrationSubManagersState::kDisabled),
     test::GetOsIntegrationSubManagersTestName);
 
diff --git a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
index f652899..1342e8c 100644
--- a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
+++ b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
@@ -28,6 +28,8 @@
 #include "chrome/browser/ui/webui/web_app_internals/web_app_internals_source.h"
 #include "chrome/browser/web_applications/extensions/web_app_extension_shortcut.h"
 #include "chrome/browser/web_applications/os_integration/os_integration_manager.h"
+#include "chrome/browser/web_applications/os_integration/os_integration_sub_manager.h"
+#include "chrome/browser/web_applications/os_integration/web_app_shortcut.h"
 #include "chrome/browser/web_applications/user_display_mode.h"
 #include "chrome/browser/web_applications/web_app_callback_app_identity.h"
 #include "chrome/browser/web_applications/web_app_command_scheduler.h"
@@ -350,11 +352,18 @@
   options.add_to_desktop = locations.on_desktop;
   options.add_to_quick_launch_bar = locations.in_quick_launch_bar;
   options.os_hooks[OsHookType::kRunOnOsLogin] = locations.in_startup;
+  options.reason = SHORTCUT_CREATION_AUTOMATED;
   // TODO(crbug.com/1401125): Remove InstallOsHooks() once OS integration
   // sub managers have been implemented.
   os_integration_manager_->InstallOsHooks(app_id, base::DoNothing(), nullptr,
                                           options);
-  os_integration_manager_->Synchronize(app_id, base::DoNothing());
+
+  SynchronizeOsOptions synchronize_options;
+  synchronize_options.add_shortcut_to_desktop = options.add_to_desktop;
+  synchronize_options.add_to_quick_launch_bar = options.add_to_quick_launch_bar;
+  synchronize_options.reason = options.reason;
+  os_integration_manager_->Synchronize(app_id, base::DoNothing(),
+                                       synchronize_options);
 }
 
 bool WebAppUiManagerImpl::CanAddAppToQuickLaunchBar() const {
diff --git a/chrome/browser/ui/webui/app_home/app_home_page_handler.cc b/chrome/browser/ui/webui/app_home/app_home_page_handler.cc
index e4bd2ac..e23f884 100644
--- a/chrome/browser/ui/webui/app_home/app_home_page_handler.cc
+++ b/chrome/browser/ui/webui/app_home/app_home_page_handler.cc
@@ -32,6 +32,8 @@
 #include "chrome/browser/ui/webui/extensions/extension_icon_source.h"
 #include "chrome/browser/web_applications/extension_status_utils.h"
 #include "chrome/browser/web_applications/locks/app_lock.h"
+#include "chrome/browser/web_applications/os_integration/os_integration_manager.h"
+#include "chrome/browser/web_applications/os_integration/os_integration_sub_manager.h"
 #include "chrome/browser/web_applications/web_app.h"
 #include "chrome/browser/web_applications/web_app_command_scheduler.h"
 #include "chrome/browser/web_applications/web_app_constants.h"
@@ -68,18 +70,6 @@
   return extension_id == extension_misc::kYoutubeAppId;
 }
 
-void AcquireAppLockAndScheduleCallback(
-    const std::string& operation_name,
-    web_app::WebAppProvider& provider,
-    const web_app::AppId& app_id,
-    base::OnceCallback<void(web_app::AppLock& lock)> callback) {
-  provider.scheduler().ScheduleCallbackWithLock<web_app::AppLock>(
-      operation_name,
-      std::make_unique<web_app::AppLockDescription,
-                       base::flat_set<web_app::AppId>>({app_id}),
-      std::move(callback));
-}
-
 }  // namespace
 
 AppHomePageHandler::AppHomePageHandler(
@@ -112,54 +102,6 @@
   return chrome::FindBrowserWithWebContents(web_ui_->GetWebContents());
 }
 
-void AppHomePageHandler::OnOsHooksInstalled(
-    const web_app::AppId& app_id,
-    const web_app::OsHooksErrors os_hooks_errors) {
-  // TODO(dmurph): Once installation takes the OsHooksErrors bitfield, then
-  // use that to compare with the results, and record if they all were
-  // successful, instead of just shortcuts.
-  bool error = os_hooks_errors[web_app::OsHookType::kShortcuts];
-  base::UmaHistogramBoolean("Apps.Launcher.InstallLocallyShortcutsCreated",
-                            !error);
-  web_app_provider_->install_manager().NotifyWebAppInstalledWithOsHooks(app_id);
-}
-
-void AppHomePageHandler::InstallOsHooks(const web_app::AppId& app_id,
-                                        web_app::AppLock* lock) {
-  web_app::InstallOsHooksOptions options;
-  options.add_to_desktop = true;
-  options.add_to_quick_launch_bar = false;
-  options.os_hooks[web_app::OsHookType::kShortcuts] = true;
-  options.os_hooks[web_app::OsHookType::kShortcutsMenu] = true;
-  options.os_hooks[web_app::OsHookType::kFileHandlers] = true;
-  options.os_hooks[web_app::OsHookType::kProtocolHandlers] = true;
-  options.os_hooks[web_app::OsHookType::kRunOnOsLogin] =
-      web_app_provider_->registrar_unsafe()
-          .GetAppRunOnOsLoginMode(app_id)
-          .value == web_app::RunOnOsLoginMode::kWindowed;
-
-  // Installed WebApp here is user uninstallable app, but it needs to check user
-  // uninstall-ability if there are apps with different source types.
-  // WebApp::CanUserUninstallApp will handles it.
-  const web_app::WebApp* web_app =
-      web_app_provider_->registrar_unsafe().GetAppById(app_id);
-  options.os_hooks[web_app::OsHookType::kUninstallationViaOsSettings] =
-      web_app->CanUserUninstallWebApp();
-
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
-    (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS))
-  options.os_hooks[web_app::OsHookType::kUrlHandlers] = true;
-#else
-  options.os_hooks[web_app::OsHookType::kUrlHandlers] = false;
-#endif
-
-  lock->os_integration_manager().InstallOsHooks(
-      app_id,
-      base::BindOnce(&AppHomePageHandler::OnOsHooksInstalled,
-                     weak_ptr_factory_.GetWeakPtr(), app_id),
-      /*web_app_info=*/nullptr, std::move(options));
-}
-
 void AppHomePageHandler::LaunchAppInternal(
     const std::string& app_id,
     int source,
@@ -667,24 +609,7 @@
 }
 
 void AppHomePageHandler::InstallAppLocally(const std::string& app_id) {
-  AcquireAppLockAndScheduleCallback(
-      "AppHomePageHandler::InstallAppLocally", *web_app_provider_, app_id,
-      base::BindOnce(
-          [](const web_app::AppId& app_id,
-             base::OnceCallback<void(const web_app::AppId& app_id,
-                                     web_app::AppLock* lock)>
-                 install_os_hooks_handler,
-             web_app::AppLock& lock) {
-            if (!lock.registrar().IsInstalled(app_id))
-              return;
-
-            std::move(install_os_hooks_handler).Run(app_id, &lock);
-            lock.sync_bridge().SetAppIsLocallyInstalled(app_id, true);
-            lock.sync_bridge().SetAppInstallTime(app_id, base::Time::Now());
-          },
-          app_id,
-          base::BindOnce(&AppHomePageHandler::InstallOsHooks,
-                         weak_ptr_factory_.GetWeakPtr())));
+  web_app_provider_->scheduler().InstallAppLocally(app_id, base::DoNothing());
 }
 
 }  // namespace webapps
diff --git a/chrome/browser/ui/webui/app_home/app_home_page_handler.h b/chrome/browser/ui/webui/app_home/app_home_page_handler.h
index 03c022e..7112049b 100644
--- a/chrome/browser/ui/webui/app_home/app_home_page_handler.h
+++ b/chrome/browser/ui/webui/app_home/app_home_page_handler.h
@@ -113,9 +113,6 @@
   void OnExtensionUninstallDialogClosed(bool did_start_uninstall,
                                         const std::u16string& error) override;
 
-  // Records result to UMA after OS Hooks are installed.
-  void OnOsHooksInstalled(const web_app::AppId& app_id,
-                          const web_app::OsHooksErrors os_hooks_errors);
   void InstallOsHooks(const web_app::AppId& app_id, web_app::AppLock* lock);
   void LaunchAppInternal(const std::string& app_id,
                          int source,
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 2adc926..796b7d9e 100644
--- a/chrome/browser/ui/webui/ash/emoji/emoji_page_handler.cc
+++ b/chrome/browser/ui/webui/ash/emoji/emoji_page_handler.cc
@@ -10,6 +10,7 @@
 #include "base/time/time.h"
 #include "base/timer/timer.h"
 #include "base/trace_event/trace_event.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/webui/ash/emoji/emoji_ui.h"
 #include "ui/base/clipboard/scoped_clipboard_writer.h"
 #include "ui/base/ime/ash/ime_bridge.h"
@@ -163,6 +164,12 @@
   std::move(callback).Run(enabled_features);
 }
 
+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);
+}
+
 void EmojiPageHandler::InsertEmoji(const std::string& emoji_to_insert,
                                    bool is_variant,
                                    int16_t search_length) {
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 4e74b86a..864159f 100644
--- a/chrome/browser/ui/webui/ash/emoji/emoji_page_handler.h
+++ b/chrome/browser/ui/webui/ash/emoji/emoji_page_handler.h
@@ -7,6 +7,8 @@
 
 #include "base/time/time.h"
 #include "chrome/browser/ui/webui/ash/emoji/emoji_picker.mojom.h"
+#include "chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.h"
+#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"
@@ -34,6 +36,7 @@
                    int16_t search_length) override;
   void IsIncognitoTextField(IsIncognitoTextFieldCallback callback) override;
   void GetFeatureList(GetFeatureListCallback callback) override;
+  void GetCategories(GetCategoriesCallback callback) override;
 
  private:
   mojo::Receiver<emoji_picker::mojom::PageHandler> receiver_;
@@ -42,6 +45,7 @@
   EmojiUI* const webui_controller_;
   bool incognito_mode_;
   bool no_text_field_;
+  GifTenorApiFetcher gif_tenor_api_fetcher_;
 };
 
 }  // 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 dfbf5896..cb2cb0c 100644
--- a/chrome/browser/ui/webui/ash/emoji/emoji_picker.mojom
+++ b/chrome/browser/ui/webui/ash/emoji/emoji_picker.mojom
@@ -42,4 +42,17 @@
   // Returns a comma separated list of features activated within the emoji
   // picker (ie. any feature flags or other related switches).
   GetFeatureList() => (array<Feature> feature_list);
+
+  // Returns a string in JSON format containing a list of GIF categories
+  // fetched from the tenor API (https://tenor.googleapis.com).
+  // JSON response format is shown below.
+  // {
+  //   tags: {
+  //     searchterm: string, // the search term that corresponds to the category
+  //     path: string, // the search url to request
+  //     image: string, // a url to the category's example GIF
+  //     name: string, // category name
+  //   }[]
+  // }
+  GetCategories() => (string categories);
 };
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
new file mode 100644
index 0000000..fb2202e
--- /dev/null
+++ b/chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.cc
@@ -0,0 +1,84 @@
+// 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/ui/webui/ash/emoji/gif_tenor_api_fetcher.h"
+
+#include <memory>
+#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 "services/network/public/cpp/shared_url_loader_factory.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";
+const int64_t kTimeoutMs = 10000;
+
+GifTenorApiFetcher::GifTenorApiFetcher() = default;
+
+GifTenorApiFetcher::~GifTenorApiFetcher() = default;
+
+void GifTenorApiFetcher::FetchCategories(
+    PageHandler::GetCategoriesCallback callback,
+    Profile* profile) {
+  constexpr net::NetworkTrafficAnnotationTag kTrafficAnnotation =
+      net::DefineNetworkTrafficAnnotation(
+          "chromeos_emoji_picker_categories_fetcher",
+          R"(
+      semantics {
+        sender: "ChromeOS Emoji Picker"
+        description:
+          "Gets GIF categories from the tenor API "
+          "(https://developers.google.com/tenor)."
+        trigger:
+          "When a user opens the emoji picker and select the GIF section."
+        data:
+          "None, (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=*/profile->GetDefaultStoragePartition()
+          ->GetURLLoaderFactoryForBrowserProcess(),
+      /*url=*/GURL(kTenorBaseUrl).Resolve(kCategoriesApi),
+      /*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::FetchCategoriesResponseHandler,
+                     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);
+}
+
+}  // 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
new file mode 100644
index 0000000..e79a4835
--- /dev/null
+++ b/chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.h
@@ -0,0 +1,37 @@
+// 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_UI_WEBUI_ASH_EMOJI_GIF_TENOR_API_FETCHER_H_
+#define CHROME_BROWSER_UI_WEBUI_ASH_EMOJI_GIF_TENOR_API_FETCHER_H_
+
+#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"
+
+namespace ash {
+
+class GifTenorApiFetcher {
+ public:
+  GifTenorApiFetcher();
+
+  ~GifTenorApiFetcher();
+
+  // Fetch tenor API categories endpoint
+  void FetchCategories(
+      emoji_picker::mojom::PageHandler::GetCategoriesCallback callback,
+      Profile* profile);
+
+  void FetchCategoriesResponseHandler(
+      emoji_picker::mojom::PageHandler::GetCategoriesCallback callback,
+      std::unique_ptr<EndpointResponse> response);
+
+ private:
+  std::unique_ptr<EndpointFetcher> endpoint_fetcher_;
+  base::WeakPtrFactory<GifTenorApiFetcher> weak_ptr_factory_{this};
+};
+}  // namespace ash
+
+#endif  // CHROME_BROWSER_UI_WEBUI_ASH_EMOJI_GIF_TENOR_API_FETCHER_H_
diff --git a/chrome/browser/ui/webui/ash/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/ash/login/gaia_screen_handler.cc
index 2dcac5c..3cabfa5 100644
--- a/chrome/browser/ui/webui/ash/login/gaia_screen_handler.cc
+++ b/chrome/browser/ui/webui/ash/login/gaia_screen_handler.cc
@@ -42,7 +42,9 @@
 #include "chrome/browser/ash/login/screens/network_error.h"
 #include "chrome/browser/ash/login/screens/saml_confirm_password_screen.h"
 #include "chrome/browser/ash/login/screens/signin_fatal_error_screen.h"
+#include "chrome/browser/ash/login/session/user_session_manager.h"
 #include "chrome/browser/ash/login/signin_partition_manager.h"
+#include "chrome/browser/ash/login/startup_utils.h"
 #include "chrome/browser/ash/login/ui/login_display_host.h"
 #include "chrome/browser/ash/login/ui/login_display_host_webui.h"
 #include "chrome/browser/ash/login/ui/signin_ui.h"
@@ -66,6 +68,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/webui/ash/login/cookie_waiter.h"
 #include "chrome/browser/ui/webui/ash/login/enrollment_screen_handler.h"
+#include "chrome/browser/ui/webui/ash/login/online_login_helper.h"
 #include "chrome/browser/ui/webui/ash/login/reset_screen_handler.h"
 #include "chrome/browser/ui/webui/ash/login/saml_confirm_password_handler.h"
 #include "chrome/browser/ui/webui/ash/login/signin_fatal_error_screen_handler.h"
@@ -80,6 +83,7 @@
 #include "chromeos/ash/components/login/auth/challenge_response/cert_utils.h"
 #include "chromeos/ash/components/login/auth/public/cryptohome_key_constants.h"
 #include "chromeos/ash/components/login/auth/public/saml_password_attributes.h"
+#include "chromeos/ash/components/login/auth/public/sync_trusted_vault_keys.h"
 #include "chromeos/ash/components/login/auth/public/user_context.h"
 #include "chromeos/ash/components/settings/cros_settings_names.h"
 #include "chromeos/components/onc/certificate_scope.h"
@@ -93,6 +97,7 @@
 #include "components/policy/proto/chrome_device_policy.pb.h"
 #include "components/prefs/pref_service.h"
 #include "components/strings/grit/components_strings.h"
+#include "components/sync/base/features.h"
 #include "components/user_manager/known_user.h"
 #include "components/user_manager/user_manager.h"
 #include "components/version_info/version_info.h"
@@ -106,6 +111,7 @@
 #include "net/cert/x509_certificate.h"
 #include "services/network/public/mojom/network_context.mojom.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
+#include "third_party/re2/src/re2/re2.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/chromeos/devicetype_utils.h"
 
@@ -124,6 +130,49 @@
 
 const char kEndpointGen[] = "1.0";
 
+constexpr char kLeadingWhitespaceRegex[] = R"(^[\x{0000}-\x{0020}].*)";
+constexpr char kTrailingWhitespaceRegex[] = R"(.*[\x{0000}-\x{0020}]$)";
+
+// Returns `true` if the provided string has leading or trailing whitespaces.
+// Whitespace is defined as a character with code from '\u0000' to '\u0020'.
+bool HasLeadingOrTrailingWhitespaces(const std::string& str) {
+  return RE2::FullMatch(str, kLeadingWhitespaceRegex) ||
+         RE2::FullMatch(str, kTrailingWhitespaceRegex);
+}
+
+absl::optional<SyncTrustedVaultKeys> GetSyncTrustedVaultKeysForUserContext(
+    const base::Value::Dict& js_object,
+    const std::string& gaia_id) {
+  SyncTrustedVaultKeys parsed_keys = SyncTrustedVaultKeys::FromJs(js_object);
+  if (parsed_keys.gaia_id() != gaia_id) {
+    return absl::nullopt;
+  }
+
+  return absl::make_optional(std::move(parsed_keys));
+}
+
+// Must be kept consistent with ChromeOSSamlApiUsed in enums.xml
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused
+enum class ChromeOSSamlApiUsed {
+  kNotSamlLogin = 0,
+  kSamlApiUsed = 1,
+  kSamlApiNotUsed = 2,
+  kMaxValue = kSamlApiNotUsed,
+};
+
+void RecordAPILogin(bool is_third_party_idp, bool is_api_used) {
+  ChromeOSSamlApiUsed login_type;
+  if (!is_third_party_idp) {
+    login_type = ChromeOSSamlApiUsed::kNotSamlLogin;
+  } else if (is_api_used) {
+    login_type = ChromeOSSamlApiUsed::kSamlApiUsed;
+  } else {
+    login_type = ChromeOSSamlApiUsed::kSamlApiNotUsed;
+  }
+  base::UmaHistogramEnumeration("ChromeOS.SAML.APILogin", login_type);
+}
+
 GaiaScreenHandler::GaiaScreenMode GetGaiaScreenMode(const std::string& email) {
   int authentication_behavior = 0;
   CrosSettings::Get()->GetInteger(kLoginAuthenticationBehavior,
@@ -200,6 +249,19 @@
     params.Set("flow", "nosignup");
 }
 
+bool ShouldCheckUserTypeBeforeAllowing() {
+  if (!features::IsFamilyLinkOnSchoolDeviceEnabled()) {
+    return false;
+  }
+
+  CrosSettings* cros_settings = CrosSettings::Get();
+  bool family_link_allowed = false;
+  cros_settings->GetBoolean(kAccountsPrefFamilyLinkAccountsAllowed,
+                            &family_link_allowed);
+
+  return family_link_allowed;
+}
+
 // TODO(https://crbug.com/1364455)
 // Make this function fallible when version_loader::GetVersion()
 // returns an optional that is empty
@@ -210,6 +272,14 @@
   *out_consent = GoogleUpdateSettings::GetCollectStatsConsent();
 }
 
+user_manager::UserType CalculateUserType(const AccountId& account_id) {
+  if (account_id.GetAccountType() == AccountType::ACTIVE_DIRECTORY) {
+    return user_manager::USER_TYPE_ACTIVE_DIRECTORY;
+  }
+
+  return user_manager::USER_TYPE_REGULAR;
+}
+
 chromeos::PinDialogManager* GetLoginScreenPinDialogManager() {
   DCHECK(ProfileHelper::IsSigninProfileInitialized());
   chromeos::CertificateProviderService* certificate_provider_service =
@@ -583,13 +653,20 @@
 void GaiaScreenHandler::RegisterMessages() {
   AddCallback("webviewLoadAborted",
               &GaiaScreenHandler::HandleWebviewLoadAborted);
+  AddCallback("completeLogin", &GaiaScreenHandler::HandleCompleteLogin);
   AddCallback("launchSAMLPublicSession",
               &GaiaScreenHandler::HandleLaunchSAMLPublicSession);
+  AddCallback("completeAuthentication",
+              &GaiaScreenHandler::HandleCompleteAuthentication);
+  AddCallback("usingSAMLAPI", &GaiaScreenHandler::HandleUsingSAMLAPI);
   AddCallback("recordSAMLProvider",
               &GaiaScreenHandler::HandleRecordSAMLProvider);
   AddCallback("samlChallengeMachineKey",
               &GaiaScreenHandler::HandleSamlChallengeMachineKey);
   AddCallback("loginWebuiReady", &GaiaScreenHandler::HandleGaiaUIReady);
+  AddCallback("identifierEntered", &GaiaScreenHandler::HandleIdentifierEntered);
+  AddCallback("authExtensionLoaded",
+              &GaiaScreenHandler::HandleAuthExtensionLoaded);
   AddCallback("setIsFirstSigninStep",
               &GaiaScreenHandler::HandleIsFirstSigninStep);
   AddCallback("samlStateChanged", &GaiaScreenHandler::HandleSamlStateChanged);
@@ -597,12 +674,45 @@
               &GaiaScreenHandler::HandleSecurityTokenPinEntered);
   AddCallback("onFatalError", &GaiaScreenHandler::HandleOnFatalError);
   AddCallback("removeUserByEmail", &GaiaScreenHandler::HandleUserRemoved);
+  AddCallback("passwordEntered", &GaiaScreenHandler::HandlePasswordEntered);
   AddCallback("showLoadingTimeoutError",
               &GaiaScreenHandler::HandleShowLoadingTimeoutError);
 
   BaseScreenHandler::RegisterMessages();
 }
 
+void GaiaScreenHandler::HandleIdentifierEntered(const std::string& user_email) {
+  // We cannot tell a user type from the identifier, so we delay checking if
+  // the account should be allowed.
+  if (ShouldCheckUserTypeBeforeAllowing()) {
+    return;
+  }
+
+  user_manager::KnownUser known_user(g_browser_process->local_state());
+  if (LoginDisplayHost::default_host() &&
+      !LoginDisplayHost::default_host()->IsUserAllowlisted(
+          known_user.GetAccountId(user_email, std::string() /* id */,
+                                  AccountType::UNKNOWN),
+          absl::nullopt)) {
+    ShowAllowlistCheckFailedError();
+  }
+}
+
+void GaiaScreenHandler::HandleAuthExtensionLoaded() {
+  VLOG(1) << "Auth extension finished loading";
+  // Recreate the client cert usage observer, in order to track only the certs
+  // used during the current sign-in attempt.
+  extension_provided_client_cert_usage_observer_ =
+      std::make_unique<LoginClientCertUsageObserver>();
+
+  // Clear old storage partitions after a new sign-in page is loaded. All
+  // reference to the old storage partitions should be cleared.
+  login::SigninPartitionManager* signin_partition_manager =
+      login::SigninPartitionManager::Factory::GetForBrowserContext(
+          Profile::FromWebUI(web_ui()));
+  signin_partition_manager->DisposeOldStoragePartitions();
+}
+
 void GaiaScreenHandler::HandleWebviewLoadAborted(int error_code) {
   if (error_code == net::ERR_INVALID_AUTH_CREDENTIALS) {
     // Silently ignore this error - it is used as an intermediate state for
@@ -653,6 +763,139 @@
   return account_id;
 }
 
+void GaiaScreenHandler::HandleCompleteAuthentication(
+    const std::string& gaia_id,
+    const std::string& email,
+    const std::string& password_value,
+    const base::Value::List& scraped_saml_passwords_value,
+    bool using_saml,
+    const base::Value::List& services_list,
+    bool services_provided,
+    const base::Value::Dict& password_attributes,
+    const base::Value::Dict& sync_trusted_vault_keys) {
+  if (!LoginDisplayHost::default_host()) {
+    return;
+  }
+
+  DCHECK(!email.empty());
+  DCHECK(!gaia_id.empty());
+
+  if (!using_saml) {
+    base::UmaHistogramEnumeration("OOBE.GaiaScreen.SuccessLoginRequests",
+                                  login_request_variant_);
+    // Report whether the password has characters ignored by Gaia
+    // (leading/trailing whitespaces).
+    base::UmaHistogramBoolean("OOBE.GaiaScreen.PasswordIgnoredChars",
+                              HasLeadingOrTrailingWhitespaces(password_value));
+  }
+  auto scraped_saml_passwords =
+      ::login::ConvertToStringList(scraped_saml_passwords_value);
+  const auto services = ::login::ConvertToStringList(services_list);
+  auto password = password_value;
+
+  if (IsSamlUserPasswordless()) {
+    // In the passwordless case, the user data will be protected by non password
+    // based mechanisms. Clear anything that got collected into passwords.
+    scraped_saml_passwords.clear();
+    password.clear();
+  }
+
+  if (using_saml && !using_saml_api_ && !IsSamlUserPasswordless()) {
+    RecordScrapedPasswordCount(scraped_saml_passwords.size());
+  }
+
+  const AccountId account_id =
+      GetAccountId(email, gaia_id, AccountType::GOOGLE);
+  // Execute delayed allowlist check that is based on user type. If Gaia done
+  // times out and doesn't provide us with services list try to use a saved
+  // UserType.
+  const user_manager::UserType user_type =
+      services_provided
+          ? login::GetUsertypeFromServicesString(services)
+          : user_manager::UserManager::Get()->GetUserType(account_id);
+  if (ShouldCheckUserTypeBeforeAllowing() &&
+      !LoginDisplayHost::default_host()->IsUserAllowlisted(account_id,
+                                                           user_type)) {
+    ShowAllowlistCheckFailedError();
+    return;
+  }
+
+  // Record amount of time from the moment screen was shown till
+  // completeAuthentication signal come. Only for no SAML flow and only during
+  // first run in OOBE.
+  if (elapsed_timer_ && !using_saml &&
+      session_manager::SessionManager::Get()->session_state() ==
+          session_manager::SessionState::OOBE) {
+    base::UmaHistogramMediumTimes("OOBE.GaiaLoginTime",
+                                  elapsed_timer_->Elapsed());
+    elapsed_timer_.reset();
+  }
+
+  const std::string sanitized_email = gaia::SanitizeEmail(email);
+  LoginDisplayHost::default_host()->SetDisplayEmail(sanitized_email);
+
+  OnlineLoginHelper::CompleteLoginCallback complete_login_callback =
+      base::BindOnce([](std::unique_ptr<UserContext> user_context) {
+        LoginDisplayHost::default_host()->CompleteLogin(*user_context);
+      });
+
+  if (password.empty() && !IsSamlUserPasswordless()) {
+    CHECK_NE(scraped_saml_passwords.size(), 1u);
+    complete_login_callback = base::BindOnce(
+        &GaiaScreenHandler::SAMLConfirmPassword, weak_factory_.GetWeakPtr(),
+        std::move(scraped_saml_passwords));
+  }
+
+  login::SigninPartitionManager* signin_partition_manager =
+      login::SigninPartitionManager::Factory::GetForBrowserContext(
+          Profile::FromWebUI(web_ui()));
+  online_login_helper_ = std::make_unique<OnlineLoginHelper>(
+      signin_partition_name_, signin_partition_manager,
+      base::BindOnce(&GaiaScreenHandler::OnCookieWaitTimeout,
+                     weak_factory_.GetWeakPtr()),
+      std::move(complete_login_callback));
+
+  auto user_context = std::make_unique<UserContext>();
+  SigninError error;
+  if (!login::BuildUserContextForGaiaSignIn(
+          user_type, account_id, using_saml, using_saml_api_, password,
+          SamlPasswordAttributes::FromJs(password_attributes),
+          GetSyncTrustedVaultKeysForUserContext(sync_trusted_vault_keys,
+                                                gaia_id),
+          *extension_provided_client_cert_usage_observer_, user_context.get(),
+          &error)) {
+    LoginDisplayHost::default_host()->GetSigninUI()->ShowSigninError(
+        error, /*details=*/std::string());
+    return;
+  }
+
+  online_login_helper_->SetUserContext(std::move(user_context));
+  online_login_helper_->RequestCookiesAndCompleteAuthentication();
+
+  if (test_expects_complete_login_) {
+    VLOG(2) << "Complete test login for " << sanitized_email
+            << ", requested=" << test_user_;
+
+    test_expects_complete_login_ = false;
+    test_user_.clear();
+    test_pass_.clear();
+  }
+}
+
+void GaiaScreenHandler::OnCookieWaitTimeout() {
+  LoadAuthExtension(true /* force */);
+  LoginDisplayHost::default_host()->GetSigninUI()->ShowSigninError(
+      SigninError::kCookieWaitTimeout, /*details=*/std::string());
+}
+
+void GaiaScreenHandler::HandleCompleteLogin(const std::string& gaia_id,
+                                            const std::string& typed_email,
+                                            const std::string& password,
+                                            bool using_saml) {
+  VLOG(1) << "HandleCompleteLogin";
+  DoCompleteLogin(gaia_id, typed_email, password, using_saml);
+}
+
 void GaiaScreenHandler::HandleLaunchSAMLPublicSession(
     const std::string& email) {
   const AccountId account_id =
@@ -666,6 +909,10 @@
       context, SigninSpecifics());
 }
 
+void GaiaScreenHandler::HandleUsingSAMLAPI(bool is_third_party_idp) {
+  SetSAMLPrincipalsAPIUsed(is_third_party_idp, /*is_api_used=*/true);
+}
+
 void GaiaScreenHandler::HandleRecordSAMLProvider(
     const std::string& x509certificate) {
   metrics::RecordSAMLProvider(x509certificate);
@@ -785,10 +1032,45 @@
   }
 }
 
+void GaiaScreenHandler::HandlePasswordEntered() {
+  base::UmaHistogramEnumeration("OOBE.GaiaScreen.LoginRequests",
+                                login_request_variant_);
+}
+
 void GaiaScreenHandler::HandleShowLoadingTimeoutError() {
   UpdateState(NetworkError::ERROR_REASON_LOADING_TIMEOUT);
 }
 
+void GaiaScreenHandler::DoCompleteLogin(const std::string& gaia_id,
+                                        const std::string& typed_email,
+                                        const std::string& password,
+                                        bool using_saml) {
+  DCHECK(!typed_email.empty());
+  DCHECK(!gaia_id.empty());
+  const std::string sanitized_email = gaia::SanitizeEmail(typed_email);
+  LoginDisplayHost::default_host()->SetDisplayEmail(sanitized_email);
+  const AccountId account_id =
+      GetAccountId(typed_email, gaia_id, AccountType::GOOGLE);
+  const user_manager::User* const user =
+      user_manager::UserManager::Get()->FindUser(account_id);
+
+  UserContext user_context;
+  SigninError error;
+  if (!login::BuildUserContextForGaiaSignIn(
+          user ? user->GetType() : CalculateUserType(account_id),
+          GetAccountId(typed_email, gaia_id, AccountType::GOOGLE), using_saml,
+          using_saml_api_, password, SamlPasswordAttributes(),
+          /*sync_trusted_vault_keys=*/absl::nullopt,
+          *extension_provided_client_cert_usage_observer_, &user_context,
+          &error)) {
+    LoginDisplayHost::default_host()->GetSigninUI()->ShowSigninError(
+        error, /*details=*/std::string());
+    return;
+  }
+
+  LoginDisplayHost::default_host()->CompleteLogin(user_context);
+}
+
 void GaiaScreenHandler::StartClearingDnsCache() {
   if (dns_clear_task_running_ ||
       !g_browser_process->system_network_context_manager()) {
@@ -866,9 +1148,17 @@
     CallExternalAPI("clickPrimaryButtonForTesting");
   }
 
-  // Test properties are cleared in OnCompleteAuthentication because the form
-  // submission might fail and login will not be attempted after reloading if
-  // they are cleared here.
+  // Test properties are cleared in HandleCompleteAuthentication because the
+  // form submission might fail and login will not be attempted after reloading
+  // if they are cleared here.
+}
+
+void GaiaScreenHandler::SetSAMLPrincipalsAPIUsed(bool is_third_party_idp,
+                                                 bool is_api_used) {
+  using_saml_api_ = is_api_used;
+  // This correctly records the standard GAIA login and SAML flow
+  // with Chrome Credentials Passing API used/not used
+  RecordAPILogin(is_third_party_idp, is_api_used);
 }
 
 void GaiaScreenHandler::Show() {
@@ -879,6 +1169,7 @@
   if (LoginDisplayHost::default_host())
     data.Set("hasUserPods", LoginDisplayHost::default_host()->HasUserPods());
   ShowInWebUI(std::move(data));
+  elapsed_timer_ = std::make_unique<base::ElapsedTimer>();
   hidden_ = false;
 }
 
@@ -896,6 +1187,18 @@
   // loading slowly.
   // CallExternalAPI("onBeforeLoad");
   populated_account_id_ = account_id;
+
+  login_request_variant_ = GaiaLoginVariant::kUnknown;
+  if (account_id.is_valid()) {
+    login_request_variant_ = GaiaLoginVariant::kOnlineSignin;
+  } else {
+    if (StartupUtils::IsOobeCompleted() && StartupUtils::IsDeviceOwned()) {
+      login_request_variant_ = GaiaLoginVariant::kAddUser;
+    } else {
+      login_request_variant_ = GaiaLoginVariant::kOobe;
+    }
+  }
+
   StartClearingDnsCache();
   StartClearingCookies(base::BindOnce(&GaiaScreenHandler::ShowGaiaScreenIfReady,
                                       weak_factory_.GetWeakPtr()));
@@ -930,21 +1233,6 @@
   CallExternalAPI("reset");
 }
 
-std::string GaiaScreenHandler::GetSigninPartitionName() {
-  return signin_partition_name_;
-}
-
-void GaiaScreenHandler::OnCompleteAuthentication(const std::string& email) {
-  if (test_expects_complete_login_) {
-    VLOG(2) << "Complete test login for " << email
-            << ", requested=" << test_user_;
-
-    test_expects_complete_login_ = false;
-    test_user_.clear();
-    test_pass_.clear();
-  }
-}
-
 void GaiaScreenHandler::ShowSecurityTokenPinDialog(
     const std::string& /*caller_extension_name*/,
     chromeos::security_token_pin::CodeType code_type,
@@ -999,6 +1287,21 @@
   saml_challenge_key_handler_ = std::make_unique<SamlChallengeKeyHandler>();
 }
 
+void GaiaScreenHandler::RecordScrapedPasswordCount(int password_count) {
+  // We are handling scraped passwords here so this is SAML flow without
+  // Chrome Credentials Passing API
+  SetSAMLPrincipalsAPIUsed(/*is_third_party_idp=*/true, /*is_api_used=*/false);
+  // Use a histogram that has 11 buckets, one for each of the values in [0, 9]
+  // and an overflow bucket at the end.
+  base::UmaHistogramExactLinear("ChromeOS.SAML.Scraping.PasswordCountAll",
+                                password_count, 11);
+}
+
+bool GaiaScreenHandler::IsSamlUserPasswordless() {
+  return extension_provided_client_cert_usage_observer_ &&
+         extension_provided_client_cert_usage_observer_->ClientCertsWereUsed();
+}
+
 void GaiaScreenHandler::ShowGaiaScreenIfReady() {
   if (!initialized_) {
     show_on_init_ = true;
@@ -1107,4 +1410,11 @@
   LoadGaia(context);
 }
 
+void GaiaScreenHandler::SAMLConfirmPassword(
+    ::login::StringList scraped_saml_passwords,
+    std::unique_ptr<UserContext> user_context) {
+  LoginDisplayHost::default_host()->GetSigninUI()->SAMLConfirmPassword(
+      std::move(scraped_saml_passwords), std::move(user_context));
+}
+
 }  // namespace ash
diff --git a/chrome/browser/ui/webui/ash/login/gaia_screen_handler.h b/chrome/browser/ui/webui/ash/login/gaia_screen_handler.h
index 9f7f4fe4..5c2b83e 100644
--- a/chrome/browser/ui/webui/ash/login/gaia_screen_handler.h
+++ b/chrome/browser/ui/webui/ash/login/gaia_screen_handler.h
@@ -13,6 +13,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/values.h"
 #include "chrome/browser/ash/login/gaia_reauth_token_fetcher.h"
+#include "chrome/browser/ash/login/login_client_cert_usage_observer.h"
 #include "chrome/browser/ash/login/screens/network_error.h"
 #include "chrome/browser/certificate_provider/security_token_pin_dialog_host.h"
 #include "chrome/browser/ui/webui/ash/login/base_screen_handler.h"
@@ -26,6 +27,10 @@
 
 class AccountId;
 
+namespace base {
+class ElapsedTimer;
+}  // namespace base
+
 namespace network {
 class NSSTempCertsCacheChromeOS;
 }  // namespace network
@@ -88,12 +93,6 @@
                                        const std::string& services) = 0;
   // Reset authenticator.
   virtual void Reset() = 0;
-
-  // Returns the partition name during sign-in.
-  virtual std::string GetSigninPartitionName() = 0;
-  // Called when authenticaion is completed. This is used to clear the test
-  // properties.
-  virtual void OnCompleteAuthentication(const std::string& email) = 0;
 };
 
 // A class that handles WebUI hooks in Gaia screen.
@@ -138,8 +137,6 @@
                                const std::string& password,
                                const std::string& services) override;
   void Reset() override;
-  std::string GetSigninPartitionName() override;
-  void OnCompleteAuthentication(const std::string& email) override;
 
   // SecurityTokenPinDialogHost:
   void ShowSecurityTokenPinDialog(
@@ -195,7 +192,25 @@
 
   // WebUI message handlers.
   void HandleWebviewLoadAborted(int error_code);
+  void HandleCompleteAuthentication(
+      const std::string& gaia_id,
+      const std::string& email,
+      const std::string& password,
+      const base::Value::List& scraped_saml_passwords_value,
+      bool using_saml,
+      const base::Value::List& services_list,
+      bool services_provided,
+      const base::Value::Dict& password_attributes,
+      const base::Value::Dict& sync_trusted_vault_keys);
+  void HandleCompleteLogin(const std::string& gaia_id,
+                           const std::string& typed_email,
+                           const std::string& password,
+                           bool using_saml);
   void HandleLaunchSAMLPublicSession(const std::string& email);
+
+  // Handles SAML/GAIA login flow metrics
+  // is_third_party_idp == false means GAIA-based authentication
+  void HandleUsingSAMLAPI(bool is_third_party_idp);
   void HandleRecordSAMLProvider(const std::string& x509certificate);
   void HandleSamlChallengeMachineKey(const std::string& callback_id,
                                      const std::string& url,
@@ -205,6 +220,10 @@
 
   void HandleGaiaUIReady();
 
+  void HandleIdentifierEntered(const std::string& account_identifier);
+
+  void HandleAuthExtensionLoaded();
+
   // Allows WebUI to control the login shelf's guest and apps buttons visibility
   // during OOBE.
   void HandleIsFirstSigninStep(bool is_first);
@@ -224,6 +243,12 @@
 
   void HandleShowLoadingTimeoutError();
 
+  // Really handles the complete login message.
+  void DoCompleteLogin(const std::string& gaia_id,
+                       const std::string& typed_email,
+                       const std::string& password,
+                       bool using_saml);
+
   // Kick off cookie / local storage cleanup.
   void StartClearingCookies(base::OnceClosure on_clear_callback);
   void OnCookiesCleared(base::OnceClosure on_clear_callback);
@@ -235,6 +260,13 @@
   // Attempts login for test.
   void SubmitLoginFormForTest();
 
+  // Updates the member variable and UMA histogram indicating whether the
+  // Chrome Credentials Passing API was used during SAML login.
+  void SetSAMLPrincipalsAPIUsed(bool is_third_party_idp, bool is_api_used);
+
+  void RecordScrapedPasswordCount(int password_count);
+  bool IsSamlUserPasswordless();
+
   // Shows signin screen after dns cache and cookie cleanup operations finish.
   void ShowGaiaScreenIfReady();
 
@@ -263,6 +295,8 @@
                          const std::string& id,
                          const AccountType& account_type) const;
 
+  void OnCookieWaitTimeout();
+
   bool is_security_token_pin_dialog_running() const {
     return !security_token_pin_dialog_closed_callback_.is_null();
   }
@@ -275,6 +309,9 @@
   void OnGaiaReauthTokenFetched(const login::GaiaContext& context,
                                 const std::string& token);
 
+  void SAMLConfirmPassword(::login::StringList scraped_saml_passwords,
+                           std::unique_ptr<UserContext> user_context);
+
   // Current state of Gaia frame.
   FrameState frame_state_ = FRAME_STATE_UNKNOWN;
 
@@ -302,6 +339,11 @@
   // clean-up finish, and the handler is initialized (i.e. the web UI is ready).
   bool show_when_ready_ = false;
 
+  // This flag is set when user authenticated using the Chrome Credentials
+  // Passing API (the login could happen via SAML or, with the current
+  // server-side implementation, via Gaia).
+  bool using_saml_api_ = false;
+
   // Test credentials.
   std::string test_user_;
   std::string test_pass_;
@@ -323,6 +365,9 @@
   // The type of Gaia page to show.
   GaiaScreenMode screen_mode_ = GAIA_SCREEN_MODE_DEFAULT;
 
+  std::unique_ptr<LoginClientCertUsageObserver>
+      extension_provided_client_cert_usage_observer_;
+
   std::unique_ptr<PublicSamlUrlFetcher> public_saml_url_fetcher_;
 
   // Used to fetch and store the Gaia reauth request token for Cryptohome
@@ -353,12 +398,19 @@
 
   bool hidden_ = true;
 
+  // Used to record amount of time user needed for successful online login.
+  std::unique_ptr<base::ElapsedTimer> elapsed_timer_;
+
   std::string signin_partition_name_;
 
+  GaiaLoginVariant login_request_variant_ = GaiaLoginVariant::kUnknown;
+
   // Handler for `samlChallengeMachineKey` request.
   std::unique_ptr<SamlChallengeKeyHandler> saml_challenge_key_handler_;
   std::unique_ptr<SamlChallengeKeyHandler> saml_challenge_key_handler_for_test_;
 
+  std::unique_ptr<OnlineLoginHelper> online_login_helper_;
+
   base::WeakPtrFactory<GaiaScreenHandler> weak_factory_{this};
 };
 
diff --git a/chrome/browser/ui/webui/ash/login/testapi/oobe_test_api_handler.cc b/chrome/browser/ui/webui/ash/login/testapi/oobe_test_api_handler.cc
index 5fed67a..6f3bbdf7 100644
--- a/chrome/browser/ui/webui/ash/login/testapi/oobe_test_api_handler.cc
+++ b/chrome/browser/ui/webui/ash/login/testapi/oobe_test_api_handler.cc
@@ -118,14 +118,13 @@
 }
 
 void OobeTestAPIHandler::SkipToLoginForTesting() {
-  if (!WizardController::default_controller() ||
-      !WizardController::default_controller()->is_initialized()) {
-    LOG(WARNING)
+  WizardController* controller = WizardController::default_controller();
+  if (!controller || !controller->is_initialized()) {
+    LOG(ERROR)
         << "SkipToLoginForTesting is called when WizardController is not yet "
            "initialized. Please report at https://crbug.com/1336940";
-    LoginDisplayHost::default_host()->StartWizard(OOBE_SCREEN_UNKNOWN);
+    return;
   }
-  WizardController* controller = WizardController::default_controller();
   controller->SkipToLoginForTesting();  // IN-TEST
 }
 
diff --git a/chrome/browser/ui/webui/ash/login/testapi/oobe_test_api_handler.h b/chrome/browser/ui/webui/ash/login/testapi/oobe_test_api_handler.h
index d88a0af..f22b9bd 100644
--- a/chrome/browser/ui/webui/ash/login/testapi/oobe_test_api_handler.h
+++ b/chrome/browser/ui/webui/ash/login/testapi/oobe_test_api_handler.h
@@ -30,8 +30,6 @@
  private:
   void LoginWithPin(const std::string& username, const std::string& pin);
   void AdvanceToScreen(const std::string& screen);
-  // Advances to login/update screen. This function starts wizard controller if
-  // it is not initialized.
   void SkipToLoginForTesting();
   void SkipPostLoginScreens();
   void LoginAsGuest();
diff --git a/chrome/browser/ui/webui/ntp/OWNERS b/chrome/browser/ui/webui/ntp/OWNERS
index 691d9344..32afe4ae 100644
--- a/chrome/browser/ui/webui/ntp/OWNERS
+++ b/chrome/browser/ui/webui/ntp/OWNERS
@@ -1,4 +1,4 @@
 file://components/search/OWNERS
 estade@chromium.org
 
-per-file app_launcher_handler.*=dmurph@chromium.org
+per-file app_launcher_handler*=dmurph@chromium.org
diff --git a/chrome/browser/ui/webui/ntp/app_launcher_handler_unittest.cc b/chrome/browser/ui/webui/ntp/app_launcher_handler_unittest.cc
index f18b2bc4..b5ccd86 100644
--- a/chrome/browser/ui/webui/ntp/app_launcher_handler_unittest.cc
+++ b/chrome/browser/ui/webui/ntp/app_launcher_handler_unittest.cc
@@ -87,7 +87,7 @@
       public ::testing::WithParamInterface<OsIntegrationSubManagersState> {
  public:
   AppLauncherHandlerTest() {
-    if (GetParam() == OsIntegrationSubManagersState::kEnabled) {
+    if (GetParam() == OsIntegrationSubManagersState::kSaveStateToDB) {
       scoped_feature_list_.InitWithFeaturesAndParameters(
           {{features::kOsIntegrationSubManagers, {{"stage", "write_config"}}}},
           /*disabled_features=*/{});
@@ -277,6 +277,6 @@
 INSTANTIATE_TEST_SUITE_P(
     All,
     AppLauncherHandlerTest,
-    ::testing::Values(OsIntegrationSubManagersState::kEnabled,
+    ::testing::Values(OsIntegrationSubManagersState::kSaveStateToDB,
                       OsIntegrationSubManagersState::kDisabled),
     web_app::test::GetOsIntegrationSubManagersTestName);
diff --git a/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.cc b/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.cc
index 9a7dc327..05f004f 100644
--- a/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.cc
+++ b/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.cc
@@ -11,6 +11,7 @@
 #include "chrome/grit/omnibox_popup_resources.h"
 #include "chrome/grit/omnibox_popup_resources_map.h"
 #include "content/public/browser/web_ui_data_source.h"
+#include "ui/webui/color_change_listener/color_change_handler.h"
 
 OmniboxPopupUI::OmniboxPopupUI(content::WebUI* web_ui)
     : ui::MojoWebUIController(web_ui, /*enable_chrome_send=*/true) {
@@ -33,7 +34,7 @@
 
 void OmniboxPopupUI::BindInterface(
     mojo::PendingReceiver<omnibox::mojom::PageHandler> pending_page_handler) {
-  popup_handler_ = std::make_unique<RealboxHandler>(
+  webui_handler_ = std::make_unique<RealboxHandler>(
       std::move(pending_page_handler), Profile::FromWebUI(web_ui()),
       web_ui()->GetWebContents(), &metrics_reporter_);
 }
@@ -42,3 +43,10 @@
     mojo::PendingReceiver<metrics_reporter::mojom::PageMetricsHost> receiver) {
   metrics_reporter_.BindInterface(std::move(receiver));
 }
+
+void OmniboxPopupUI::BindInterface(
+    mojo::PendingReceiver<color_change_listener::mojom::PageHandler>
+        pending_receiver) {
+  color_provider_handler_ = std::make_unique<ui::ColorChangeHandler>(
+      web_ui()->GetWebContents(), std::move(pending_receiver));
+}
diff --git a/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.h b/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.h
index 498af04c..4654e03f 100644
--- a/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.h
+++ b/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.h
@@ -12,10 +12,15 @@
 #include "components/omnibox/browser/omnibox.mojom-forward.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "ui/webui/mojo_web_ui_controller.h"
+#include "ui/webui/resources/cr_components/color_change_listener/color_change_listener.mojom-forward.h"
 #include "ui/webui/resources/js/metrics_reporter/metrics_reporter.mojom-forward.h"
 
 class RealboxHandler;
 
+namespace ui {
+class ColorChangeHandler;
+}  // namespace ui
+
 // The Web UI controller for the chrome://omnibox-popup.top-chrome.
 class OmniboxPopupUI : public ui::MojoWebUIController {
  public:
@@ -32,9 +37,17 @@
   // mojo interface passing the pending receiver that will be internally bound.
   void BindInterface(
       mojo::PendingReceiver<metrics_reporter::mojom::PageMetricsHost> receiver);
+  // Instantiates the implementor of color_change_listener::mojom::PageHandler
+  // mojo interface passing the pending receiver that will be internally bound.
+  void BindInterface(
+      mojo::PendingReceiver<color_change_listener::mojom::PageHandler>
+          pending_receiver);
+
+  RealboxHandler* webui_handler() { return webui_handler_.get(); }
 
  private:
-  std::unique_ptr<RealboxHandler> popup_handler_;
+  std::unique_ptr<RealboxHandler> webui_handler_;
+  std::unique_ptr<ui::ColorChangeHandler> color_provider_handler_;
   MetricsReporter metrics_reporter_;
 
   WEB_UI_CONTROLLER_TYPE_DECL();
diff --git a/chrome/browser/ui/webui/realbox/realbox_handler.cc b/chrome/browser/ui/webui/realbox/realbox_handler.cc
index 75d98b7..5a8c9ea8 100644
--- a/chrome/browser/ui/webui/realbox/realbox_handler.cc
+++ b/chrome/browser/ui/webui/realbox/realbox_handler.cc
@@ -861,3 +861,7 @@
     }
   }
 }
+
+void RealboxHandler::SelectMatchAtLine(size_t old_line, size_t new_line) {
+  page_->SelectMatchAtLine(new_line);
+}
diff --git a/chrome/browser/ui/webui/realbox/realbox_handler.h b/chrome/browser/ui/webui/realbox/realbox_handler.h
index 92936c0..1e7203b4 100644
--- a/chrome/browser/ui/webui/realbox/realbox_handler.h
+++ b/chrome/browser/ui/webui/realbox/realbox_handler.h
@@ -109,6 +109,8 @@
                const AutocompleteMatch&,
                IDNA2008DeviationCharacter);
 
+  void SelectMatchAtLine(size_t old_line, size_t new_line);
+
  private:
   raw_ptr<Profile> profile_;
   raw_ptr<content::WebContents> web_contents_;
diff --git a/chrome/browser/ui/webui/realbox/realbox_handler_browsertest.cc b/chrome/browser/ui/webui/realbox/realbox_handler_browsertest.cc
index 409ee10a..8a9de18 100644
--- a/chrome/browser/ui/webui/realbox/realbox_handler_browsertest.cc
+++ b/chrome/browser/ui/webui/realbox/realbox_handler_browsertest.cc
@@ -152,6 +152,7 @@
       omnibox::mojom::AutocompleteResultPtr result) override {}
   void AutocompleteResultChanged(
       omnibox::mojom::AutocompleteResultPtr result) override {}
+  void SelectMatchAtLine(uint8_t line) override {}
   mojo::PendingRemote<omnibox::mojom::Page> GetRemotePage() {
     return receiver_.BindNewPipeAndPassRemote();
   }
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn
index 3b8d436..d807588e 100644
--- a/chrome/browser/web_applications/BUILD.gn
+++ b/chrome/browser/web_applications/BUILD.gn
@@ -112,8 +112,8 @@
     "os_integration/protocol_handling_sub_manager.h",
     "os_integration/run_on_os_login_sub_manager.cc",
     "os_integration/run_on_os_login_sub_manager.h",
-    "os_integration/shortcut_handling_sub_manager.cc",
-    "os_integration/shortcut_handling_sub_manager.h",
+    "os_integration/shortcut_sub_manager.cc",
+    "os_integration/shortcut_sub_manager.h",
     "os_integration/url_handler_manager.cc",
     "os_integration/url_handler_manager.h",
     "os_integration/web_app_file_handler_manager.cc",
@@ -752,7 +752,7 @@
     "isolated_web_apps/isolated_web_app_browsertest.cc",
     "isolated_web_apps/isolated_web_app_url_loader_factory_browsertest.cc",
     "manifest_update_manager_browsertest.cc",
-    "os_integration/shortcut_handling_sub_manager_browsertest.cc",
+    "os_integration/shortcut_sub_manager_browsertest.cc",
     "preinstalled_web_app_manager_browsertest.cc",
     "preinstalled_web_apps_browsertest.cc",
     "user_uninstalled_preinstalled_web_app_prefs_browsertest.cc",
diff --git a/chrome/browser/web_applications/commands/install_app_locally_command.cc b/chrome/browser/web_applications/commands/install_app_locally_command.cc
index 0a0c619..5f18de39 100644
--- a/chrome/browser/web_applications/commands/install_app_locally_command.cc
+++ b/chrome/browser/web_applications/commands/install_app_locally_command.cc
@@ -98,9 +98,15 @@
                      weak_factory_.GetWeakPtr()));
 
   app_lock_->os_integration_manager().InstallOsHooks(
-      app_id_, os_hooks_barrier, /*web_app_info=*/nullptr, std::move(options));
+      app_id_, os_hooks_barrier, /*web_app_info=*/nullptr, options);
+
+  SynchronizeOsOptions synchronize_options;
+  synchronize_options.add_shortcut_to_desktop = options.add_to_desktop;
+  synchronize_options.add_to_quick_launch_bar = options.add_to_quick_launch_bar;
+  synchronize_options.reason = options.reason;
   app_lock_->os_integration_manager().Synchronize(
-      app_id_, base::BindOnce(os_hooks_barrier, web_app::OsHooksErrors()));
+      app_id_, base::BindOnce(os_hooks_barrier, OsHooksErrors()),
+      synchronize_options);
 }
 
 void InstallAppLocallyCommand::OnOsHooksInstalled(
diff --git a/chrome/browser/web_applications/commands/os_integration_synchronize_command_unittest.cc b/chrome/browser/web_applications/commands/os_integration_synchronize_command_unittest.cc
index bb52673..982d2c5 100644
--- a/chrome/browser/web_applications/commands/os_integration_synchronize_command_unittest.cc
+++ b/chrome/browser/web_applications/commands/os_integration_synchronize_command_unittest.cc
@@ -42,7 +42,7 @@
   const GURL kWebAppUrl = GURL("https://example.com");
 
   OsIntegrationSynchronizeCommandTest() {
-    if (GetParam() == OsIntegrationSubManagersState::kEnabled) {
+    if (GetParam() == OsIntegrationSubManagersState::kSaveStateToDB) {
       scoped_feature_list_.InitWithFeaturesAndParameters(
           {{features::kOsIntegrationSubManagers, {{"stage", "write_config"}}}},
           /*disabled_features=*/{});
@@ -166,7 +166,7 @@
 INSTANTIATE_TEST_SUITE_P(
     All,
     OsIntegrationSynchronizeCommandTest,
-    ::testing::Values(OsIntegrationSubManagersState::kEnabled,
+    ::testing::Values(OsIntegrationSubManagersState::kSaveStateToDB,
                       OsIntegrationSubManagersState::kDisabled),
     test::GetOsIntegrationSubManagersTestName);
 
diff --git a/chrome/browser/web_applications/commands/run_on_os_login_command_unittest.cc b/chrome/browser/web_applications/commands/run_on_os_login_command_unittest.cc
index a43d796..56b0fdb5 100644
--- a/chrome/browser/web_applications/commands/run_on_os_login_command_unittest.cc
+++ b/chrome/browser/web_applications/commands/run_on_os_login_command_unittest.cc
@@ -85,7 +85,7 @@
       public ::testing::WithParamInterface<OsIntegrationSubManagersState> {
  public:
   RunOnOsLoginCommandTest() {
-    if (GetParam() == OsIntegrationSubManagersState::kEnabled) {
+    if (GetParam() == OsIntegrationSubManagersState::kSaveStateToDB) {
       scoped_feature_list_.InitWithFeaturesAndParameters(
           {{features::kOsIntegrationSubManagers, {{"stage", "write_config"}}}},
           /*disabled_features=*/{});
@@ -511,7 +511,7 @@
 INSTANTIATE_TEST_SUITE_P(
     All,
     RunOnOsLoginCommandTest,
-    ::testing::Values(OsIntegrationSubManagersState::kEnabled,
+    ::testing::Values(OsIntegrationSubManagersState::kSaveStateToDB,
                       OsIntegrationSubManagersState::kDisabled),
     test::GetOsIntegrationSubManagersTestName);
 
diff --git a/chrome/browser/web_applications/commands/update_file_handler_command_unittest.cc b/chrome/browser/web_applications/commands/update_file_handler_command_unittest.cc
index adea45a..bda0497 100644
--- a/chrome/browser/web_applications/commands/update_file_handler_command_unittest.cc
+++ b/chrome/browser/web_applications/commands/update_file_handler_command_unittest.cc
@@ -29,7 +29,7 @@
   const GURL kTestAppUrl = GURL("https://example.com");
 
   UpdateFileHandlerCommandTest() {
-    if (GetParam() == OsIntegrationSubManagersState::kEnabled) {
+    if (GetParam() == OsIntegrationSubManagersState::kSaveStateToDB) {
       scoped_feature_list_.InitWithFeaturesAndParameters(
           {{features::kOsIntegrationSubManagers, {{"stage", "write_config"}}},
            {blink::features::kFileHandlingAPI, {}}},
@@ -157,7 +157,7 @@
 INSTANTIATE_TEST_SUITE_P(
     All,
     UpdateFileHandlerCommandTest,
-    ::testing::Values(OsIntegrationSubManagersState::kEnabled,
+    ::testing::Values(OsIntegrationSubManagersState::kSaveStateToDB,
                       OsIntegrationSubManagersState::kDisabled),
     test::GetOsIntegrationSubManagersTestName);
 
diff --git a/chrome/browser/web_applications/commands/update_protocol_handler_approval_command_browsertest.cc b/chrome/browser/web_applications/commands/update_protocol_handler_approval_command_browsertest.cc
index 5b90904..beba1ad 100644
--- a/chrome/browser/web_applications/commands/update_protocol_handler_approval_command_browsertest.cc
+++ b/chrome/browser/web_applications/commands/update_protocol_handler_approval_command_browsertest.cc
@@ -122,7 +122,7 @@
   }
 
   bool EnableOsIntegrationSubManager() {
-    return GetParam() == OsIntegrationSubManagersState::kEnabled;
+    return GetParam() == OsIntegrationSubManagersState::kSaveStateToDB;
   }
 
  private:
@@ -503,7 +503,7 @@
 INSTANTIATE_TEST_SUITE_P(
     All,
     UpdateProtocolHandlerApprovalCommandTest,
-    ::testing::Values(OsIntegrationSubManagersState::kEnabled,
+    ::testing::Values(OsIntegrationSubManagersState::kSaveStateToDB,
                       OsIntegrationSubManagersState::kDisabled),
     test::GetOsIntegrationSubManagersTestName);
 
diff --git a/chrome/browser/web_applications/commands/web_app_uninstall_command_unittest.cc b/chrome/browser/web_applications/commands/web_app_uninstall_command_unittest.cc
index cc10369..33891e4 100644
--- a/chrome/browser/web_applications/commands/web_app_uninstall_command_unittest.cc
+++ b/chrome/browser/web_applications/commands/web_app_uninstall_command_unittest.cc
@@ -41,6 +41,8 @@
 namespace web_app {
 namespace {
 
+// TODO(https://crbug.com/1403999): This test should be refactored to remove the
+// MockOsIntegrationManager.
 class WebAppUninstallCommandTest : public WebAppTest {
  public:
   WebAppUninstallCommandTest() = default;
@@ -83,7 +85,8 @@
   }
 
   OsHooksErrors result;
-  EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_))
+  EXPECT_CALL(*os_integration_manager_,
+              Synchronize(app_id, testing::_, testing::_))
       .WillOnce(base::test::RunOnceCallback<1>());
   EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_))
       .WillOnce(base::test::RunOnceCallback<1>(result));
@@ -118,7 +121,8 @@
   }
 
   OsHooksErrors result;
-  EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_))
+  EXPECT_CALL(*os_integration_manager_,
+              Synchronize(app_id, testing::_, testing::_))
       .WillOnce(base::test::RunOnceCallback<1>());
   EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_))
       .WillOnce(base::test::RunOnceCallback<1>(result));
@@ -154,7 +158,8 @@
   }
 
   OsHooksErrors result;
-  EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_))
+  EXPECT_CALL(*os_integration_manager_,
+              Synchronize(app_id, testing::_, testing::_))
       .WillOnce(base::test::RunOnceCallback<1>());
   EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_))
       .WillOnce(base::test::RunOnceCallback<1>(result));
@@ -190,7 +195,8 @@
 
   OsHooksErrors result;
   result.set(true);
-  EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_))
+  EXPECT_CALL(*os_integration_manager_,
+              Synchronize(app_id, testing::_, testing::_))
       .WillOnce(base::test::RunOnceCallback<1>());
   EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_))
       .WillOnce(base::test::RunOnceCallback<1>(result));
@@ -220,7 +226,8 @@
                                     WebAppManagement::kSync);
   AppId app_id = web_app->app_id();
 
-  EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_))
+  EXPECT_CALL(*os_integration_manager_,
+              Synchronize(app_id, testing::_, testing::_))
       .Times(0);
   EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_))
       .Times(0);
@@ -254,7 +261,8 @@
     update->CreateApp(std::move(web_app));
   }
 
-  EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_))
+  EXPECT_CALL(*os_integration_manager_,
+              Synchronize(app_id, testing::_, testing::_))
       .Times(0);
   EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_))
       .Times(0);
@@ -292,7 +300,8 @@
                    .DoesAppIdExist(app_id));
 
   OsHooksErrors result;
-  EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_))
+  EXPECT_CALL(*os_integration_manager_,
+              Synchronize(app_id, testing::_, testing::_))
       .WillOnce(base::test::RunOnceCallback<1>());
   EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_))
       .WillOnce(base::test::RunOnceCallback<1>(result));
@@ -329,7 +338,8 @@
   }
   EXPECT_TRUE(provider()->registrar_unsafe().IsLocallyInstalled(app_id));
   OsHooksErrors result;
-  EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_))
+  EXPECT_CALL(*os_integration_manager_,
+              Synchronize(app_id, testing::_, testing::_))
       .WillOnce(base::test::RunOnceCallback<1>());
   EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_))
       .WillOnce(base::test::RunOnceCallback<1>(result));
@@ -371,7 +381,8 @@
     update->CreateApp(std::move(web_app));
   }
 
-  EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_))
+  EXPECT_CALL(*os_integration_manager_,
+              Synchronize(app_id, testing::_, testing::_))
       .Times(0);
   EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_))
       .Times(0);
@@ -385,7 +396,8 @@
   EXPECT_CALL(*os_integration_manager_,
               RegisterWebAppOsUninstallation(app_id, testing::_))
       .Times(1);
-  EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_))
+  EXPECT_CALL(*os_integration_manager_,
+              Synchronize(app_id, testing::_, testing::_))
       .WillOnce(base::test::RunOnceCallback<1>());
 #else
   EXPECT_CALL(*os_integration_manager_,
@@ -446,7 +458,8 @@
   }
 
   OsHooksErrors result;
-  EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_))
+  EXPECT_CALL(*os_integration_manager_,
+              Synchronize(app_id, testing::_, testing::_))
       .WillOnce(base::test::RunOnceCallback<1>());
   EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_))
       .WillOnce(base::test::RunOnceCallback<1>(result));
diff --git a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
index 49cd8015..bc09638 100644
--- a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
+++ b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
@@ -3461,7 +3461,7 @@
       public ::testing::WithParamInterface<OsIntegrationSubManagersState> {
  public:
   ManifestUpdateBrowserTestUrlHandlerSynchronize() {
-    if (GetParam() == OsIntegrationSubManagersState::kEnabled) {
+    if (GetParam() == OsIntegrationSubManagersState::kSaveStateToDB) {
       scoped_feature_list_.InitWithFeaturesAndParameters(
           {{features::kOsIntegrationSubManagers, {{"stage", "write_config"}}}},
           /*disabled_features=*/{});
@@ -3541,7 +3541,7 @@
 INSTANTIATE_TEST_SUITE_P(
     All,
     ManifestUpdateBrowserTestUrlHandlerSynchronize,
-    ::testing::Values(OsIntegrationSubManagersState::kEnabled,
+    ::testing::Values(OsIntegrationSubManagersState::kSaveStateToDB,
                       OsIntegrationSubManagersState::kDisabled),
     test::GetOsIntegrationSubManagersTestName);
 #endif
diff --git a/chrome/browser/web_applications/os_integration/os_integration_manager.cc b/chrome/browser/web_applications/os_integration/os_integration_manager.cc
index 938cf65..4a926d0 100644
--- a/chrome/browser/web_applications/os_integration/os_integration_manager.cc
+++ b/chrome/browser/web_applications/os_integration/os_integration_manager.cc
@@ -28,7 +28,7 @@
 #include "chrome/browser/web_applications/os_integration/os_integration_sub_manager.h"
 #include "chrome/browser/web_applications/os_integration/protocol_handling_sub_manager.h"
 #include "chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.h"
-#include "chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager.h"
+#include "chrome/browser/web_applications/os_integration/shortcut_sub_manager.h"
 #include "chrome/browser/web_applications/os_integration/web_app_shortcut.h"
 #include "chrome/browser/web_applications/os_integration/web_app_uninstallation_via_os_settings_registration.h"
 #include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h"
@@ -56,6 +56,15 @@
 namespace web_app {
 
 namespace {
+OsHooksErrors GetFinalErrorBitsetFromCollection(
+    std::vector<OsHooksErrors> os_hooks_errors) {
+  OsHooksErrors final_errors;
+  for (const OsHooksErrors& error : os_hooks_errors) {
+    final_errors = final_errors | error;
+  }
+  return final_errors;
+}
+}  // namespace
 
 bool AreOsIntegrationSubManagersEnabled() {
   return base::FeatureList::IsEnabled(features::kOsIntegrationSubManagers);
@@ -68,17 +77,6 @@
           features::OsIntegrationSubManagersStage::kExecuteAndWriteConfig);
 }
 
-OsHooksErrors GetFinalErrorBitsetFromCollection(
-    std::vector<OsHooksErrors> os_hooks_errors) {
-  OsHooksErrors final_errors;
-  for (const OsHooksErrors& error : os_hooks_errors) {
-    final_errors = final_errors | error;
-  }
-  return final_errors;
-}
-
-}  // namespace
-
 OsIntegrationManager::ScopedSuppressForTesting::ScopedSuppressForTesting()
     :
 // Creating OS hooks on ChromeOS doesn't write files to disk, so it's
@@ -186,8 +184,8 @@
     url_handler_manager_->SetSubsystems(registrar);
 
   sub_managers_.clear();
-  auto shortcut_handling_sub_manager =
-      std::make_unique<ShortcutHandlingSubManager>(*icon_manager, *registrar);
+  auto shortcut_handling_sub_manager = std::make_unique<ShortcutSubManager>(
+      *profile_, *icon_manager, *registrar);
   auto protocol_handling_sub_manager =
       std::make_unique<ProtocolHandlingSubManager>(*registrar);
 
@@ -214,8 +212,10 @@
   }
 }
 
-void OsIntegrationManager::Synchronize(const AppId& app_id,
-                                       base::OnceClosure callback) {
+void OsIntegrationManager::Synchronize(
+    const AppId& app_id,
+    base::OnceClosure callback,
+    absl::optional<SynchronizeOsOptions> options) {
   if (!AreOsIntegrationSubManagersEnabled()) {
     std::move(callback).Run();
     return;
@@ -230,21 +230,15 @@
       std::make_unique<proto::WebAppOsIntegrationState>();
   proto::WebAppOsIntegrationState* desired_states_ptr = desired_states.get();
 
+  // Note: Sometimes the execute step is a no-op based on feature flags or if os
+  // integration is disabled for testing. This logic is in the
+  // ExecuteAllSubManagerConfigurations method.
   base::RepeatingClosure configure_barrier;
-  if (AreSubManagersExecuteEnabled()) {
-    configure_barrier = base::BarrierClosure(
-        sub_managers_.size(),
-        base::BindOnce(
-            &OsIntegrationManager::ExecuteAllSubManagerConfigurations,
-            weak_ptr_factory_.GetWeakPtr(), app_id, std::move(desired_states),
-            std::move(callback)));
-  } else {
-    configure_barrier = base::BarrierClosure(
-        sub_managers_.size(),
-        base::BindOnce(&OsIntegrationManager::WriteStateToDB,
-                       weak_ptr_factory_.GetWeakPtr(), app_id,
-                       std::move(desired_states), std::move(callback)));
-  }
+  configure_barrier = base::BarrierClosure(
+      sub_managers_.size(),
+      base::BindOnce(&OsIntegrationManager::ExecuteAllSubManagerConfigurations,
+                     weak_ptr_factory_.GetWeakPtr(), app_id, options,
+                     std::move(desired_states), std::move(callback)));
 
   for (const auto& sub_manager : sub_managers_) {
     // This dereference is safe because the barrier closure guarantees that it
@@ -259,7 +253,10 @@
     InstallOsHooksCallback callback,
     std::unique_ptr<WebAppInstallInfo> web_app_info,
     InstallOsHooksOptions options) {
-  if (g_suppress_os_hooks_for_testing_) {
+  // If the "Execute" step is enabled for sub-managers, then the 'old' os
+  // integration path needs to be turned off so that os integration doesn't get
+  // done twice.
+  if (g_suppress_os_hooks_for_testing_ || AreSubManagersExecuteEnabled()) {
     OsHooksErrors os_hooks_errors;
     base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
         FROM_HERE, base::BindOnce(std::move(callback), os_hooks_errors));
@@ -312,7 +309,10 @@
 void OsIntegrationManager::UninstallOsHooks(const AppId& app_id,
                                             const OsHooksOptions& os_hooks,
                                             UninstallOsHooksCallback callback) {
-  if (g_suppress_os_hooks_for_testing_) {
+  // If the "Execute" step is enabled for sub-managers, then the 'old' os
+  // integration path needs to be turned off so that os integration doesn't get
+  // done twice.
+  if (g_suppress_os_hooks_for_testing_ || AreSubManagersExecuteEnabled()) {
     OsHooksErrors os_hooks_errors;
     base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
         FROM_HERE, base::BindOnce(std::move(callback), os_hooks_errors));
@@ -372,7 +372,10 @@
     FileHandlerUpdateAction file_handlers_need_os_update,
     const WebAppInstallInfo& web_app_info,
     UpdateOsHooksCallback callback) {
-  if (g_suppress_os_hooks_for_testing_) {
+  // If the "Execute" step is enabled for sub-managers, then the 'old' os
+  // integration path needs to be turned off so that os integration doesn't get
+  // done twice.
+  if (g_suppress_os_hooks_for_testing_ || AreSubManagersExecuteEnabled()) {
     OsHooksErrors os_hooks_errors;
     base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
         FROM_HERE, base::BindOnce(std::move(callback), os_hooks_errors));
@@ -710,6 +713,14 @@
 void OsIntegrationManager::UpdateShortcuts(const AppId& app_id,
                                            base::StringPiece old_name,
                                            ResultCallback callback) {
+  // If the "Execute" step is enabled for sub-managers, then the 'old' os
+  // integration path needs to be turned off so that os integration doesn't get
+  // done twice.
+  if (AreSubManagersExecuteEnabled()) {
+    base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(callback), Result::kOk));
+    return;
+  }
   DCHECK(shortcut_manager_);
   if (!shortcut_manager_->CanCreateShortcuts()) {
     std::move(callback).Run(Result::kOk);
@@ -743,6 +754,14 @@
 void OsIntegrationManager::UpdateUrlHandlers(
     const AppId& app_id,
     base::OnceCallback<void(bool success)> callback) {
+  // If the "Execute" step is enabled for sub-managers, then the 'old' os
+  // integration path needs to be turned off so that os integration doesn't get
+  // done twice.
+  if (AreSubManagersExecuteEnabled()) {
+    base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(callback), true));
+    return;
+  }
   if (!url_handler_manager_)
     return;
 
@@ -753,6 +772,20 @@
     const AppId& app_id,
     FileHandlerUpdateAction file_handlers_need_os_update,
     ResultCallback finished_callback) {
+  // If the "Execute" step is enabled for sub-managers, then the 'old' os
+  // integration path needs to be turned off so that os integration doesn't get
+  // done twice.
+  if (AreSubManagersExecuteEnabled()) {
+    // Due to the way UpdateFileHandlerCommand is currently written, this needs
+    // to be synchronously called on Mac.
+#if BUILDFLAG(IS_MAC)
+    std::move(finished_callback).Run(Result::kOk);
+#else
+    base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(finished_callback), Result::kOk));
+    return;
+#endif
+  }
   if (file_handlers_need_os_update == FileHandlerUpdateAction::kNoUpdate) {
     std::move(finished_callback).Run(Result::kOk);
     return;
@@ -876,22 +909,21 @@
 
 void OsIntegrationManager::ExecuteAllSubManagerConfigurations(
     const AppId& app_id,
+    absl::optional<SynchronizeOsOptions> options,
     std::unique_ptr<proto::WebAppOsIntegrationState> desired_states,
     base::OnceClosure callback) {
-  if (g_suppress_os_hooks_for_testing_) {
-    base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
-        FROM_HERE,
-        base::BindOnce(&OsIntegrationManager::WriteStateToDB,
-                       weak_ptr_factory_.GetWeakPtr(), app_id,
-                       std::move(desired_states), std::move(callback)));
-    return;
-  }
-
   // This can never be a use-case where we execute OS integration registration/
   // unregistration but do not update the WebAppOsIntegrationState proto in the
   // web_app DB.
   DCHECK(AreOsIntegrationSubManagersEnabled());
 
+  // The "execute" step is skipped in the following cases:
+  // 1. The app is no longer in the registrar. The whole synchronize process is
+  //    stopped here.
+  // 2. The `g_suppress_os_hooks_for_testing_` flag is set.
+  // 3. Execution has been disabled by the feature parameters (see
+  //    `AreSubManagersExecuteEnabled()`).
+
   const WebApp* web_app = registrar_->GetAppById(app_id);
   if (!web_app) {
     std::move(callback).Run();
@@ -899,18 +931,25 @@
   }
 
   proto::WebAppOsIntegrationState* desired_states_ptr = desired_states.get();
-  auto write_state_callback = base::BarrierClosure(
-      sub_managers_.size(),
-      base::BindOnce(&OsIntegrationManager::WriteStateToDB,
-                     weak_ptr_factory_.GetWeakPtr(), app_id,
-                     std::move(desired_states), std::move(callback)));
+  auto write_state_to_db = base::BindOnce(
+      &OsIntegrationManager::WriteStateToDB, weak_ptr_factory_.GetWeakPtr(),
+      app_id, std::move(desired_states), std::move(callback));
+
+  if (g_suppress_os_hooks_for_testing_ || !AreSubManagersExecuteEnabled()) {
+    base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
+        FROM_HERE, std::move(write_state_to_db));
+    return;
+  }
+
+  auto write_state_barrier =
+      base::BarrierClosure(sub_managers_.size(), std::move(write_state_to_db));
 
   const proto::WebAppOsIntegrationState current_state =
       web_app->current_os_integration_states();
 
   for (const auto& sub_manager : sub_managers_) {
-    sub_manager->Execute(app_id, *desired_states_ptr, current_state,
-                         write_state_callback);
+    sub_manager->Execute(app_id, options, *desired_states_ptr, current_state,
+                         write_state_barrier);
   }
 }
 
diff --git a/chrome/browser/web_applications/os_integration/os_integration_manager.h b/chrome/browser/web_applications/os_integration/os_integration_manager.h
index 813c54d..82b0fb9 100644
--- a/chrome/browser/web_applications/os_integration/os_integration_manager.h
+++ b/chrome/browser/web_applications/os_integration/os_integration_manager.h
@@ -16,10 +16,12 @@
 #include "base/scoped_observation.h"
 #include "base/strings/string_piece_forward.h"
 #include "chrome/browser/web_applications/app_registrar_observer.h"
+#include "chrome/browser/web_applications/os_integration/os_integration_sub_manager.h"
 #include "chrome/browser/web_applications/os_integration/url_handler_manager.h"
 #include "chrome/browser/web_applications/os_integration/web_app_file_handler_manager.h"
 #include "chrome/browser/web_applications/os_integration/web_app_protocol_handler_manager.h"
 #include "chrome/browser/web_applications/os_integration/web_app_run_on_os_login.h"
+#include "chrome/browser/web_applications/os_integration/web_app_shortcut.h"
 #include "chrome/browser/web_applications/os_integration/web_app_shortcut_manager.h"
 #include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h"
 #include "chrome/browser/web_applications/web_app.h"
@@ -38,9 +40,18 @@
 class WebAppIconManager;
 class WebAppRegistrar;
 class WebAppSyncBridge;
-class OsIntegrationSubManager;
 class WebAppUiManager;
 
+// Returns if the sub-manager architecture is enabled. This means that they are
+// writing the expected os integration state to disk. See
+// `AreSubManagersExecuteEnabled` to check if they are also executing.
+bool AreOsIntegrationSubManagersEnabled();
+
+// Returns if the sub-manager architecture is enabled AND the "execute"
+// architecture is enabled. This causes os integration execution to happen from
+// the sub-managers and not the OsIntegrationManager.
+bool AreSubManagersExecuteEnabled();
+
 // OsHooksErrors contains the result of all Os hook deployments.
 // If a bit is set to `true`, then an error did occur.
 using OsHooksErrors = std::bitset<OsHookType::kMaxValue + 1>;
@@ -120,7 +131,10 @@
   // TODO(crbug.com/1401125): Remove all install, uninstall and update functions
   // from this file once all OS Integration sub managers have been implemented,
   // connected to the web_app system and tested.
-  virtual void Synchronize(const AppId& app_id, base::OnceClosure callback);
+  virtual void Synchronize(
+      const AppId& app_id,
+      base::OnceClosure callback,
+      absl::optional<SynchronizeOsOptions> options = absl::nullopt);
 
   // Install all needed OS hooks for the web app.
   // If provided |web_app_info| is a nullptr, it will read icons data from disk,
@@ -299,6 +313,7 @@
 
   virtual void ExecuteAllSubManagerConfigurations(
       const AppId& app_id,
+      absl::optional<SynchronizeOsOptions> options,
       std::unique_ptr<proto::WebAppOsIntegrationState> desired_states,
       base::OnceClosure callback);
 
diff --git a/chrome/browser/web_applications/os_integration/os_integration_sub_manager.h b/chrome/browser/web_applications/os_integration/os_integration_sub_manager.h
index e6831cb..74ceb9f9 100644
--- a/chrome/browser/web_applications/os_integration/os_integration_sub_manager.h
+++ b/chrome/browser/web_applications/os_integration/os_integration_sub_manager.h
@@ -6,12 +6,25 @@
 #define CHROME_BROWSER_WEB_APPLICATIONS_OS_INTEGRATION_OS_INTEGRATION_SUB_MANAGER_H_
 
 #include "base/functional/callback_forward.h"
+#include "chrome/browser/web_applications/os_integration/web_app_shortcut.h"
 #include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h"
 #include "chrome/browser/web_applications/web_app_id.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace web_app {
 
+struct SynchronizeOsOptions {
+  // Adds a shortcut to the desktop IFF this call to synchronize creates
+  // shortcuts fresh for the given app (it's not an update).
+  bool add_shortcut_to_desktop = false;
+  // Adds a shortcut to the quick launch bar IFF this call to synchronize
+  // creates shortcuts fresh for the given app (it's not an update).
+  bool add_to_quick_launch_bar = false;
+  // The reason synchronize is called, used to possibly show the location of the
+  // shortcut to the user (this happen on Mac).
+  ShortcutCreationReason reason = SHORTCUT_CREATION_AUTOMATED;
+};
+
 class OsIntegrationSubManager {
  public:
   OsIntegrationSubManager() = default;
@@ -23,10 +36,12 @@
   virtual void Configure(const AppId& app_id,
                          proto::WebAppOsIntegrationState& desired_state,
                          base::OnceClosure configure_done) = 0;
-  virtual void Execute(const AppId& app_id,
-                       const proto::WebAppOsIntegrationState& desired_state,
-                       const proto::WebAppOsIntegrationState& current_state,
-                       base::OnceClosure callback) = 0;
+  virtual void Execute(
+      const AppId& app_id,
+      const absl::optional<SynchronizeOsOptions>& synchronize_options,
+      const proto::WebAppOsIntegrationState& desired_state,
+      const proto::WebAppOsIntegrationState& current_state,
+      base::OnceClosure callback) = 0;
 };
 }  // namespace web_app
 
diff --git a/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager.cc b/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager.cc
index f82919e..b206e8a 100644
--- a/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager.cc
+++ b/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager.cc
@@ -9,6 +9,7 @@
 
 #include "base/containers/contains.h"
 #include "base/functional/callback_forward.h"
+#include "chrome/browser/web_applications/os_integration/os_integration_sub_manager.h"
 #include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h"
 #include "chrome/browser/web_applications/web_app.h"
 #include "chrome/browser/web_applications/web_app_registrar.h"
@@ -73,10 +74,12 @@
 
 void ProtocolHandlingSubManager::Execute(
     const AppId& app_id,
+    const absl::optional<SynchronizeOsOptions>& synchronize_options,
     const proto::WebAppOsIntegrationState& desired_state,
     const proto::WebAppOsIntegrationState& current_state,
     base::OnceClosure callback) {
-  NOTREACHED() << "Not yet implemented";
+  // Not implemented yet.
+  std::move(callback).Run();
 }
 
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager.h b/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager.h
index a46e146..5def372b 100644
--- a/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager.h
+++ b/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager.h
@@ -26,6 +26,7 @@
                  proto::WebAppOsIntegrationState& desired_state,
                  base::OnceClosure configure_done) override;
   void Execute(const AppId& app_id,
+               const absl::optional<SynchronizeOsOptions>& synchronize_options,
                const proto::WebAppOsIntegrationState& desired_state,
                const proto::WebAppOsIntegrationState& current_state,
                base::OnceClosure callback) override;
diff --git a/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager_unittest.cc b/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager_unittest.cc
index c5721086..b006b47 100644
--- a/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager_unittest.cc
+++ b/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager_unittest.cc
@@ -57,9 +57,14 @@
           ShortcutOverrideForTesting::OverrideForTesting(base::GetHomeDir());
     }
 
-    if (EnableOsIntegrationSubManager()) {
+    if (GetParam() == OsIntegrationSubManagersState::kSaveStateToDB) {
       scoped_feature_list_.InitAndEnableFeatureWithParameters(
           features::kOsIntegrationSubManagers, {{"stage", "write_config"}});
+    } else if (GetParam() ==
+               OsIntegrationSubManagersState::kSaveStateAndExecute) {
+      scoped_feature_list_.InitAndEnableFeatureWithParameters(
+          features::kOsIntegrationSubManagers,
+          {{"stage", "execute_and_write_config"}});
     } else {
       scoped_feature_list_.InitWithFeatures(
           /*enabled_features=*/{},
@@ -118,10 +123,6 @@
     return result.Get<AppId>();
   }
 
-  bool EnableOsIntegrationSubManager() {
-    return GetParam() == OsIntegrationSubManagersState::kEnabled;
-  }
-
  protected:
   WebAppProvider& provider() { return *provider_; }
 
@@ -145,7 +146,7 @@
       provider().registrar_unsafe().GetAppCurrentOsIntegrationState(app_id);
   ASSERT_TRUE(state.has_value());
   const proto::WebAppOsIntegrationState& os_integration_state = state.value();
-  if (EnableOsIntegrationSubManager()) {
+  if (AreOsIntegrationSubManagersEnabled()) {
     ASSERT_THAT(os_integration_state.protocols_handled().protocols_size(),
                 testing::Eq(1));
 
@@ -202,7 +203,7 @@
       provider().registrar_unsafe().GetAppCurrentOsIntegrationState(app_id);
   ASSERT_TRUE(state.has_value());
   const proto::WebAppOsIntegrationState& os_integration_state = state.value();
-  if (EnableOsIntegrationSubManager()) {
+  if (AreOsIntegrationSubManagersEnabled()) {
     ASSERT_THAT(os_integration_state.protocols_handled().protocols_size(),
                 testing::Eq(1));
 
@@ -220,7 +221,7 @@
 INSTANTIATE_TEST_SUITE_P(
     All,
     ProtocolHandlingSubManagerTest,
-    ::testing::Values(OsIntegrationSubManagersState::kEnabled,
+    ::testing::Values(OsIntegrationSubManagersState::kSaveStateToDB,
                       OsIntegrationSubManagersState::kDisabled),
     test::GetOsIntegrationSubManagersTestName);
 
diff --git a/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.cc b/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.cc
index d564f0b..468313c 100644
--- a/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.cc
+++ b/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/functional/callback.h"
+#include "chrome/browser/web_applications/os_integration/os_integration_sub_manager.h"
 #include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h"
 #include "chrome/browser/web_applications/web_app_id.h"
 #include "chrome/browser/web_applications/web_app_registrar.h"
@@ -63,10 +64,12 @@
 
 void RunOnOsLoginSubManager::Execute(
     const AppId& app_id,
+    const absl::optional<SynchronizeOsOptions>& synchronize_options,
     const proto::WebAppOsIntegrationState& desired_state,
     const proto::WebAppOsIntegrationState& current_state,
     base::OnceClosure callback) {
-  NOTREACHED() << "Not yet implemented";
+  // Not implemented yet.
+  std::move(callback).Run();
 }
 
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.h b/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.h
index bd84a2c..ae9eba6f 100644
--- a/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.h
+++ b/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.h
@@ -26,7 +26,9 @@
   void Configure(const AppId& app_id,
                  proto::WebAppOsIntegrationState& desired_state,
                  base::OnceClosure configure_done) override;
+
   void Execute(const AppId& app_id,
+               const absl::optional<SynchronizeOsOptions>& synchronize_options,
                const proto::WebAppOsIntegrationState& desired_state,
                const proto::WebAppOsIntegrationState& current_state,
                base::OnceClosure callback) override;
diff --git a/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager_unittest.cc b/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager_unittest.cc
index 7e888fca..9db9f868 100644
--- a/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager_unittest.cc
+++ b/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager_unittest.cc
@@ -49,9 +49,14 @@
       shortcut_override_ =
           ShortcutOverrideForTesting::OverrideForTesting(base::GetHomeDir());
     }
-    if (EnableOsIntegrationSubManager()) {
+    if (GetParam() == OsIntegrationSubManagersState::kSaveStateToDB) {
       scoped_feature_list_.InitAndEnableFeatureWithParameters(
           features::kOsIntegrationSubManagers, {{"stage", "write_config"}});
+    } else if (GetParam() ==
+               OsIntegrationSubManagersState::kSaveStateAndExecute) {
+      scoped_feature_list_.InitAndEnableFeatureWithParameters(
+          features::kOsIntegrationSubManagers,
+          {{"stage", "execute_and_write_config"}});
     } else {
       scoped_feature_list_.InitWithFeatures(
           /*enabled_features=*/{},
@@ -86,10 +91,6 @@
     WebAppTest::TearDown();
   }
 
-  bool EnableOsIntegrationSubManager() {
-    return GetParam() == OsIntegrationSubManagersState::kEnabled;
-  }
-
   AppId InstallWebApp() {
     std::unique_ptr<WebAppInstallInfo> info =
         std::make_unique<WebAppInstallInfo>();
@@ -138,7 +139,7 @@
   auto state = registrar().GetAppCurrentOsIntegrationState(app_id);
   ASSERT_TRUE(state.has_value());
   const proto::WebAppOsIntegrationState& os_integration_state = state.value();
-  if (EnableOsIntegrationSubManager()) {
+  if (AreOsIntegrationSubManagersEnabled()) {
     // on installation, both values are set to NOT_RUN.
     ASSERT_TRUE(os_integration_state.has_run_on_os_login());
     const proto::RunOnOsLogin& run_on_os_login =
@@ -161,7 +162,7 @@
   auto state = registrar().GetAppCurrentOsIntegrationState(app_id);
   ASSERT_TRUE(state.has_value());
   const proto::WebAppOsIntegrationState& os_integration_state = state.value();
-  if (EnableOsIntegrationSubManager()) {
+  if (AreOsIntegrationSubManagersEnabled()) {
     ASSERT_TRUE(os_integration_state.has_run_on_os_login());
     const proto::RunOnOsLogin& run_on_os_login =
         os_integration_state.run_on_os_login();
@@ -193,7 +194,7 @@
   auto state = registrar().GetAppCurrentOsIntegrationState(app_id);
   ASSERT_TRUE(state.has_value());
   const proto::WebAppOsIntegrationState& os_integration_state = state.value();
-  if (EnableOsIntegrationSubManager()) {
+  if (AreOsIntegrationSubManagersEnabled()) {
     ASSERT_TRUE(os_integration_state.has_run_on_os_login());
     const proto::RunOnOsLogin& run_on_os_login =
         os_integration_state.run_on_os_login();
@@ -225,7 +226,7 @@
   auto state = registrar().GetAppCurrentOsIntegrationState(app_id);
   ASSERT_TRUE(state.has_value());
   const proto::WebAppOsIntegrationState& os_integration_state = state.value();
-  if (EnableOsIntegrationSubManager()) {
+  if (AreOsIntegrationSubManagersEnabled()) {
     ASSERT_TRUE(os_integration_state.has_run_on_os_login());
     const proto::RunOnOsLogin& run_on_os_login =
         os_integration_state.run_on_os_login();
@@ -257,7 +258,7 @@
   auto state = registrar().GetAppCurrentOsIntegrationState(app_id);
   ASSERT_TRUE(state.has_value());
   const proto::WebAppOsIntegrationState& os_integration_state = state.value();
-  if (EnableOsIntegrationSubManager()) {
+  if (AreOsIntegrationSubManagersEnabled()) {
     ASSERT_TRUE(os_integration_state.has_run_on_os_login());
     const proto::RunOnOsLogin& run_on_os_login =
         os_integration_state.run_on_os_login();
@@ -278,7 +279,7 @@
 INSTANTIATE_TEST_SUITE_P(
     All,
     RunOnOsLoginSubManagerTest,
-    ::testing::Values(OsIntegrationSubManagersState::kEnabled,
+    ::testing::Values(OsIntegrationSubManagersState::kSaveStateToDB,
                       OsIntegrationSubManagersState::kDisabled),
     test::GetOsIntegrationSubManagersTestName);
 
diff --git a/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager.cc b/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager.cc
deleted file mode 100644
index da04474..0000000
--- a/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager.h"
-
-#include "base/containers/flat_map.h"
-#include "base/functional/bind.h"
-#include "base/functional/callback.h"
-#include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h"
-#include "chrome/browser/web_applications/web_app_icon_manager.h"
-#include "chrome/browser/web_applications/web_app_install_info.h"
-#include "chrome/browser/web_applications/web_app_registrar.h"
-#include "components/sync/base/time.h"
-
-namespace web_app {
-
-ShortcutHandlingSubManager::ShortcutHandlingSubManager(
-    WebAppIconManager& icon_manager,
-    WebAppRegistrar& registrar)
-    : icon_manager_(icon_manager), registrar_(registrar) {}
-
-ShortcutHandlingSubManager::~ShortcutHandlingSubManager() = default;
-
-void ShortcutHandlingSubManager::Configure(
-    const AppId& app_id,
-    proto::WebAppOsIntegrationState& desired_state,
-    base::OnceClosure configure_done) {
-  DCHECK(!desired_state.has_shortcut());
-
-  if (!registrar_->IsInstalled(app_id)) {
-    std::move(configure_done).Run();
-    return;
-  }
-
-  desired_state.clear_shortcut();
-
-  auto* shortcut = desired_state.mutable_shortcut();
-  shortcut->set_title(registrar_->GetAppShortName(app_id));
-  shortcut->set_description(registrar_->GetAppDescription(app_id));
-  icon_manager_->ReadIconsLastUpdateTime(
-      app_id, base::BindOnce(&ShortcutHandlingSubManager::StoreIconDataFromDisk,
-                             weak_ptr_factory_.GetWeakPtr(), shortcut)
-                  .Then(std::move(configure_done)));
-}
-
-void ShortcutHandlingSubManager::Start() {}
-
-void ShortcutHandlingSubManager::Shutdown() {}
-
-void ShortcutHandlingSubManager::Execute(
-    const AppId& app_id,
-    const proto::WebAppOsIntegrationState& desired_state,
-    const proto::WebAppOsIntegrationState& current_state,
-    base::OnceClosure callback) {
-  NOTREACHED() << "Not yet implemented";
-}
-
-void ShortcutHandlingSubManager::StoreIconDataFromDisk(
-    proto::ShortcutDescription* shortcut,
-    base::flat_map<SquareSizePx, base::Time> time_map) {
-  for (const auto& [size, time] : time_map) {
-    auto* shortcut_icon_data = shortcut->add_icon_data_any();
-    shortcut_icon_data->set_icon_size(size);
-    shortcut_icon_data->set_timestamp(syncer::TimeToProtoTime(time));
-  }
-}
-
-}  // namespace web_app
diff --git a/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager.h b/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager.h
deleted file mode 100644
index 7c8bd1e..0000000
--- a/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_WEB_APPLICATIONS_OS_INTEGRATION_SHORTCUT_HANDLING_SUB_MANAGER_H_
-#define CHROME_BROWSER_WEB_APPLICATIONS_OS_INTEGRATION_SHORTCUT_HANDLING_SUB_MANAGER_H_
-
-#include "base/containers/flat_map.h"
-#include "base/functional/callback_forward.h"
-#include "base/memory/raw_ref.h"
-#include "base/memory/weak_ptr.h"
-#include "chrome/browser/web_applications/os_integration/os_integration_sub_manager.h"
-#include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h"
-#include "chrome/browser/web_applications/web_app_id.h"
-#include "chrome/browser/web_applications/web_app_install_info.h"
-
-namespace web_app {
-
-class WebAppIconManager;
-class WebAppRegistrar;
-
-class ShortcutHandlingSubManager : public OsIntegrationSubManager {
- public:
-  ShortcutHandlingSubManager(WebAppIconManager& icon_manager,
-                             WebAppRegistrar& registrar);
-  ~ShortcutHandlingSubManager() override;
-  void Start() override;
-  void Shutdown() override;
-  void Configure(const AppId& app_id,
-                 proto::WebAppOsIntegrationState& desired_state,
-                 base::OnceClosure configure_done) override;
-  void Execute(const AppId& app_id,
-               const proto::WebAppOsIntegrationState& desired_state,
-               const proto::WebAppOsIntegrationState& current_state,
-               base::OnceClosure callback) override;
-
- private:
-  void StoreIconDataFromDisk(proto::ShortcutDescription* shortcut,
-                             base::flat_map<SquareSizePx, base::Time> time_map);
-
-  const raw_ref<WebAppIconManager> icon_manager_;
-  const raw_ref<WebAppRegistrar> registrar_;
-
-  base::WeakPtrFactory<ShortcutHandlingSubManager> weak_ptr_factory_{this};
-};
-
-}  // namespace web_app
-
-#endif  // CHROME_BROWSER_WEB_APPLICATIONS_OS_INTEGRATION_SHORTCUT_HANDLING_SUB_MANAGER_H_
diff --git a/chrome/browser/web_applications/os_integration/shortcut_sub_manager.cc b/chrome/browser/web_applications/os_integration/shortcut_sub_manager.cc
new file mode 100644
index 0000000..6983f416
--- /dev/null
+++ b/chrome/browser/web_applications/os_integration/shortcut_sub_manager.cc
@@ -0,0 +1,299 @@
+// 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/web_applications/os_integration/shortcut_sub_manager.h"
+
+#include <string>
+#include <utility>
+
+#include "base/containers/flat_map.h"
+#include "base/functional/bind.h"
+#include "base/functional/callback.h"
+#include "base/functional/callback_forward.h"
+#include "base/functional/callback_helpers.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/stl_util.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/web_applications/os_integration/os_integration_manager.h"
+#include "chrome/browser/web_applications/os_integration/web_app_shortcut.h"
+#include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h"
+#include "chrome/browser/web_applications/web_app_icon_manager.h"
+#include "chrome/browser/web_applications/web_app_install_info.h"
+#include "chrome/browser/web_applications/web_app_registrar.h"
+#include "chrome/common/pref_names.h"
+#include "components/prefs/pref_service.h"
+#include "components/sync/base/time.h"
+#include "ui/gfx/image/image_skia_rep_default.h"
+
+namespace web_app {
+namespace {
+
+// Result of shortcuts creation process.
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class CreationResult {
+  kSuccess = 0,
+  kFailToCreateShortcut = 1,
+  kMaxValue = kFailToCreateShortcut
+};
+
+gfx::ImageFamily PackageIconsIntoImageFamily(
+    std::map<SquareSizePx, SkBitmap> icon_bitmaps) {
+  gfx::ImageFamily image_family;
+  for (auto& size_and_bitmap : icon_bitmaps) {
+    image_family.Add(gfx::ImageSkia(
+        gfx::ImageSkiaRep(size_and_bitmap.second, /*scale=*/0.0f)));
+  }
+
+  // If the image failed to load, use the standard application icon.
+  if (image_family.empty()) {
+    SquareSizePx icon_size_in_px = GetDesiredIconSizesForShortcut().back();
+    gfx::ImageSkia image_skia = CreateDefaultApplicationIcon(icon_size_in_px);
+    image_family.Add(gfx::Image(image_skia));
+  }
+
+  return image_family;
+}
+
+std::unique_ptr<ShortcutInfo> SetFavicon(
+    std::unique_ptr<ShortcutInfo> shortcut_info,
+    gfx::ImageFamily image_family) {
+  shortcut_info->favicon = std::move(image_family);
+  return shortcut_info;
+}
+
+void PopulateFaviconForShortcutInfo(
+    const WebApp* app,
+    WebAppIconManager& icon_manager,
+    std::unique_ptr<ShortcutInfo> shortcut_info_to_populate,
+    base::OnceCallback<void(std::unique_ptr<ShortcutInfo>)> callback) {
+  DCHECK(app);
+
+  // Build a common intersection between desired and downloaded icons.
+  auto icon_sizes_in_px = base::STLSetIntersection<std::vector<SquareSizePx>>(
+      app->downloaded_icon_sizes(IconPurpose::ANY),
+      GetDesiredIconSizesForShortcut());
+
+  auto populate_and_return_shortcut_info =
+      base::BindOnce(&SetFavicon, std::move(shortcut_info_to_populate))
+          .Then(std::move(callback));
+
+  if (!icon_sizes_in_px.empty()) {
+    icon_manager.ReadIcons(
+        app->app_id(), IconPurpose::ANY, icon_sizes_in_px,
+        base::BindOnce(&PackageIconsIntoImageFamily)
+            .Then(std::move(populate_and_return_shortcut_info)));
+    return;
+  }
+
+  // If there is no single icon at the desired sizes, we will resize what we can
+  // get.
+  SquareSizePx desired_icon_size = GetDesiredIconSizesForShortcut().back();
+  icon_manager.ReadIconAndResize(
+      app->app_id(), IconPurpose::ANY, desired_icon_size,
+      base::BindOnce(&PackageIconsIntoImageFamily)
+          .Then(std::move(populate_and_return_shortcut_info)));
+}
+}  // namespace
+
+ShortcutSubManager::ShortcutSubManager(Profile& profile,
+                                       WebAppIconManager& icon_manager,
+                                       WebAppRegistrar& registrar)
+    : profile_(profile), icon_manager_(icon_manager), registrar_(registrar) {}
+
+ShortcutSubManager::~ShortcutSubManager() = default;
+
+void ShortcutSubManager::Configure(
+    const AppId& app_id,
+    proto::WebAppOsIntegrationState& desired_state,
+    base::OnceClosure configure_done) {
+  DCHECK(!desired_state.has_shortcut());
+
+  desired_state.clear_shortcut();
+
+  if (!registrar_->IsLocallyInstalled(app_id)) {
+    std::move(configure_done).Run();
+    return;
+  }
+
+  auto* shortcut = desired_state.mutable_shortcut();
+  shortcut->set_title(registrar_->GetAppShortName(app_id));
+  shortcut->set_description(registrar_->GetAppDescription(app_id));
+  icon_manager_->ReadIconsLastUpdateTime(
+      app_id, base::BindOnce(&ShortcutSubManager::StoreIconDataFromDisk,
+                             weak_ptr_factory_.GetWeakPtr(), shortcut)
+                  .Then(std::move(configure_done)));
+}
+
+void ShortcutSubManager::Start() {}
+
+void ShortcutSubManager::Shutdown() {}
+
+void ShortcutSubManager::Execute(
+    const AppId& app_id,
+    const absl::optional<SynchronizeOsOptions>& synchronize_options,
+    const proto::WebAppOsIntegrationState& desired_state,
+    const proto::WebAppOsIntegrationState& current_state,
+    base::OnceClosure callback) {
+  base::FilePath shortcut_data_dir = GetOsIntegrationResourcesDirectoryForApp(
+      profile_->GetPath(), app_id, registrar_->GetAppStartUrl(app_id));
+
+  const WebApp* app = registrar_->GetAppById(app_id);
+  DCHECK(app);
+
+  // First, handle the case where both current & desired don't have shortcuts,
+  // which should be a no-op.
+  if (!desired_state.has_shortcut() && !current_state.has_shortcut()) {
+    std::move(callback).Run();
+    return;
+  }
+
+  // Second, handle shortcut creation.
+  if (desired_state.has_shortcut() && !current_state.has_shortcut()) {
+    std::unique_ptr<ShortcutInfo> desired_shortcut_info =
+        BuildShortcutInfoWithoutFavicon(
+            app_id, registrar_->GetAppStartUrl(app_id), profile_->GetPath(),
+            profile_->GetPrefs()->GetString(prefs::kProfileName),
+            desired_state);
+    PopulateFaviconForShortcutInfo(
+        app, *icon_manager_, std::move(desired_shortcut_info),
+        base::BindOnce(&ShortcutSubManager::CreateShortcut,
+                       weak_ptr_factory_.GetWeakPtr(), app_id,
+                       synchronize_options, std::move(callback)));
+    return;
+  }
+
+  // Third, handle shortcut removal.
+  if (!desired_state.has_shortcut() && current_state.has_shortcut()) {
+    std::unique_ptr<ShortcutInfo> current_shortcut_info =
+        BuildShortcutInfoWithoutFavicon(
+            app_id, registrar_->GetAppStartUrl(app_id), profile_->GetPath(),
+            profile_->GetPrefs()->GetString(prefs::kProfileName),
+            current_state);
+    internals::ScheduleDeletePlatformShortcuts(
+        shortcut_data_dir, std::move(current_shortcut_info),
+        base::BindOnce([](bool success) {
+          base::UmaHistogramBoolean("WebApp.Shortcuts.Delete.Result", success);
+        }).Then(std::move(callback)));
+    return;
+  }
+
+  // Fourth, handle update.
+  std::unique_ptr<ShortcutInfo> desired_shortcut_info =
+      BuildShortcutInfoWithoutFavicon(
+          app_id, registrar_->GetAppStartUrl(app_id), profile_->GetPath(),
+          profile_->GetPrefs()->GetString(prefs::kProfileName), desired_state);
+
+  // The following section decides if an update needs to occur or not. To
+  // optimize for the least number of serializations, the 'update' callback is
+  // created first and then used below.
+
+  // If no update is detected, we still need to call the `callback` argument, so
+  // split the callback to allow us to pass ownership of one to the 'update'
+  // part.
+  auto [callback_for_update, callback_for_no_update] =
+      base::SplitOnceCallback(std::move(callback));
+
+  DCHECK(desired_state.has_shortcut());
+  DCHECK(current_state.has_shortcut());
+
+  // Note: This callback is either called immediately (and synchronously), or
+  // not at all. This is why the usage of `std::ref` and `app` is safe.
+  auto do_update = base::BindOnce(
+      &PopulateFaviconForShortcutInfo, app, std::ref(*icon_manager_),
+      std::move(desired_shortcut_info),
+      base::BindOnce(&ShortcutSubManager::UpdateShortcut,
+                     weak_ptr_factory_.GetWeakPtr(), app_id,
+                     base::UTF8ToUTF16(current_state.shortcut().title()),
+                     std::move(callback_for_update)));
+
+  // Shortcut update detection.
+  std::string desired, current;
+  desired = desired_state.shortcut().SerializeAsString();
+  current = current_state.shortcut().SerializeAsString();
+  if (desired != current) {
+    std::move(do_update).Run();
+    return;
+  }
+
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
+  // Protocol handler update detection. Shortcuts need to be updated in this
+  // case on Linux & Mac because the shortcut itself includes the protocol
+  // handling metadata.
+  if (desired_state.has_protocols_handled() !=
+      current_state.has_protocols_handled()) {
+    std::move(do_update).Run();
+    return;
+  }
+  if (desired_state.has_protocols_handled() &&
+      current_state.has_protocols_handled()) {
+    desired = desired_state.protocols_handled().SerializeAsString();
+    current = current_state.protocols_handled().SerializeAsString();
+    if (desired != current) {
+      std::move(do_update).Run();
+      return;
+    }
+  }
+#endif
+
+  // TODO: Add file handler change detection.
+
+  // Fifth, no update is required.
+  std::move(callback_for_no_update).Run();
+}
+
+void ShortcutSubManager::CreateShortcut(
+    const AppId& app_id,
+    absl::optional<SynchronizeOsOptions> synchronize_options,
+    base::OnceClosure on_complete,
+    std::unique_ptr<ShortcutInfo> shortcut_info) {
+  SynchronizeOsOptions options =
+      synchronize_options.value_or(SynchronizeOsOptions());
+
+  ShortcutLocations locations;
+  locations.on_desktop = options.add_shortcut_to_desktop;
+  locations.applications_menu_location = APP_MENU_LOCATION_SUBDIR_CHROMEAPPS;
+  locations.in_quick_launch_bar = options.add_to_quick_launch_bar;
+
+  base::FilePath shortcut_data_dir =
+      internals::GetShortcutDataDir(*shortcut_info);
+  internals::ScheduleCreatePlatformShortcuts(
+      shortcut_data_dir, locations, options.reason, std::move(shortcut_info),
+      base::BindOnce([](bool success) {
+        base::UmaHistogramEnumeration(
+            "WebApp.Shortcuts.Creation.Result",
+            success ? CreationResult::kSuccess
+                    : CreationResult::kFailToCreateShortcut);
+      }).Then(std::move(on_complete)));
+}
+
+void ShortcutSubManager::UpdateShortcut(
+    const AppId& app_id,
+    const std::u16string& old_app_title,
+    base::OnceClosure on_complete,
+    std::unique_ptr<ShortcutInfo> shortcut_info) {
+  base::FilePath shortcut_data_dir =
+      internals::GetShortcutDataDir(*shortcut_info);
+  internals::PostShortcutIOTaskAndReplyWithResult(
+      base::BindOnce(&internals::UpdatePlatformShortcuts,
+                     std::move(shortcut_data_dir), std::move(old_app_title)),
+      std::move(shortcut_info),
+      base::BindOnce([](Result result) {
+        base::UmaHistogramBoolean("WebApp.Shortcuts.Update.Result",
+                                  (result == Result::kOk));
+      }).Then(std::move(on_complete)));
+}
+
+void ShortcutSubManager::StoreIconDataFromDisk(
+    proto::ShortcutDescription* shortcut,
+    base::flat_map<SquareSizePx, base::Time> time_map) {
+  for (const auto& [size, time] : time_map) {
+    auto* shortcut_icon_data = shortcut->add_icon_data_any();
+    shortcut_icon_data->set_icon_size(size);
+    shortcut_icon_data->set_timestamp(syncer::TimeToProtoTime(time));
+  }
+}
+
+}  // namespace web_app
diff --git a/chrome/browser/web_applications/os_integration/shortcut_sub_manager.h b/chrome/browser/web_applications/os_integration/shortcut_sub_manager.h
new file mode 100644
index 0000000..73f2377
--- /dev/null
+++ b/chrome/browser/web_applications/os_integration/shortcut_sub_manager.h
@@ -0,0 +1,69 @@
+// 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_WEB_APPLICATIONS_OS_INTEGRATION_SHORTCUT_SUB_MANAGER_H_
+#define CHROME_BROWSER_WEB_APPLICATIONS_OS_INTEGRATION_SHORTCUT_SUB_MANAGER_H_
+
+#include <memory>
+#include <string>
+
+#include "base/containers/flat_map.h"
+#include "base/functional/callback_forward.h"
+#include "base/memory/raw_ref.h"
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/web_applications/os_integration/os_integration_sub_manager.h"
+#include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h"
+#include "chrome/browser/web_applications/web_app_id.h"
+#include "chrome/browser/web_applications/web_app_install_info.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+class Profile;
+
+namespace web_app {
+
+class WebAppIconManager;
+class WebAppRegistrar;
+struct ShortcutInfo;
+struct SynchronizeOsOptions;
+
+class ShortcutSubManager : public OsIntegrationSubManager {
+ public:
+  ShortcutSubManager(Profile& profile,
+                     WebAppIconManager& icon_manager,
+                     WebAppRegistrar& registrar);
+  ~ShortcutSubManager() override;
+  void Start() override;
+  void Shutdown() override;
+  void Configure(const AppId& app_id,
+                 proto::WebAppOsIntegrationState& desired_state,
+                 base::OnceClosure configure_done) override;
+  void Execute(const AppId& app_id,
+               const absl::optional<SynchronizeOsOptions>& synchronize_options,
+               const proto::WebAppOsIntegrationState& desired_state,
+               const proto::WebAppOsIntegrationState& current_state,
+               base::OnceClosure callback) override;
+
+ private:
+  void CreateShortcut(const AppId& app_id,
+                      absl::optional<SynchronizeOsOptions> synchronize_options,
+                      base::OnceClosure on_complete,
+                      std::unique_ptr<ShortcutInfo> shortcut_info);
+  void UpdateShortcut(const AppId& app_id,
+                      const std::u16string& old_app_title,
+                      base::OnceClosure on_complete,
+                      std::unique_ptr<ShortcutInfo> shortcut_info);
+
+  void StoreIconDataFromDisk(proto::ShortcutDescription* shortcut,
+                             base::flat_map<SquareSizePx, base::Time> time_map);
+
+  const raw_ref<Profile> profile_;
+  const raw_ref<WebAppIconManager> icon_manager_;
+  const raw_ref<WebAppRegistrar> registrar_;
+
+  base::WeakPtrFactory<ShortcutSubManager> weak_ptr_factory_{this};
+};
+
+}  // namespace web_app
+
+#endif  // CHROME_BROWSER_WEB_APPLICATIONS_OS_INTEGRATION_SHORTCUT_SUB_MANAGER_H_
diff --git a/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager_browsertest.cc b/chrome/browser/web_applications/os_integration/shortcut_sub_manager_browsertest.cc
similarity index 82%
rename from chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager_browsertest.cc
rename to chrome/browser/web_applications/os_integration/shortcut_sub_manager_browsertest.cc
index 0b71ae0..ca01f4d 100644
--- a/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager_browsertest.cc
+++ b/chrome/browser/web_applications/os_integration/shortcut_sub_manager_browsertest.cc
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager.h"
-
 #include <memory>
 #include <utility>
 
@@ -11,10 +9,10 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/test/test_future.h"
 #include "base/threading/thread_restrictions.h"
-#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
-#include "chrome/browser/web_applications/commands/fetch_manifest_and_install_command.h"
+#include "chrome/browser/web_applications/os_integration/os_integration_manager.h"
+#include "chrome/browser/web_applications/os_integration/shortcut_sub_manager.h"
 #include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
 #include "chrome/browser/web_applications/test/web_app_test_utils.h"
 #include "chrome/browser/web_applications/web_app_command_manager.h"
@@ -36,7 +34,7 @@
 
 namespace {
 
-class ShortcutHandlingSubManagerBrowserTest
+class ShortcutSubManagerBrowserTest
     : public WebAppControllerBrowserTest,
       public ::testing::WithParamInterface<OsIntegrationSubManagersState> {
  public:
@@ -53,9 +51,14 @@
   }
 
   void SetUp() override {
-    if (OsIntegrationSubManagersEnabled()) {
+    if (GetParam() == OsIntegrationSubManagersState::kSaveStateToDB) {
       scoped_feature_list_.InitAndEnableFeatureWithParameters(
           features::kOsIntegrationSubManagers, {{"stage", "write_config"}});
+    } else if (GetParam() ==
+               OsIntegrationSubManagersState::kSaveStateAndExecute) {
+      scoped_feature_list_.InitAndEnableFeatureWithParameters(
+          features::kOsIntegrationSubManagers,
+          {{"stage", "execute_and_write_config"}});
     } else {
       scoped_feature_list_.InitWithFeatures(
           /*enabled_features=*/{},
@@ -97,17 +100,13 @@
                 testing::Eq(webapps::UninstallResultCode::kSuccess));
   }
 
-  bool OsIntegrationSubManagersEnabled() {
-    return GetParam() == OsIntegrationSubManagersState::kEnabled;
-  }
-
  private:
   std::unique_ptr<ShortcutOverrideForTesting::BlockingRegistration>
       shortcut_override_;
   base::test::ScopedFeatureList scoped_feature_list_;
 };
 
-IN_PROC_BROWSER_TEST_P(ShortcutHandlingSubManagerBrowserTest, Configure) {
+IN_PROC_BROWSER_TEST_P(ShortcutSubManagerBrowserTest, Configure) {
   GURL test_url = https_server()->GetURL(
       "/banners/"
       "manifest_test_page.html");
@@ -117,7 +116,7 @@
   auto state =
       provider().registrar_unsafe().GetAppCurrentOsIntegrationState(app_id);
   ASSERT_TRUE(state.has_value());
-  if (OsIntegrationSubManagersEnabled()) {
+  if (AreOsIntegrationSubManagersEnabled()) {
     ASSERT_THAT(state.value().shortcut().title(),
                 testing::Eq("Manifest test app"));
     // All icons are read from the disk.
@@ -130,12 +129,14 @@
           syncer::ProtoTimeToTime(icon_time_map_data.timestamp()).is_null(),
           testing::IsFalse());
     }
+    // TODO(dmurph): Implement shortcut & color detection if
+    // `AreSubManagersExecuteEnabled()` returns true. https://crbug.com/1404032.
   } else {
     ASSERT_FALSE(state.value().has_shortcut());
   }
 }
 
-IN_PROC_BROWSER_TEST_P(ShortcutHandlingSubManagerBrowserTest,
+IN_PROC_BROWSER_TEST_P(ShortcutSubManagerBrowserTest,
                        ConfigureUninstallReturnsEmptyState) {
   GURL test_url = https_server()->GetURL(
       "/banners/"
@@ -146,12 +147,16 @@
   auto state =
       provider().registrar_unsafe().GetAppCurrentOsIntegrationState(app_id);
   EXPECT_FALSE(state.has_value());
+
+  // TODO(dmurph): Implement shortcut & color detection if
+  // `AreSubManagersExecuteEnabled()` returns true. https://crbug.com/1404032.
 }
 
 INSTANTIATE_TEST_SUITE_P(
     All,
-    ShortcutHandlingSubManagerBrowserTest,
-    ::testing::Values(OsIntegrationSubManagersState::kEnabled,
+    ShortcutSubManagerBrowserTest,
+    ::testing::Values(OsIntegrationSubManagersState::kSaveStateToDB,
+                      OsIntegrationSubManagersState::kSaveStateAndExecute,
                       OsIntegrationSubManagersState::kDisabled),
     test::GetOsIntegrationSubManagersTestName);
 
diff --git a/chrome/browser/web_applications/os_integration/web_app_shortcut.cc b/chrome/browser/web_applications/os_integration/web_app_shortcut.cc
index 5615063..b5d7e587 100644
--- a/chrome/browser/web_applications/os_integration/web_app_shortcut.cc
+++ b/chrome/browser/web_applications/os_integration/web_app_shortcut.cc
@@ -29,12 +29,14 @@
 #include "base/synchronization/lock.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/task/lazy_thread_pool_task_runner.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
 #include "base/thread_annotations.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "chrome/browser/web_applications/os_integration/web_app_file_handler_registration.h"
+#include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h"
 #include "chrome/browser/web_applications/web_app_constants.h"
 #include "chrome/browser/web_applications/web_app_helpers.h"
 #include "chrome/common/chrome_constants.h"
@@ -301,6 +303,45 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
+std::unique_ptr<ShortcutInfo> BuildShortcutInfoWithoutFavicon(
+    const AppId& app_id,
+    const GURL& start_url,
+    const base::FilePath& profile_path,
+    const std::string& profile_name,
+    const proto::WebAppOsIntegrationState& state) {
+  auto shortcut_info = std::make_unique<ShortcutInfo>();
+
+  shortcut_info->extension_id = app_id;
+  shortcut_info->url = start_url;
+  DCHECK(state.has_shortcut());
+  const proto::ShortcutDescription& shortcut_state = state.shortcut();
+  DCHECK(shortcut_state.has_title());
+  shortcut_info->title = base::UTF8ToUTF16(shortcut_state.title());
+  DCHECK(shortcut_state.has_description());
+  shortcut_info->description = base::UTF8ToUTF16(shortcut_state.description());
+  shortcut_info->profile_path = profile_path;
+  shortcut_info->profile_name = profile_name;
+  shortcut_info->is_multi_profile = true;
+
+  // TODO(https://crbug.com/1295044): Add file handlers.
+
+  if (state.has_protocols_handled()) {
+    for (const auto& protocol_handler : state.protocols_handled().protocols()) {
+      DCHECK(protocol_handler.has_protocol());
+      if (protocol_handler.has_protocol() &&
+          !protocol_handler.protocol().empty()) {
+        shortcut_info->protocol_handlers.emplace(protocol_handler.protocol());
+      }
+    }
+  }
+
+  // TODO(https://crbug.com/1295044): Add shortcut menu infos.
+
+  // TODO(https://crbug.com/1295044): Add mac's file handlers per profile.
+
+  return shortcut_info;
+}
+
 std::string GenerateApplicationNameFromInfo(const ShortcutInfo& shortcut_info) {
   // TODO(loyso): Remove this empty()/non-empty difference.
   if (shortcut_info.extension_id.empty())
@@ -316,8 +357,9 @@
   DCHECK(!profile_path.empty());
   base::FilePath app_data_dir(profile_path.Append(chrome::kWebAppDirname));
 
-  if (!app_id.empty())
+  if (!app_id.empty()) {
     return app_data_dir.AppendASCII(GenerateApplicationNameFromAppId(app_id));
+  }
 
   std::string host(url.host());
   std::string scheme(url.has_scheme() ? url.scheme() : "http");
@@ -431,7 +473,7 @@
                      std::move(reply)));
 }
 
-scoped_refptr<base::TaskRunner> GetShortcutIOTaskRunner() {
+scoped_refptr<base::SequencedTaskRunner> GetShortcutIOTaskRunner() {
   return g_shortcuts_task_runner.Get();
 }
 
@@ -449,5 +491,4 @@
 #endif
 
 }  // namespace internals
-
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/os_integration/web_app_shortcut.h b/chrome/browser/web_applications/os_integration/web_app_shortcut.h
index 1882b7e8..a27abf6 100644
--- a/chrome/browser/web_applications/os_integration/web_app_shortcut.h
+++ b/chrome/browser/web_applications/os_integration/web_app_shortcut.h
@@ -31,8 +31,11 @@
 #include "chrome/browser/web_applications/app_shim_registry_mac.h"
 #endif
 
+class Profile;
+
 namespace base {
 class TaskRunner;
+class SequencedTaskRunner;
 }
 
 namespace gfx {
@@ -40,6 +43,9 @@
 }
 
 namespace web_app {
+namespace proto {
+class WebAppOsIntegrationState;
+}
 
 #if BUILDFLAG(IS_LINUX)
 struct LinuxFileRegistration {
@@ -167,6 +173,13 @@
   SEQUENCE_CHECKER(sequence_checker_);
 };
 
+std::unique_ptr<ShortcutInfo> BuildShortcutInfoWithoutFavicon(
+    const AppId& app_id,
+    const GURL& start_url,
+    const base::FilePath& profile_path,
+    const std::string& profile_name,
+    const proto::WebAppOsIntegrationState& state);
+
 // This specifies a folder in the system applications menu (e.g the Start Menu
 // on Windows).
 //
@@ -313,7 +326,7 @@
 // runner that permits access to COM libraries. Shortcut tasks typically deal
 // with ensuring Profile changes are reflected on disk, so shutdown is always
 // blocked so that an inconsistent shortcut state is not left on disk.
-scoped_refptr<base::TaskRunner> GetShortcutIOTaskRunner();
+scoped_refptr<base::SequencedTaskRunner> GetShortcutIOTaskRunner();
 
 base::FilePath GetShortcutDataDir(const ShortcutInfo& shortcut_info);
 
diff --git a/chrome/browser/web_applications/proto/web_app_os_integration_state.proto b/chrome/browser/web_applications/proto/web_app_os_integration_state.proto
index fee5aa3..085f80d 100644
--- a/chrome/browser/web_applications/proto/web_app_os_integration_state.proto
+++ b/chrome/browser/web_applications/proto/web_app_os_integration_state.proto
@@ -50,5 +50,8 @@
   optional ShortcutDescription shortcut = 1;
   optional ProtocolsHandled protocols_handled = 3;
   optional RunOnOsLogin run_on_os_login = 4;
+
   // Add data states for other OS integration hooks here.
+  // New fields added to this message must also be added to:
+  // OsStatesDebugValue()
 }
\ No newline at end of file
diff --git a/chrome/browser/web_applications/test/mock_os_integration_manager.h b/chrome/browser/web_applications/test/mock_os_integration_manager.h
index 27ac8de1..9365bdf 100644
--- a/chrome/browser/web_applications/test/mock_os_integration_manager.h
+++ b/chrome/browser/web_applications/test/mock_os_integration_manager.h
@@ -31,7 +31,9 @@
   // Installation:
   MOCK_METHOD(void,
               Synchronize,
-              (const AppId& app_id, base::OnceClosure callback),
+              (const AppId& app_id,
+               base::OnceClosure callback,
+               absl::optional<SynchronizeOsOptions> options),
               (override));
 
   MOCK_METHOD(void,
diff --git a/chrome/browser/web_applications/test/web_app_test_utils.cc b/chrome/browser/web_applications/test/web_app_test_utils.cc
index 7c62340..b3696b252 100644
--- a/chrome/browser/web_applications/test/web_app_test_utils.cc
+++ b/chrome/browser/web_applications/test/web_app_test_utils.cc
@@ -329,8 +329,10 @@
 std::string GetOsIntegrationSubManagersTestName(
     const ::testing::TestParamInfo<OsIntegrationSubManagersState>& info) {
   switch (info.param) {
-    case OsIntegrationSubManagersState::kEnabled:
-      return "OSIntegrationSubManagers_Enabled";
+    case OsIntegrationSubManagersState::kSaveStateToDB:
+      return "OSIntegrationSubManagers_SaveStateToDB";
+    case OsIntegrationSubManagersState::kSaveStateAndExecute:
+      return "OSIntegrationSubManagers_SaveStateAndExecute";
     case OsIntegrationSubManagersState::kDisabled:
       return "OSIntegrationSubManagers_Disabled";
   }
diff --git a/chrome/browser/web_applications/test/web_app_test_utils.h b/chrome/browser/web_applications/test/web_app_test_utils.h
index 36e3196..153dd8b 100644
--- a/chrome/browser/web_applications/test/web_app_test_utils.h
+++ b/chrome/browser/web_applications/test/web_app_test_utils.h
@@ -35,8 +35,9 @@
 
 // Intended to be used for parameterizing tests that involve OS integration.
 enum class OsIntegrationSubManagersState {
-  kEnabled = 0,
-  kDisabled = 1,
+  kSaveStateToDB = 0,
+  kSaveStateAndExecute = 1,
+  kDisabled = 2,
   kMaxValue = kDisabled
 };
 
diff --git a/chrome/browser/web_applications/web_app.cc b/chrome/browser/web_applications/web_app.cc
index 172ce877..13ee2db 100644
--- a/chrome/browser/web_applications/web_app.cc
+++ b/chrome/browser/web_applications/web_app.cc
@@ -12,8 +12,10 @@
 #include "base/containers/contains.h"
 #include "base/notreached.h"
 #include "base/strings/strcat.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
+#include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h"
 #include "chrome/browser/web_applications/user_display_mode.h"
 #include "chrome/browser/web_applications/web_app_chromeos_data.h"
 #include "chrome/browser/web_applications/web_app_constants.h"
@@ -56,6 +58,58 @@
   }
 }
 
+std::string GetRunOnOsLoginMode(const proto::RunOnOsLoginMode& mode) {
+  switch (mode) {
+    case proto::RunOnOsLoginMode::RUN_ON_OS_LOGIN_MODE_UNSPECIFIED:
+      return "unspecified";
+    case proto::RunOnOsLoginMode::NOT_RUN:
+      return "not_run";
+    case proto::RunOnOsLoginMode::WINDOWED:
+      return "windowed";
+    case proto::RunOnOsLoginMode::MINIMIZED:
+      return "minimized";
+  }
+}
+
+base::Value OsStatesDebugValue(
+    const proto::WebAppOsIntegrationState& current_states) {
+  base::Value::Dict debug_dict;
+
+  if (current_states.has_shortcut()) {
+    base::Value::Dict shortcut_data;
+    shortcut_data.Set("title", current_states.shortcut().title());
+    shortcut_data.Set("description", current_states.shortcut().description());
+    base::Value::Dict icon_data;
+    for (const auto& data : current_states.shortcut().icon_data_any()) {
+      icon_data.Set(base::NumberToString(data.icon_size()),
+                    syncer::GetTimeDebugString(
+                        syncer::ProtoTimeToTime(data.timestamp())));
+    }
+    shortcut_data.Set("icon_size_to_timestamp_map",
+                      base::Value(std::move(icon_data)));
+    debug_dict.Set("shortcut_descriptions",
+                   base::Value(std::move(shortcut_data)));
+  }
+
+  if (current_states.has_protocols_handled()) {
+    base::Value::Dict protocol_data;
+    for (const auto& data : current_states.protocols_handled().protocols()) {
+      protocol_data.Set(data.protocol(), data.url());
+    }
+    debug_dict.Set("protocols_handled", base::Value(std::move(protocol_data)));
+  }
+
+  if (current_states.has_run_on_os_login() &&
+      current_states.run_on_os_login().has_run_on_os_login_mode()) {
+    debug_dict.Set(
+        "run_on_os_login",
+        GetRunOnOsLoginMode(
+            current_states.run_on_os_login().run_on_os_login_mode()));
+  }
+
+  return base::Value(std::move(debug_dict));
+}
+
 }  // namespace
 
 WebApp::WebApp(const AppId& app_id)
@@ -868,8 +922,8 @@
   root.Set("always_show_toolbar_in_fullscreen",
            always_show_toolbar_in_fullscreen_);
 
-  // TODO(crbug.com/1295044) : Add logic to parse and show data.
-  root.Set("current_os_integration_states", base::Value());
+  root.Set("current_os_integration_states",
+           OsStatesDebugValue(current_os_integration_states_));
 
   if (isolation_data_.has_value()) {
     root.Set("isolation_data", isolation_data_->AsDebugValue());
diff --git a/chrome/browser/web_applications/web_app_install_finalizer.cc b/chrome/browser/web_applications/web_app_install_finalizer.cc
index 67ee012..bed6b2f 100644
--- a/chrome/browser/web_applications/web_app_install_finalizer.cc
+++ b/chrome/browser/web_applications/web_app_install_finalizer.cc
@@ -553,8 +553,15 @@
   // sub managers have been implemented.
   os_integration_manager_->InstallOsHooks(
       app_id, os_hooks_barrier, /*web_app_info=*/nullptr, hooks_options);
+
+  SynchronizeOsOptions synchronize_options;
+  synchronize_options.add_shortcut_to_desktop = hooks_options.add_to_desktop;
+  synchronize_options.add_to_quick_launch_bar =
+      hooks_options.add_to_quick_launch_bar;
+  synchronize_options.reason = hooks_options.reason;
   os_integration_manager_->Synchronize(
-      app_id, base::BindOnce(os_hooks_barrier, OsHooksErrors()));
+      app_id, base::BindOnce(os_hooks_barrier, OsHooksErrors()),
+      synchronize_options);
 }
 
 void WebAppInstallFinalizer::OnInstallHooksFinished(
diff --git a/chrome/browser/web_applications/web_app_install_finalizer_unittest.cc b/chrome/browser/web_applications/web_app_install_finalizer_unittest.cc
index 2d95d009..51b65aa 100644
--- a/chrome/browser/web_applications/web_app_install_finalizer_unittest.cc
+++ b/chrome/browser/web_applications/web_app_install_finalizer_unittest.cc
@@ -81,7 +81,7 @@
       public ::testing::WithParamInterface<OsIntegrationSubManagersState> {
  public:
   WebAppInstallFinalizerUnitTest() {
-    if (GetParam() == OsIntegrationSubManagersState::kEnabled) {
+    if (GetParam() == OsIntegrationSubManagersState::kSaveStateToDB) {
       scoped_feature_list_.InitWithFeaturesAndParameters(
           {{blink::features::kFileHandlingAPI, {}},
            {features::kOsIntegrationSubManagers, {{"stage", "write_config"}}}},
@@ -460,7 +460,7 @@
 INSTANTIATE_TEST_SUITE_P(
     All,
     WebAppInstallFinalizerUnitTest,
-    ::testing::Values(OsIntegrationSubManagersState::kEnabled,
+    ::testing::Values(OsIntegrationSubManagersState::kSaveStateToDB,
                       OsIntegrationSubManagersState::kDisabled),
     test::GetOsIntegrationSubManagersTestName);
 
diff --git a/chrome/browser/web_applications/web_app_install_utils_unittest.cc b/chrome/browser/web_applications/web_app_install_utils_unittest.cc
index 814a1bf..32779d5e 100644
--- a/chrome/browser/web_applications/web_app_install_utils_unittest.cc
+++ b/chrome/browser/web_applications/web_app_install_utils_unittest.cc
@@ -1421,7 +1421,7 @@
   EXPECT_CALL(manager, MacAppShimOnAppInstalledForProfile(app_id)).Times(1);
   EXPECT_CALL(manager, RegisterWebAppOsUninstallation(app_id, testing::_))
       .Times(1);
-  EXPECT_CALL(manager, Synchronize(app_id, testing::_))
+  EXPECT_CALL(manager, Synchronize(app_id, testing::_, testing::_))
       .WillOnce(base::test::RunOnceCallback<1>());
 
   // Scenario 1.
@@ -1493,7 +1493,7 @@
   // sets only kUninstallationViaOsSettings that will async call from
   // InstallOsHooks. Test ends before async is called so we test against
   // InstallOsHooks.
-  EXPECT_CALL(manager, Synchronize(app_id, testing::_)).Times(1);
+  EXPECT_CALL(manager, Synchronize(app_id, testing::_, testing::_)).Times(1);
   EXPECT_CALL(manager, UnregisterWebAppOsUninstallation(app_id)).Times(1);
 
   // Scenario 1.
diff --git a/chrome/browser/web_applications/web_app_registrar.cc b/chrome/browser/web_applications/web_app_registrar.cc
index f083e56..41122af 100644
--- a/chrome/browser/web_applications/web_app_registrar.cc
+++ b/chrome/browser/web_applications/web_app_registrar.cc
@@ -896,8 +896,14 @@
 bool WebAppRegistrar::ExpectThatFileHandlersAreRegisteredWithOs(
     const AppId& app_id) const {
   const WebApp* web_app = GetAppById(app_id);
-  return web_app && web_app->file_handler_os_integration_state() ==
-                        OsIntegrationState::kEnabled;
+  if (!web_app) {
+    return false;
+  }
+
+  // TODO(dibyapal): Add support for the new `current_os_integration_state()`
+  // when file handlers are added there. https://crbug.com/1404165.
+  return web_app->file_handler_os_integration_state() ==
+         OsIntegrationState::kEnabled;
 }
 
 absl::optional<GURL> WebAppRegistrar::GetAppScopeInternal(
diff --git a/chrome/browser/web_applications/web_app_registry_update.cc b/chrome/browser/web_applications/web_app_registry_update.cc
index 935eb8e..29bb17d 100644
--- a/chrome/browser/web_applications/web_app_registry_update.cc
+++ b/chrome/browser/web_applications/web_app_registry_update.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/web_applications/web_app_registry_update.h"
 
+#include "base/callback.h"
 #include "base/callback_helpers.h"
 #include "base/containers/contains.h"
 #include "chrome/browser/web_applications/web_app_registrar.h"
@@ -71,13 +72,20 @@
 }
 
 ScopedRegistryUpdate::ScopedRegistryUpdate(WebAppSyncBridge* sync_bridge)
-    : update_(sync_bridge->BeginUpdate()), sync_bridge_(sync_bridge) {}
+    : ScopedRegistryUpdate(sync_bridge, base::DoNothing()) {}
+ScopedRegistryUpdate::ScopedRegistryUpdate(
+    WebAppSyncBridge* sync_bridge,
+    base::OnceCallback<void(bool success)> commit_complete)
+    : update_(sync_bridge->BeginUpdate()),
+      sync_bridge_(sync_bridge),
+      commit_complete_(std::move(commit_complete)) {}
 
 ScopedRegistryUpdate::ScopedRegistryUpdate(ScopedRegistryUpdate&&) = default;
 
 ScopedRegistryUpdate::~ScopedRegistryUpdate() {
-  if (update_)
-    sync_bridge_->CommitUpdate(std::move(update_), base::DoNothing());
+  if (update_) {
+    sync_bridge_->CommitUpdate(std::move(update_), std::move(commit_complete_));
+  }
 }
 
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/web_app_registry_update.h b/chrome/browser/web_applications/web_app_registry_update.h
index 78acb08..9214a9e 100644
--- a/chrome/browser/web_applications/web_app_registry_update.h
+++ b/chrome/browser/web_applications/web_app_registry_update.h
@@ -8,7 +8,7 @@
 #include <memory>
 #include <vector>
 
-#include "base/callback.h"
+#include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
 #include "base/types/pass_key.h"
 #include "chrome/browser/web_applications/web_app_id.h"
@@ -67,6 +67,8 @@
 class ScopedRegistryUpdate {
  public:
   explicit ScopedRegistryUpdate(WebAppSyncBridge* sync_bridge);
+  ScopedRegistryUpdate(WebAppSyncBridge* sync_bridge,
+                       base::OnceCallback<void(bool success)> commit_complete);
   ScopedRegistryUpdate(ScopedRegistryUpdate&&);
   ScopedRegistryUpdate(const ScopedRegistryUpdate&) = delete;
   ScopedRegistryUpdate& operator=(const ScopedRegistryUpdate&) = delete;
@@ -77,6 +79,7 @@
  private:
   std::unique_ptr<WebAppRegistryUpdate> update_;
   const raw_ptr<WebAppSyncBridge> sync_bridge_;
+  base::OnceCallback<void(bool success)> commit_complete_;
 };
 
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/web_app_sync_bridge.cc b/chrome/browser/web_applications/web_app_sync_bridge.cc
index c8a3667..787d72d 100644
--- a/chrome/browser/web_applications/web_app_sync_bridge.cc
+++ b/chrome/browser/web_applications/web_app_sync_bridge.cc
@@ -164,15 +164,32 @@
   DCHECK(is_in_update_);
   is_in_update_ = false;
 
-  if (update == nullptr || update->update_data().IsEmpty()) {
+  if (update == nullptr) {
     std::move(callback).Run(/*success*/ true);
     return;
   }
 
-  if (!disable_checks_for_testing_)
-    CheckRegistryUpdateData(update->update_data());
-
   std::unique_ptr<RegistryUpdateData> update_data = update->TakeUpdateData();
+
+  // Remove all unchanged apps.
+  RegistryUpdateData::Apps changed_apps_to_update;
+  for (std::unique_ptr<WebApp>& app_to_update : update_data->apps_to_update) {
+    const AppId& app_id = app_to_update->app_id();
+    if (*app_to_update != *registrar().GetAppById(app_id)) {
+      changed_apps_to_update.push_back(std::move(app_to_update));
+    }
+  }
+  update_data->apps_to_update = std::move(changed_apps_to_update);
+
+  if (update_data->IsEmpty()) {
+    std::move(callback).Run(/*success*/ true);
+    return;
+  }
+
+  if (!disable_checks_for_testing_) {
+    CheckRegistryUpdateData(*update_data);
+  }
+
   std::unique_ptr<syncer::MetadataChangeList> metadata_change_list =
       CreateMetadataChangeList();
 
diff --git a/chrome/browser/web_applications/web_app_uninstall_job.cc b/chrome/browser/web_applications/web_app_uninstall_job.cc
index 7b3c736b4..f0b5a9cb 100644
--- a/chrome/browser/web_applications/web_app_uninstall_job.cc
+++ b/chrome/browser/web_applications/web_app_uninstall_job.cc
@@ -97,6 +97,9 @@
   os_integration_manager.Synchronize(
       app_id_, base::BindOnce(synchronize_barrier, OsHooksErrors()));
 
+  // While sometimes `Synchronize` needs to read icon data, for the uninstall
+  // case it never needs to be read. Thus, it is safe to schedule this now and
+  // not after the `Synchronize` call completes.
   icon_manager.DeleteData(app_id_,
                           base::BindOnce(&WebAppUninstallJob::OnIconDataDeleted,
                                          weak_ptr_factory_.GetWeakPtr()));
diff --git a/chrome/browser/web_applications/web_app_utils_unittest.cc b/chrome/browser/web_applications/web_app_utils_unittest.cc
index 53dcdb8..e1200ae 100644
--- a/chrome/browser/web_applications/web_app_utils_unittest.cc
+++ b/chrome/browser/web_applications/web_app_utils_unittest.cc
@@ -22,7 +22,7 @@
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "chrome/browser/ash/login/users/mock_user_manager.h"
-#include "chrome/browser/ash/profiles/profile_helper.h"
+#include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
 #include "components/user_manager/scoped_user_manager.h"
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
@@ -224,7 +224,7 @@
       signin_profile->GetPrimaryOTRProfile(/*create_if_needed=*/true)));
 
   Profile* lock_screen_profile = profile_manager().CreateTestingProfile(
-      ash::ProfileHelper::GetLockScreenAppProfileName());
+      ash::BrowserContextHelper::kLockScreenAppBrowserContextBaseName);
   EXPECT_TRUE(AreWebAppsEnabled(lock_screen_profile));
   EXPECT_TRUE(AreWebAppsEnabled(
       lock_screen_profile->GetPrimaryOTRProfile(/*create_if_needed=*/true)));
@@ -322,7 +322,7 @@
       signin_profile->GetPrimaryOTRProfile(/*create_if_needed=*/true)));
 
   Profile* lock_screen_profile = profile_manager().CreateTestingProfile(
-      ash::ProfileHelper::GetLockScreenAppProfileName());
+      ash::BrowserContextHelper::kLockScreenAppBrowserContextBaseName);
   EXPECT_FALSE(AreWebAppsUserInstallable(lock_screen_profile));
   EXPECT_FALSE(AreWebAppsUserInstallable(
       lock_screen_profile->GetPrimaryOTRProfile(/*create_if_needed=*/true)));
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 6c229d7..3abba189 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1672314914-1732279624b6a2cd75703a36eedc811f4f815314.profdata
+chrome-linux-main-1672378270-d6b24f5817642a85871f23e64c4c3cecaef0f277.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 1edc048..9b44b36d 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1672314914-d73bc6871c71f8bf83d8355325a42189a1a3d9d0.profdata
+chrome-mac-arm-main-1672378270-90f16545179ef7958773bb1f907d5c7745ebcd5e.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 9708fb4..e6a3d990 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1672335922-7669d6d9c5bc7b6d97450915653bcd23e49620d9.profdata
+chrome-mac-main-1672378270-e289717da29ee1d5d1e018e45b694b22439bbb7f.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index c748dfa..e2d7ab0 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1672324981-66ceb0ca6c7e11a21f4fc633100c3ca0792a29a3.profdata
+chrome-win32-main-1672378270-aed1a0483b2bcf326c3054219a1a9b7fbc089412.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 4d8ab74e..d6a57e1 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1672324981-2edfd3907a27c91c2afc5a8d811e4de2557dfce3.profdata
+chrome-win64-main-1672378270-22ff4bdcf83f9f96eefe20e31c0e82d599fe26a7.profdata
diff --git a/chrome/common/DEPS b/chrome/common/DEPS
index c56e9a77..4a6c07c 100644
--- a/chrome/common/DEPS
+++ b/chrome/common/DEPS
@@ -77,6 +77,9 @@
 ]
 
 specific_include_rules = {
+  "chrome_constants_ash_unittest\.cc": [
+    "+chromeos/ash/components/browser_context_helper/browser_context_helper.h",
+  ],
   "logging_chrome\.cc": [
     "+ash/constants/ash_switches.h",
   ],
diff --git a/chrome/common/chrome_constants.cc b/chrome/common/chrome_constants.cc
index 9d23ec57..47714a6 100644
--- a/chrome/common/chrome_constants.cc
+++ b/chrome/common/chrome_constants.cc
@@ -6,7 +6,6 @@
 
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/chrome_for_testing/buildflags.h"
 #include "chrome/common/chrome_version.h"
 
@@ -178,11 +177,6 @@
 
 const float kMaxShareOfExtensionProcesses = 0.30f;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-const char kLockScreenAppProfile[] = "LockScreenAppsProfile";
-const char kLockScreenProfile[] = "LockScreenProfile";
-#endif
-
 // This GUID is associated with any 'don't ask me again' settings that the
 // user can select for different file types.
 // {2676A9A2-D919-4FEE-9187-152100393AB2}
diff --git a/chrome/common/chrome_constants.h b/chrome/common/chrome_constants.h
index dbf2fb0a5..0311e8b 100644
--- a/chrome/common/chrome_constants.h
+++ b/chrome/common/chrome_constants.h
@@ -11,7 +11,6 @@
 
 #include "base/files/file_path.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 
 namespace chrome {
 
@@ -100,14 +99,6 @@
 // still securely isolating each extension in its own process.
 extern const float kMaxShareOfExtensionProcesses;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-// An anonymous profile that is used for lock screen apps.
-extern const char kLockScreenAppProfile[];
-
-// An incognito profile that is used for user authentication on lock screen.
-extern const char kLockScreenProfile[];
-#endif
-
 // Used to identify the application to the system AV function in Windows.
 extern const char kApplicationClientIDStringForAVScanning[];
 
diff --git a/chrome/common/chrome_constants_ash_unittest.cc b/chrome/common/chrome_constants_ash_unittest.cc
new file mode 100644
index 0000000..29d0e60
--- /dev/null
+++ b/chrome/common/chrome_constants_ash_unittest.cc
@@ -0,0 +1,19 @@
+// 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/common/chrome_constants.h"
+
+#include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace chrome {
+
+TEST(ChromeConstants, InitialProfile) {
+  // chrome::kInitialProfile must be exactly as same as
+  // ash::BrowserContextHelper::kSigninBrowserContextBaseName.
+  EXPECT_STREQ(chrome::kInitialProfile,
+               ash::BrowserContextHelper::kSigninBrowserContextBaseName);
+}
+
+}  // namespace chrome
diff --git a/chrome/common/extensions/api/file_manager_private.idl b/chrome/common/extensions/api/file_manager_private.idl
index 1df99ee..60b56e2 100644
--- a/chrome/common/extensions/api/file_manager_private.idl
+++ b/chrome/common/extensions/api/file_manager_private.idl
@@ -794,6 +794,10 @@
 };
 
 dictionary SearchMetadataParams {
+  // Optional root directory from which to start the search. If not present,
+  // the search begins at the local root.
+  [instanceof=DirectoryEntry] object? rootDir;
+
   // Search query. It can be empty. Any filename matches to an empty query.
   DOMString query;
 
@@ -1525,6 +1529,7 @@
                                   SearchFilesByHashesCallback callback);
 
   // Search files in My Files.
+  [nocompile]
   static void searchFiles(SearchMetadataParams searchParams,
                           SearchFilesCallback callback);
 
diff --git a/chrome/common/extensions/api/file_manager_private_internal.idl b/chrome/common/extensions/api/file_manager_private_internal.idl
index 87177403..bff182a5 100644
--- a/chrome/common/extensions/api/file_manager_private_internal.idl
+++ b/chrome/common/extensions/api/file_manager_private_internal.idl
@@ -23,6 +23,12 @@
     DOMString trashInfoFileName;
     double deletionDate;
   };
+  dictionary SearchFilesParams {
+    DOMString? rootUrl;
+    DOMString query;
+    fileManagerPrivate.SearchType types;
+    long maxResults;
+  };
 
   callback SimpleCallback = void();
   callback ResolveIsolatedEntriesCallback = void(EntryDescription[] entries);
@@ -58,7 +64,8 @@
   callback GetThumbnailCallback = void(DOMString ThumbnailDataUrl);
   callback BooleanCallback = void(boolean result);
   callback GetVolumeRootCallback = void(EntryDescription rootDir);
-callback ParseTrashInfoFilesCallback = void(ParsedTrashInfoFile[] files);
+  callback ParseTrashInfoFilesCallback = void(ParsedTrashInfoFile[] files);
+  callback SearchFilesCallback = void(EntryDescription[] entries);
 
   interface Functions {
     static void resolveIsolatedEntries(DOMString[] urls,
@@ -94,6 +101,7 @@
     static void executeTask(fileManagerPrivate.FileTaskDescriptor descriptor,
                             DOMString[] urls,
                             ExecuteTaskCallback callback);
+    static void searchFiles(SearchFilesParams searchParams, SearchFilesCallback callback);
     static void setDefaultTask(fileManagerPrivate.FileTaskDescriptor descriptor,
                                DOMString[] urls,
                                DOMString[] mimeTypes,
diff --git a/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js b/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js
index 6c14eff..007dfd71 100644
--- a/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js
@@ -124,6 +124,20 @@
     fileManagerPrivateInternal.getMimeType(url, callback);
   });
 
+  apiFunctions.setHandleRequest('searchFiles', function(params, callback) {
+    const newParams = {
+      query: params.query,
+      types: params.types,
+      maxResults: params.maxResults,
+    };
+    if (params.rootDir) {
+      newParams.rootUrl = getEntryURL(params.rootDir);
+    }
+    fileManagerPrivateInternal.searchFiles(newParams, function(entryList) {
+      callback((entryList || []).map(e => GetExternalFileEntry(e)));
+    });
+  });
+
   apiFunctions.setHandleRequest('getContentMimeType',
       function(fileEntry, callback) {
     fileEntry.file(blob => {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 84e2dce..d9dec36 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -7541,6 +7541,7 @@
       "../browser/ui/ash/assistant/device_actions_unittest.cc",
       "../browser/ui/ash/assistant/search_and_assistant_enabled_checker_unittest.cc",
       "../browser/ui/ash/calendar/calendar_keyed_service_unittest.cc",
+      "../browser/ui/ash/desks/chrome_desks_templates_delegate_unittest.cc",
       "../browser/ui/ash/device_scheduled_reboot/reboot_notification_controller_unittest.cc",
       "../browser/ui/ash/device_scheduled_reboot/scheduled_reboot_dialog_unittest.cc",
       "../browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc",
@@ -7585,6 +7586,7 @@
       "../browser/ui/window_sizer/window_sizer_chromeos_unittest.cc",
       "../browser/upgrade_detector/installed_version_updater_chromeos_unittest.cc",
       "../browser/upgrade_detector/upgrade_detector_chromeos_unittest.cc",
+      "../common/chrome_constants_ash_unittest.cc",
       "../renderer/chromeos_delayed_callback_group_unittest.cc",
     ]
 
@@ -7660,6 +7662,7 @@
       "//chrome/services/speech:unit_tests",
       "//chromeos/ash/components/assistant:buildflags",
       "//chromeos/ash/components/audio",
+      "//chromeos/ash/components/browser_context_helper",
       "//chromeos/ash/components/cryptohome",
       "//chromeos/ash/components/dbus",
       "//chromeos/ash/components/dbus/attestation",
diff --git a/chrome/test/base/testing_profile_manager.cc b/chrome/test/base/testing_profile_manager.cc
index de188669..3c80b81 100644
--- a/chrome/test/base/testing_profile_manager.cc
+++ b/chrome/test/base/testing_profile_manager.cc
@@ -30,6 +30,7 @@
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "chrome/browser/ash/profiles/profile_helper.h"
+#include "chrome/browser/profiles/profile_types_ash.h"
 #include "components/account_id/account_id.h"
 #include "components/user_manager/fake_user_manager.h"
 #endif
@@ -91,9 +92,7 @@
   // Create a path for the profile based on the name.
   base::FilePath profile_path(profiles_path_);
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  if (profile_name != chrome::kInitialProfile &&
-      profile_name != chrome::kLockScreenProfile &&
-      profile_name != ash::ProfileHelper::GetLockScreenAppProfileName()) {
+  if (IsUserProfilePath(base::FilePath(profile_name))) {
     const std::string fake_email =
         profile_name.find('@') == std::string::npos
             ? base::ToLowerASCII(profile_name) + "@test"
diff --git a/chrome/test/data/extensions/api_test/declarative_net_request/update_static_rules/background.js b/chrome/test/data/extensions/api_test/declarative_net_request/update_static_rules/background.js
new file mode 100644
index 0000000..0fe41bf
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/declarative_net_request/update_static_rules/background.js
@@ -0,0 +1,129 @@
+// 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.
+
+async function updateStaticRules(options, expectedError) {
+  if (expectedError) {
+    await chrome.test.assertPromiseRejects(
+        chrome.declarativeNetRequest.updateStaticRules(options),
+        expectedError);
+  } else {
+    await chrome.declarativeNetRequest.updateStaticRules(options);
+  }
+}
+
+async function getActiveRules() {
+  let activeRules = [];
+  for (const rulesetId of ['rules1', 'rules2']) {
+    for (const ruleId of [1, 2, 3]) {
+      let result = await chrome.declarativeNetRequest.testMatchOutcome(
+          {url: `https://${rulesetId}-${ruleId}.example.com/`,
+           type: 'main_frame', method: 'get'});
+      if (result.matchedRules.length > 0) {
+        chrome.test.assertEq(
+            {matchedRules: [{ruleId: ruleId, rulesetId: rulesetId}]},
+             result);
+        activeRules.push(`${rulesetId}-${ruleId}`);
+      } else {
+        chrome.test.assertEq({matchedRules: []}, result);
+      }
+    }
+  }
+  return activeRules;
+}
+
+chrome.test.runTests([
+  async function enableRulesets() {
+    // Enable the extension's rulesets here, instead of by default in the
+    // manifest, to ensure that the rulesets are ready before running the tests
+    // and avoid race condition. This works since the tests run sequentially.
+    await chrome.declarativeNetRequest.updateEnabledRulesets(
+        {enableRulesetIds: ['rules1', 'rules2']});
+
+    chrome.test.assertEq(['rules1-1', 'rules1-2', 'rules1-3', 'rules2-1',
+                          'rules2-2', 'rules2-3'],
+                         await getActiveRules());
+    chrome.test.succeed();
+  },
+  async function disableRuleset1Rules() {
+    // Disable rules1-2 and rules1-3.
+    await updateStaticRules({rulesetId: 'rules1', disableRuleIds: [2, 3]});
+
+    chrome.test.assertEq(['rules1-1', 'rules2-1', 'rules2-2', 'rules2-3'],
+                         await getActiveRules());
+    chrome.test.succeed();
+  },
+  async function disableRulesets() {
+    // Disable all rulesets (rules1, rules2). All rules in the disabled
+    // rulesets must be inactive.
+    await chrome.declarativeNetRequest.updateEnabledRulesets(
+        {disableRulesetIds: ['rules1', 'rules2']});
+
+    chrome.test.assertEq([], await getActiveRules());
+    chrome.test.succeed();
+  },
+  async function enableRuleset1Rule() {
+    // Enable ruleset1-3. Still all rules are inactive, but rules1-3 is
+    // enabled internally.
+    await updateStaticRules({rulesetId: 'rules1', enableRuleIds: [3]});
+
+    chrome.test.assertEq([], await getActiveRules());
+    chrome.test.succeed();
+  },
+  async function disableRuleset2Rules() {
+    // Disable rules2-2 and rules2-3. Still all rules are inactive, but
+    // rules2-2 and rules2-3 are disabled internally.
+    await updateStaticRules({rulesetId: 'rules2', disableRuleIds: [2, 3]});
+
+    chrome.test.assertEq([], await getActiveRules());
+    chrome.test.succeed();
+  },
+  async function enableRulesetsAgain() {
+    // Enable all rulesets again to check whether the extension keeps the
+    // disabled static rules information.
+    await chrome.declarativeNetRequest.updateEnabledRulesets(
+        {enableRulesetIds: ['rules1', 'rules2']});
+
+    chrome.test.assertEq(['rules1-1', 'rules1-3', 'rules2-1'],
+                         await getActiveRules());
+    chrome.test.succeed();
+  },
+  async function enableRuleset2Rule() {
+    // Enable rules2-2.
+    await updateStaticRules({rulesetId: 'rules2', enableRuleIds: [2]});
+
+    chrome.test.assertEq(['rules1-1', 'rules1-3', 'rules2-1', 'rules2-2'],
+                         await getActiveRules());
+    chrome.test.succeed();
+  },
+  async function disableInvalidRulesetRules() {
+    // updateStaticRules() must be failed with invalid ruleset id.
+    await updateStaticRules({rulesetId: 'invalid_rules', disableRuleIds: [2]},
+                            'Error: Invalid ruleset id: invalid_rules.');
+
+    chrome.test.assertEq(['rules1-1', 'rules1-3', 'rules2-1', 'rules2-2'],
+                         await getActiveRules());
+    chrome.test.succeed();
+  },
+  async function disableRulesetRulesExceedingLimits() {
+    // updateStaticRules() must be failed when the result exceeds limit.
+    await updateStaticRules(
+              {rulesetId: 'rules2',
+               disableRuleIds: Array.from({length: 5000}, (_, i) => i + 10)},
+              'Error: The number of disabled static rules exceeds ' +
+                  'the disabled rule count limit.');
+
+    chrome.test.assertEq(['rules1-1', 'rules1-3', 'rules2-1', 'rules2-2'],
+                         await getActiveRules());
+    chrome.test.succeed();
+  },
+  async function updateStaticRulesWithEmptyList() {
+    // updateStaticRules() is succeeded with empty rule ids, but doesn't change
+    // anything.
+    await updateStaticRules({rulesetId: 'rules2'});
+
+    chrome.test.assertEq(['rules1-1', 'rules1-3', 'rules2-1', 'rules2-2'],
+                         await getActiveRules());
+    chrome.test.succeed();
+  },
+]);
diff --git a/chrome/test/data/extensions/api_test/declarative_net_request/update_static_rules/manifest.json b/chrome/test/data/extensions/api_test/declarative_net_request/update_static_rules/manifest.json
new file mode 100644
index 0000000..841f1d5
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/declarative_net_request/update_static_rules/manifest.json
@@ -0,0 +1,23 @@
+{
+  "name": "Test extension",
+  "declarative_net_request": {
+    "rule_resources": [{
+      "id": "rules1",
+      "path": "rules1.json",
+      "enabled": false
+    }, {
+      "id": "rules2",
+      "path": "rules2.json",
+      "enabled": false
+    }]
+  },
+  "manifest_version": 3,
+  "permissions": [
+    "declarativeNetRequest",
+    "declarativeNetRequestFeedback"
+  ],
+  "version": "1.0",
+  "background": {
+    "service_worker": "background.js"
+  }
+}
diff --git a/chrome/test/data/extensions/api_test/declarative_net_request/update_static_rules/rules1.json b/chrome/test/data/extensions/api_test/declarative_net_request/update_static_rules/rules1.json
new file mode 100644
index 0000000..d9329282
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/declarative_net_request/update_static_rules/rules1.json
@@ -0,0 +1,30 @@
+[{
+  "id" : 1,
+  "priority": 1,
+  "condition" : {
+    "requestDomains": ["rules1-1.example.com"],
+    "resourceTypes": ["main_frame"],
+    "requestMethods": ["get"]
+  },
+  "action": {"type" : "block"}
+},
+{
+  "id": 2,
+  "priority": 1,
+  "condition" : {
+    "requestDomains": ["rules1-2.example.com"],
+    "resourceTypes": ["main_frame"],
+    "requestMethods": ["get"]
+  },
+  "action": {"type" : "block"}
+},
+{
+  "id": 3,
+  "priority": 1,
+  "condition" : {
+    "requestDomains": ["rules1-3.example.com"],
+    "resourceTypes": ["main_frame"],
+    "requestMethods": ["get"]
+  },
+  "action": {"type" : "block"}
+}]
diff --git a/chrome/test/data/extensions/api_test/declarative_net_request/update_static_rules/rules2.json b/chrome/test/data/extensions/api_test/declarative_net_request/update_static_rules/rules2.json
new file mode 100644
index 0000000..334374e
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/declarative_net_request/update_static_rules/rules2.json
@@ -0,0 +1,30 @@
+[{
+  "id" : 1,
+  "priority": 1,
+  "condition" : {
+    "requestDomains": ["rules2-1.example.com"],
+    "resourceTypes": ["main_frame"],
+    "requestMethods": ["get"]
+  },
+  "action": {"type" : "block"}
+},
+{
+  "id": 2,
+  "priority": 1,
+  "condition" : {
+    "requestDomains": ["rules2-2.example.com"],
+    "resourceTypes": ["main_frame"],
+    "requestMethods": ["get"]
+  },
+  "action": {"type" : "block"}
+},
+{
+  "id": 3,
+  "priority": 1,
+  "condition" : {
+    "requestDomains": ["rules2-3.example.com"],
+    "resourceTypes": ["main_frame"],
+    "requestMethods": ["get"]
+  },
+  "action": {"type" : "block"}
+}]
diff --git a/chrome/test/data/extensions/api_test/file_browser/search_files/manifest.json b/chrome/test/data/extensions/api_test/file_browser/search_files/manifest.json
new file mode 100644
index 0000000..a53c72d
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/file_browser/search_files/manifest.json
@@ -0,0 +1,19 @@
+{
+  // chrome-extension://pkplfbidichfdicaijlchgnapepdginl
+  "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtDfX9dHNh948bt00YhZBm3P6E5QLaOt+v8kXVtibQfiPtOD2FTScB/f0wX/EQWVO7BkaSOsRkTPcPIgocyMPYr2FLgqGLFlYT9nQpKJZUFNF5oJ5rG6Nv7ppf4zEB3j6da1IBRTz2yOZ+6O1TMZxol/V62/QcqrJeggsHTEPGLdr9Ua4b1Ka0xKJnJngZljsbw93FI1o+P9dAh5BS6wTPiZI/vmJVjvMTkSTnaZ3n9Go2t7A0XLcSxLcVyuLAd2mAvSN0mIviOukdM66wr7llif71nKuUt+4qvlr/r9HfwzN6pA4jkwhtS1UD+3CmB+wsHwsnohNcuu4FIQ6rgq/7QIDAQAB",
+  "name": "chrome.fileManagerPrivate tests",
+  "version": "0.1",
+  "manifest_version": 2,
+  "description": "Tests of chrome.fileManagerPrivate.searchFiles",
+  "app": {
+    "background": {
+      "scripts": ["test.js"]
+    }
+  },
+  "permissions": [
+    "fileManagerPrivate",
+    {
+      "fileSystem": ["requestFileSystem", "write"]
+    }
+  ]
+}
diff --git a/chrome/test/data/extensions/api_test/file_browser/search_files/test.js b/chrome/test/data/extensions/api_test/file_browser/search_files/test.js
new file mode 100644
index 0000000..c2103ac
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/file_browser/search_files/test.js
@@ -0,0 +1,92 @@
+// 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.
+
+
+/**
+ * Helper function that checks if the gotten entry list has entries with
+ * wanted paths.
+ */
+function assertHasEntries(wantPathList, gotEntryList) {
+  chrome.test.assertEq(
+      wantPathList.length, gotEntryList.length,
+      `Expected ${wantPathList.length}, found ${gotEntryList.length}`);
+  for (let i = 0; i < wantPathList.length; ++i) {
+    const wantPath = wantPathList[i];
+    const gotEntry = gotEntryList[i];
+    chrome.test.assertEq(
+        wantPath, gotEntry.fullPath,
+        `entry[${i}]: ${wantPath} != ${gotEntry.fullPath}`);
+  }
+}
+
+/**
+ * Helper function for getting the root directory for downloads.
+ */
+async function getDownloads() {
+  return new Promise((resolve, reject) => {
+    chrome.fileManagerPrivate.getVolumeMetadataList((volumeMetadaList) => {
+      const downloads =
+          volumeMetadaList.filter((v) => v.volumeId.startsWith('downloads:'))
+      if (downloads.length !== 1) {
+        reject(`Expected 1 downloads directory found ${downloads.length}`);
+      } else {
+        chrome.fileSystem.requestFileSystem(
+            {
+              volumeId: downloads[0].volumeId,
+              writable: !downloads[0].isReadOnly
+            },
+            (fileSystem) => {
+              resolve(fileSystem.root);
+            });
+      }
+    });
+  });
+}
+
+chrome.test.runTests([
+  // Test the old style request without rootDir parameter.
+  function testSearchWithoutRootDir() {
+    chrome.fileManagerPrivate.searchFiles(
+        {
+          query: 'foo',
+          types: 'ALL',
+          maxResults: 10,
+        },
+        chrome.test.callbackPass((entryList) => {
+          assertHasEntries(['/foo.jpg', '/images/foo.jpg'], entryList);
+        }));
+  },
+
+  // Test the new style with explicit rootDir parameter set to the root.
+  async function testSearchWithRootDirAtRoot() {
+    const downloads = await getDownloads();
+    chrome.fileManagerPrivate.searchFiles(
+        {
+          rootDir: downloads,
+          query: 'foo',
+          types: 'ALL',
+          maxResults: 10,
+        },
+        chrome.test.callbackPass((entryList) => {
+          assertHasEntries(['/foo.jpg', '/images/foo.jpg'], entryList);
+        }));
+  },
+
+  // Test the new style with explicit rootDir set to a subdirectory.
+  async function testSearchWithRootDirAtImages() {
+    const downloads = await getDownloads();
+    downloads.getDirectory('images', {create: false}, (dir) => {
+      chrome.fileManagerPrivate.searchFiles(
+          {
+            rootDir: dir,
+            query: 'foo',
+            types: 'ALL',
+            maxResults: 10,
+          },
+          chrome.test.callbackPass((entryList) => {
+            assertHasEntries(['/images/foo.jpg'], entryList);
+          }));
+    });
+  },
+]);
diff --git a/chrome/test/data/pdf/navigator_test.ts b/chrome/test/data/pdf/navigator_test.ts
index 72a3504c..30e40f14 100644
--- a/chrome/test/data/pdf/navigator_test.ts
+++ b/chrome/test/data/pdf/navigator_test.ts
@@ -8,6 +8,9 @@
 
 import {getZoomableViewport, MockDocumentDimensions, MockElement, MockSizer, MockViewportChangedCallback} from './test_util.js';
 
+// URL allowed local file access.
+const ALLOWED_URL: string = 'https://test-allowed-domain.com/document.pdf';
+
 class MockNavigatorDelegate extends TestBrowserProxy implements
     NavigatorDelegate {
   constructor() {
@@ -15,6 +18,7 @@
       'navigateInCurrentTab',
       'navigateInNewTab',
       'navigateInNewWindow',
+      'isAllowedLocalFileAccess',
     ]);
   }
 
@@ -29,6 +33,10 @@
   navigateInNewWindow(url: string) {
     this.methodCalled('navigateInNewWindow', url);
   }
+
+  isAllowedLocalFileAccess(url: string): Promise<boolean> {
+    return Promise.resolve(url === ALLOWED_URL);
+  }
 }
 
 /**
@@ -274,4 +282,19 @@
 
     chrome.test.succeed();
   },
+
+  /**
+   * Test domains and urls have access to file:/// urls when allowed.
+   */
+  async function testNavigateAllowedLocalFileAccess() {
+    await doNavigationUrlTests(
+        ALLOWED_URL, 'file:///bar.pdf', 'file:///bar.pdf');
+
+    const disallowedUrl = 'https://test-disallowed-domain.com/document.pdf';
+
+    await doNavigationUrlTests(disallowedUrl, 'file:///bar.pdf', undefined);
+
+    chrome.test.succeed();
+  },
+
 ]);
diff --git a/chrome/test/data/web_apps/empty_web_app.json b/chrome/test/data/web_apps/empty_web_app.json
index 477e042..6dec565 100644
--- a/chrome/test/data/web_apps/empty_web_app.json
+++ b/chrome/test/data/web_apps/empty_web_app.json
@@ -12,7 +12,7 @@
    "client_data": {
       "system_web_app_data": null
    },
-   "current_os_integration_states": null,
+   "current_os_integration_states": {},
    "dark_mode_background_color": "none",
    "dark_mode_theme_color": "none",
    "data_size_in_bytes": "",
diff --git a/chrome/test/data/web_apps/sample_web_app.json b/chrome/test/data/web_apps/sample_web_app.json
index 3c0fda9..8ebfbd75 100644
--- a/chrome/test/data/web_apps/sample_web_app.json
+++ b/chrome/test/data/web_apps/sample_web_app.json
@@ -12,7 +12,7 @@
    "client_data": {
       "system_web_app_data": null
    },
-   "current_os_integration_states": null,
+   "current_os_integration_states": {},
    "dark_mode_background_color": "none",
    "dark_mode_theme_color": "rgba(34,214,187,1)",
    "data_size_in_bytes": "3687618762",
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 73cdc86..bef5aa4d 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
@@ -47,7 +47,7 @@
           ],
           'emoticon': ['/emoticon_test_ordering.json'],
           'symbol': ['/symbol_test_ordering.json'],
-          'gif': [''],
+          'gif': ['/gif_test_ordering.json'],
         },
       });
 
diff --git a/chromecast/BUILD.gn b/chromecast/BUILD.gn
index 49c2f34..8523d954ec 100644
--- a/chromecast/BUILD.gn
+++ b/chromecast/BUILD.gn
@@ -742,7 +742,7 @@
         min_sdk_version = 24
         target_sdk_version = 33
 
-        module_name = "cast_browser"
+        package_name = "cast_browser"
 
         # |package_id| is required because the default one conflicts with the base
         # modules' ID (0x7f).
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 1c24a92..9aaa905f 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-15295.0.0
\ No newline at end of file
+15296.0.0
\ No newline at end of file
diff --git a/chromeos/ash/components/browser_context_helper/browser_context_helper.cc b/chromeos/ash/components/browser_context_helper/browser_context_helper.cc
index d1b1d70..aa0e43c3 100644
--- a/chromeos/ash/components/browser_context_helper/browser_context_helper.cc
+++ b/chromeos/ash/components/browser_context_helper/browser_context_helper.cc
@@ -71,6 +71,17 @@
 }
 
 // static
+const char BrowserContextHelper::kSigninBrowserContextBaseName[] = "Default";
+
+// static
+const char BrowserContextHelper::kLockScreenAppBrowserContextBaseName[] =
+    "LockScreenAppsProfile";
+
+// static
+const char BrowserContextHelper::kLockScreenBrowserContextBaseName[] =
+    "LockScreenProfile";
+
+// static
 const char BrowserContextHelper::kLegacyBrowserContextDirName[] = "user";
 
 // static
@@ -99,4 +110,18 @@
       GetUserBrowserContextDirName(user_id_hash));
 }
 
+base::FilePath BrowserContextHelper::GetSigninBrowserContextPath() const {
+  return delegate_->GetUserDataDir()->Append(kSigninBrowserContextBaseName);
+}
+
+base::FilePath BrowserContextHelper::GetLockScreenAppBrowserContextPath()
+    const {
+  return delegate_->GetUserDataDir()->Append(
+      kLockScreenAppBrowserContextBaseName);
+}
+
+base::FilePath BrowserContextHelper::GetLockScreenBrowserContextPath() const {
+  return delegate_->GetUserDataDir()->Append(kLockScreenBrowserContextBaseName);
+}
+
 }  // namespace ash
diff --git a/chromeos/ash/components/browser_context_helper/browser_context_helper.h b/chromeos/ash/components/browser_context_helper/browser_context_helper.h
index 32d69df..5425971 100644
--- a/chromeos/ash/components/browser_context_helper/browser_context_helper.h
+++ b/chromeos/ash/components/browser_context_helper/browser_context_helper.h
@@ -61,6 +61,26 @@
   static std::string GetUserIdHashFromBrowserContext(
       content::BrowserContext* browser_context);
 
+  // In ash-chrome, we have three special browser context instances
+  // (a.k.a. Profile).
+  // 1) Singin browser context, which is used on login screen.
+  // 2) Lock-screen-app browser context, which is used for launching platform
+  //    apps that can display windows on top of the lock screen.
+  // 3) Lock-screen browser context, which is used during online authentication
+  //    on the lock screen.
+
+  // Base name of the signin browser context.
+  static const char kSigninBrowserContextBaseName[];
+
+  // Base name of the lock-screen-app browser context.
+  static const char kLockScreenAppBrowserContextBaseName[];
+
+  // Base name of the lock-screen browser context.
+  static const char kLockScreenBrowserContextBaseName[];
+
+  // Hereafter, define two additional directory names, one for compatibility
+  // and the other for testing.
+
   // Legacy profile dir that was used when only one cryptohome has been mounted.
   static const char kLegacyBrowserContextDirName[];
 
@@ -75,6 +95,15 @@
   base::FilePath GetBrowserContextPathByUserIdHash(
       base::StringPiece user_id_hash);
 
+  // Returns the path of signin browser context.
+  base::FilePath GetSigninBrowserContextPath() const;
+
+  // Returns the path of lock-screen-app browser context.
+  base::FilePath GetLockScreenAppBrowserContextPath() const;
+
+  // Returns the path of lock-screen browser context.
+  base::FilePath GetLockScreenBrowserContextPath() const;
+
  private:
   // This is only for graceful migration.
   // TODO(crbug.com/1325210): Remove this when migration is done.
diff --git a/components/app_restore/restore_data.cc b/components/app_restore/restore_data.cc
index cb7bae0..26af091f 100644
--- a/components/app_restore/restore_data.cc
+++ b/components/app_restore/restore_data.cc
@@ -278,6 +278,17 @@
   }
 }
 
+void RestoreData::UpdateBrowserAppIdToLacros() {
+  auto app_launch_list_iter =
+      app_id_to_launch_list_.find(app_constants::kChromeAppId);
+  if (app_launch_list_iter == app_id_to_launch_list_.end()) {
+    return;
+  }
+  app_id_to_launch_list_[app_constants::kLacrosAppId] =
+      std::move(app_launch_list_iter->second);
+  RemoveApp(app_constants::kChromeAppId);
+}
+
 std::string RestoreData::ToString() const {
   if (app_id_to_launch_list_.empty())
     return "empty";
diff --git a/components/app_restore/restore_data.h b/components/app_restore/restore_data.h
index f9f2a862..5607bd9e 100644
--- a/components/app_restore/restore_data.h
+++ b/components/app_restore/restore_data.h
@@ -176,6 +176,10 @@
   // launch. This must be done before launching.
   void MakeWindowIdsUniqueForDeskTemplate();
 
+  // Update the app id for the browser app to lacros if lacros is enabled and is
+  // primary. This must be done before launching.
+  void UpdateBrowserAppIdToLacros();
+
   std::string ToString() const;
 
   const AppIdToLaunchList& app_id_to_launch_list() const {
diff --git a/components/app_restore/restore_data_unittest.cc b/components/app_restore/restore_data_unittest.cc
index e8e445c..e9758430 100644
--- a/components/app_restore/restore_data_unittest.cc
+++ b/components/app_restore/restore_data_unittest.cc
@@ -794,4 +794,27 @@
   EXPECT_TRUE(restore_data().HasBrowser());
 }
 
+TEST_F(RestoreDataTest, UpdateAppIdToLacros) {
+  std::unique_ptr<AppLaunchInfo> app_launch_info1 =
+      std::make_unique<AppLaunchInfo>(app_constants::kChromeAppId, kWindowId1);
+
+  restore_data().AddAppLaunchInfo(std::move(app_launch_info1));
+  // Verify that ash chrome is added.
+  const auto ash_chrome_it =
+      restore_data().app_id_to_launch_list().find(app_constants::kChromeAppId);
+  EXPECT_TRUE(ash_chrome_it != restore_data().app_id_to_launch_list().end());
+  EXPECT_FALSE(ash_chrome_it->second.empty());
+
+  restore_data().UpdateBrowserAppIdToLacros();
+  // Verify that ash chrome app id is modified to lacros version.
+  const auto lacros_chrome_it =
+      restore_data().app_id_to_launch_list().find(app_constants::kLacrosAppId);
+  const auto ash_chrome_after_update_it =
+      restore_data().app_id_to_launch_list().find(app_constants::kChromeAppId);
+  EXPECT_TRUE(lacros_chrome_it != restore_data().app_id_to_launch_list().end());
+  EXPECT_FALSE(lacros_chrome_it->second.empty());
+  EXPECT_TRUE(ash_chrome_after_update_it ==
+              restore_data().app_id_to_launch_list().end());
+  EXPECT_EQ(1u, restore_data().app_id_to_launch_list().size());
+}
 }  // namespace app_restore
diff --git a/components/autofill/core/browser/data_model/credit_card.cc b/components/autofill/core/browser/data_model/credit_card.cc
index 9afaf9c1..4921457653 100644
--- a/components/autofill/core/browser/data_model/credit_card.cc
+++ b/components/autofill/core/browser/data_model/credit_card.cc
@@ -59,8 +59,8 @@
 
 const int kMaxNicknameLength = 25;
 
-constexpr int k16DigitNumberSegmentations[] = {4, 4, 4, 4};
-constexpr int k16DigitNumberSegmentationsLength = 4;
+constexpr std::array<int, 3> k15DigitAmexNumberSegmentations = {4, 6, 5};
+constexpr std::array<int, 4> k16DigitNumberSegmentations = {4, 4, 4, 4};
 
 // Suffix for GUID of a virtual card to differentiate it from it's corresponding
 // masked server card..
@@ -106,19 +106,17 @@
   return stripped.substr(stripped.size() - kNumLastDigits, kNumLastDigits);
 }
 
-// Returns a new string based on the input |number| by adding a white space
-// between |segments|. The provided |segments| denotes the length of each
-// segment, and we don't need to add whitespace to the last segmentation.
-// |segments_size| denotes the size of the |segments| array. For example, if you
-// would like to format 15-digit card number into "XXXX XXXXXX XXXXX", you need
-// to provide [4, 6, 5] as the |segments|, 3 as the |segments_size|.
+// Returns a new string based on the input `number` by adding a white space
+// between `segments`. The provided `segments` denotes the length of each
+// segment, and we don't need to add whitespace to the last segmentation. For
+// example, if you would like to format 15-digit card number into "XXXX XXXXXX
+// XXXXX", you need to provide [4, 6, 5] as the `segments`.
 std::u16string AddWhiteSpaceSeparatorForNumber(const std::u16string& number,
-                                               const int segments[],
-                                               const int segments_size) {
+                                               base::span<const int> segments) {
   std::u16string formatted;
   int pos = 0;
   // We don't need to add white space to the last segmentation.
-  for (int i = 0; i < segments_size - 1; i++) {
+  for (size_t i = 0; i < segments.size() - 1; i++) {
     formatted += number.substr(pos, segments[i]) + kWhiteSpaceSeparator;
     pos += segments[i];
   }
@@ -898,12 +896,16 @@
 
 std::u16string CreditCard::FullDigitsForDisplay() const {
   std::u16string stripped = CreditCard::StripSeparators(number_);
-  // Currently we only format 16-digit length card number.
-  // TODO(crbug.com/1222501): Extend this to other digit lengths.
-  if (stripped.size() != 16)
-    return number_;
-  return AddWhiteSpaceSeparatorForNumber(stripped, k16DigitNumberSegmentations,
-                                         k16DigitNumberSegmentationsLength);
+  if (stripped.size() == 16) {
+    return AddWhiteSpaceSeparatorForNumber(stripped,
+                                           k16DigitNumberSegmentations);
+  }
+  if (stripped.size() == 15 && network_ == kAmericanExpressCard) {
+    return AddWhiteSpaceSeparatorForNumber(stripped,
+                                           k15DigitAmexNumberSegmentations);
+  }
+
+  return number_;
 }
 
 std::u16string CreditCard::NetworkForDisplay() const {
diff --git a/components/autofill/core/browser/data_model/credit_card_unittest.cc b/components/autofill/core/browser/data_model/credit_card_unittest.cc
index 2fea92d..7d662ec 100644
--- a/components/autofill/core/browser/data_model/credit_card_unittest.cc
+++ b/components/autofill/core/browser/data_model/credit_card_unittest.cc
@@ -1825,9 +1825,18 @@
   card.SetRawInfo(CREDIT_CARD_NUMBER, u"5212-3412-3412-3489");
   ASSERT_EQ(u"5212 3412 3412 3489", card.FullDigitsForDisplay());
 
-  // 15-digit card number stays the same.
+  // 15-digit Amex card number adds spacing.
   card.SetRawInfo(CREDIT_CARD_NUMBER, u"378282246310005");
-  ASSERT_EQ(u"378282246310005", card.FullDigitsForDisplay());
+  ASSERT_EQ(u"3782 822463 10005", card.FullDigitsForDisplay());
+
+  // 16-digit card number that begins with Amex digits should have normal
+  // spacing.
+  card.SetRawInfo(CREDIT_CARD_NUMBER, u"3782822463100052");
+  ASSERT_EQ(u"3782 8224 6310 0052", card.FullDigitsForDisplay());
+
+  // 15-digit non-Amex card number stays the same.
+  card.SetRawInfo(CREDIT_CARD_NUMBER, u"998282246310005");
+  ASSERT_EQ(u"998282246310005", card.FullDigitsForDisplay());
 
   // 19-digit card number stays the same.
   card.SetRawInfo(CREDIT_CARD_NUMBER, u"4532261615476013542");
diff --git a/components/content_settings/core/common/cookie_settings_base.h b/components/content_settings/core/common/cookie_settings_base.h
index a7e92c36..49ae627 100644
--- a/components/content_settings/core/common/cookie_settings_base.h
+++ b/components/content_settings/core/common/cookie_settings_base.h
@@ -117,12 +117,14 @@
     kCookies,
   };
 
-  // Similar to IsFullCookieAccessAllowed(GURL, GURL) but provides a mechanism
-  // to specify a separate `site_for_cookies`, which is used to determine
-  // whether a request is in a third_party context and `top_frame_origin`, which
-  // is used to check if there are any content_settings exceptions.
-  // `top_frame_origin` should at least be specified when `site_for_cookies` is
-  // non-empty.
+  // Returns true if the page identified by (`url`, `site_for_cookies`,
+  // `top_frame_origin`) is allowed to access (i.e., read or write) cookies.
+  // `site_for_cookies` is used to determine third-party-ness of `url`.
+  // `top_frame_origin` is used to check if there are any content_settings
+  // exceptions. `top_frame_origin` should at least be specified when
+  // `site_for_cookies` is non-empty.
+  //
+  // This may be called on any thread.
   bool IsFullCookieAccessAllowed(
       const GURL& url,
       const net::SiteForCookies& site_for_cookies,
diff --git a/components/history_clusters/core/on_device_clustering_backend.cc b/components/history_clusters/core/on_device_clustering_backend.cc
index 701bf80..07e841d 100644
--- a/components/history_clusters/core/on_device_clustering_backend.cc
+++ b/components/history_clusters/core/on_device_clustering_backend.cc
@@ -42,11 +42,56 @@
 
 namespace {
 
+void RecordEntityIdGatheringTime(base::TimeDelta time_delta) {
+  base::UmaHistogramTimes(
+      "History.Clusters.Backend.EntityIdGathering.ThreadTime", time_delta);
+}
+
 void RecordBatchUpdateProcessingTime(base::TimeDelta time_delta) {
   base::UmaHistogramTimes(
       "History.Clusters.Backend.ProcessBatchOfVisits.ThreadTime", time_delta);
 }
 
+using EntityMetadataProcessedCallback = base::OnceCallback<void(
+    std::vector<history::Cluster>,
+    base::flat_map<std::string, optimization_guide::EntityMetadata>)>;
+// Processes `entity_metadata_map` and rewrites `clusters` with valid entity
+// metadata. Invokes `callback` with rewritten clusters synchronously when
+// done.
+void ProcessEntityMetadata(
+    EntityMetadataProcessedCallback callback,
+    std::vector<history::Cluster> clusters,
+    base::flat_map<std::string, optimization_guide::EntityMetadata>
+        entity_metadata_map) {
+  // Prune out entities that do not meet the relevance threshold or are not in
+  // the most updated mapping.
+  base::flat_map<std::string, optimization_guide::EntityMetadata>
+      processed_entity_metadata_map;
+  for (auto& cluster : clusters) {
+    for (auto& visit : cluster.visits) {
+      auto entity_it = visit.annotated_visit.content_annotations
+                           .model_annotations.entities.begin();
+      while (entity_it != visit.annotated_visit.content_annotations
+                              .model_annotations.entities.end()) {
+        auto entity_metadata_it = entity_metadata_map.find(entity_it->id);
+        if (entity_metadata_it == entity_metadata_map.end() ||
+            entity_it->weight < GetConfig().entity_relevance_threshold) {
+          entity_it = visit.annotated_visit.content_annotations
+                          .model_annotations.entities.erase(entity_it);
+          continue;
+        }
+
+        processed_entity_metadata_map[entity_it->id] =
+            entity_metadata_it->second;
+        entity_it++;
+      }
+    }
+  }
+
+  std::move(callback).Run(std::move(clusters),
+                          std::move(processed_entity_metadata_map));
+}
+
 }  // namespace
 
 OnDeviceClusteringBackend::OnDeviceClusteringBackend(
@@ -102,46 +147,113 @@
     return;
   }
 
-  // Just start clustering without getting entity metadata if we don't have a
-  // provider to translate the entities.
-  if (!entity_metadata_provider_) {
-    OnBatchEntityMetadataRetrieved(
-        clustering_request_source, /*completed_task=*/nullptr, visits,
-        /*entity_metadata_start=*/absl::nullopt, std::move(callback),
-        /*entity_metadata_map=*/{});
-    return;
-  }
-
   base::ElapsedThreadTimer entity_id_gathering_timer;
-
-  // Figure out what entity IDs we need to fetch metadata for.
   base::flat_set<std::string> entity_ids;
   for (const auto& visit : visits) {
     for (const auto& entity :
          visit.content_annotations.model_annotations.entities) {
-      // Remove entities that are on the keyword blocklist.
-      if (mid_blocklist_.find(entity.id) != mid_blocklist_.end()) {
-        continue;
+      if (ShouldRetrieveEntityMetadataForEntity(entity)) {
+        entity_ids.insert(entity.id);
       }
-      // Only put the entity IDs in if they exceed a certain threshold.
-      if (entity.weight < GetConfig().entity_relevance_threshold) {
-        continue;
-      }
-      entity_ids.insert(entity.id);
     }
   }
+  RecordEntityIdGatheringTime(entity_id_gathering_timer.Elapsed());
 
-  base::UmaHistogramTimes(
-      "History.Clusters.Backend.EntityIdGathering.ThreadTime",
-      entity_id_gathering_timer.Elapsed());
+  RetrieveBatchEntityMetadata(
+      std::move(entity_ids),
+      base::BindOnce(&OnDeviceClusteringBackend::ProcessVisits,
+                     weak_ptr_factory_.GetWeakPtr(), clustering_request_source,
+                     std::move(visits), std::move(callback)));
+}
 
-  // Don't bother with getting entity metadata if there's nothing to get
-  // metadata for.
-  if (entity_ids.empty()) {
+void OnDeviceClusteringBackend::GetClustersForUI(
+    ClustersCallback callback,
+    std::vector<history::Cluster> clusters) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  if (clusters.empty()) {
+    std::move(callback).Run({});
+    return;
+  }
+
+  base::flat_set<std::string> entity_ids = GetEntityIdsForClusters(clusters);
+  EntityMetadataProcessedCallback entity_metadata_processed_callback =
+      base::BindOnce(&OnDeviceClusteringBackend::
+                         DispatchGetClustersForUIToBackgroundThread,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback));
+  RetrieveBatchEntityMetadata(
+      std::move(entity_ids),
+      base::BindOnce(&ProcessEntityMetadata,
+                     std::move(entity_metadata_processed_callback),
+                     std::move(clusters)));
+}
+
+void OnDeviceClusteringBackend::GetClusterTriggerability(
+    ClustersCallback callback,
+    std::vector<history::Cluster> clusters) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  if (clusters.empty()) {
+    std::move(callback).Run({});
+    return;
+  }
+
+  base::flat_set<std::string> entity_ids = GetEntityIdsForClusters(clusters);
+  EntityMetadataProcessedCallback entity_metadata_processed_callback =
+      base::BindOnce(&OnDeviceClusteringBackend::
+                         DispatchGetClusterTriggerabilityToBackgroundThread,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback));
+  RetrieveBatchEntityMetadata(
+      std::move(entity_ids),
+      base::BindOnce(&ProcessEntityMetadata,
+                     std::move(entity_metadata_processed_callback),
+                     std::move(clusters)));
+}
+
+base::flat_set<std::string> OnDeviceClusteringBackend::GetEntityIdsForClusters(
+    const std::vector<history::Cluster>& clusters) {
+  base::ElapsedThreadTimer entity_id_gathering_timer;
+  base::flat_set<std::string> entity_ids;
+  for (const auto& cluster : clusters) {
+    for (const auto& visit : cluster.visits) {
+      for (const auto& entity : visit.annotated_visit.content_annotations
+                                    .model_annotations.entities) {
+        if (ShouldRetrieveEntityMetadataForEntity(entity)) {
+          entity_ids.insert(entity.id);
+        }
+      }
+    }
+  }
+  RecordEntityIdGatheringTime(entity_id_gathering_timer.Elapsed());
+
+  return entity_ids;
+}
+
+bool OnDeviceClusteringBackend::ShouldRetrieveEntityMetadataForEntity(
+    const history::VisitContentModelAnnotations::Category& entity) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  // Remove entities that are on the keyword blocklist.
+  if (mid_blocklist_.find(entity.id) != mid_blocklist_.end()) {
+    return false;
+  }
+  // Only put the entity IDs in if they exceed a certain threshold.
+  if (entity.weight < GetConfig().entity_relevance_threshold) {
+    return false;
+  }
+  return true;
+}
+
+void OnDeviceClusteringBackend::RetrieveBatchEntityMetadata(
+    base::flat_set<std::string> entity_ids,
+    EntityRetrievedCallback entity_retrieved_callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  if (!entity_metadata_provider_ || entity_ids.empty()) {
     OnBatchEntityMetadataRetrieved(
-        clustering_request_source, /*completed_task=*/nullptr,
-        std::move(visits),
-        /*entity_metadata_start=*/absl::nullopt, std::move(callback),
+        /*completed_task=*/nullptr,
+        /*entity_metadata_start=*/absl::nullopt,
+        std::move(entity_retrieved_callback),
         /*entity_metadata_map=*/{});
     return;
   }
@@ -156,53 +268,16 @@
   auto* batch_entity_metadata_task_ptr = batch_entity_metadata_task.get();
   in_flight_batch_entity_metadata_tasks_.insert(
       std::move(batch_entity_metadata_task));
-  batch_entity_metadata_task_ptr->Execute(
-      base::BindOnce(&OnDeviceClusteringBackend::OnBatchEntityMetadataRetrieved,
-                     weak_ptr_factory_.GetWeakPtr(), clustering_request_source,
-                     batch_entity_metadata_task_ptr, std::move(visits),
-                     base::TimeTicks::Now(), std::move(callback)));
-}
-
-void OnDeviceClusteringBackend::GetClustersForUI(
-    ClustersCallback callback,
-    std::vector<history::Cluster> clusters) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  // TODO(b/259466296): Fetch entity metadata before computing clusters.
-  base::flat_map<std::string, optimization_guide::EntityMetadata>
-      entity_metadata_map;
-  user_visible_priority_background_task_runner_->PostTaskAndReplyWithResult(
-      FROM_HERE,
-      base::BindOnce(
-          &OnDeviceClusteringBackend::GetClustersForUIOnBackgroundThread,
-          std::move(clusters), base::OwnedRef(std::move(entity_metadata_map))),
-      std::move(callback));
-}
-
-void OnDeviceClusteringBackend::GetClusterTriggerability(
-    ClustersCallback callback,
-    std::vector<history::Cluster> clusters) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  // TODO(b/259466296): Fetch entity metadata before computing cluster
-  // triggerability.
-  base::flat_map<std::string, optimization_guide::EntityMetadata>
-      entity_metadata_map;
-  best_effort_priority_background_task_runner_->PostTaskAndReplyWithResult(
-      FROM_HERE,
-      base::BindOnce(&OnDeviceClusteringBackend::
-                         GetClusterTriggerabilityOnBackgroundThread,
-                     engagement_score_provider_ != nullptr, std::move(clusters),
-                     base::OwnedRef(std::move(entity_metadata_map))),
-      std::move(callback));
+  batch_entity_metadata_task_ptr->Execute(base::BindOnce(
+      &OnDeviceClusteringBackend::OnBatchEntityMetadataRetrieved,
+      weak_ptr_factory_.GetWeakPtr(), batch_entity_metadata_task_ptr,
+      base::TimeTicks::Now(), std::move(entity_retrieved_callback)));
 }
 
 void OnDeviceClusteringBackend::OnBatchEntityMetadataRetrieved(
-    ClusteringRequestSource clustering_request_source,
     optimization_guide::BatchEntityMetadataTask* completed_task,
-    std::vector<history::AnnotatedVisit> annotated_visits,
     absl::optional<base::TimeTicks> entity_metadata_start,
-    ClustersCallback callback,
+    EntityRetrievedCallback entity_retrieved_callback,
     const base::flat_map<std::string, optimization_guide::EntityMetadata>&
         entity_metadata_map) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -213,25 +288,23 @@
         base::TimeTicks::Now() - *entity_metadata_start);
   }
 
-  if (base::TimeTicks::Now() >
-      (engagement_score_cache_last_refresh_timestamp_ +
-       GetConfig().engagement_score_cache_refresh_duration)) {
-    engagement_score_cache_.Clear();
-    engagement_score_cache_last_refresh_timestamp_ = base::TimeTicks::Now();
-  }
+  std::move(entity_retrieved_callback).Run(entity_metadata_map);
 
-  ProcessVisits(clustering_request_source, completed_task,
-                std::move(annotated_visits), entity_metadata_start,
-                std::move(callback), entity_metadata_map);
+  // Mark the task as completed, as we are done with it and have moved
+  // everything adequately at this point.
+  if (completed_task) {
+    auto it = in_flight_batch_entity_metadata_tasks_.find(completed_task);
+    if (it != in_flight_batch_entity_metadata_tasks_.end()) {
+      in_flight_batch_entity_metadata_tasks_.erase(it);
+    }
+  }
 }
 
 void OnDeviceClusteringBackend::ProcessVisits(
     ClusteringRequestSource clustering_request_source,
-    optimization_guide::BatchEntityMetadataTask* completed_task,
     std::vector<history::AnnotatedVisit> annotated_visits,
-    absl::optional<base::TimeTicks> entity_metadata_start,
     ClustersCallback callback,
-    const base::flat_map<std::string, optimization_guide::EntityMetadata>&
+    base::flat_map<std::string, optimization_guide::EntityMetadata>
         entity_metadata_map) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
@@ -307,28 +380,18 @@
 
   RecordBatchUpdateProcessingTime(process_batch_timer.Elapsed());
   OnAllVisitsFinishedProcessing(
-      clustering_request_source, completed_task, std::move(cluster_visits),
+      clustering_request_source, std::move(cluster_visits),
       std::move(entity_id_to_metadata_map), std::move(callback));
 }
 
 void OnDeviceClusteringBackend::OnAllVisitsFinishedProcessing(
     ClusteringRequestSource clustering_request_source,
-    optimization_guide::BatchEntityMetadataTask* completed_task,
     std::vector<history::ClusterVisit> cluster_visits,
     base::flat_map<std::string, optimization_guide::EntityMetadata>
         entity_id_to_metadata_map,
     ClustersCallback callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  // Mark the task as completed, as we are done with it and have moved
-  // everything adequately at this point.
-  if (completed_task) {
-    auto it = in_flight_batch_entity_metadata_tasks_.find(completed_task);
-    if (it != in_flight_batch_entity_metadata_tasks_.end()) {
-      in_flight_batch_entity_metadata_tasks_.erase(it);
-    }
-  }
-
   // Post the actual clustering work onto the thread pool, then reply on the
   // calling sequence. This is to prevent UI jank.
 
@@ -350,6 +413,38 @@
   }
 }
 
+void OnDeviceClusteringBackend::DispatchGetClustersForUIToBackgroundThread(
+    ClustersCallback callback,
+    std::vector<history::Cluster> clusters,
+    base::flat_map<std::string, optimization_guide::EntityMetadata>
+        entity_metadata_map) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  user_visible_priority_background_task_runner_->PostTaskAndReplyWithResult(
+      FROM_HERE,
+      base::BindOnce(
+          &OnDeviceClusteringBackend::GetClustersForUIOnBackgroundThread,
+          std::move(clusters), base::OwnedRef(std::move(entity_metadata_map))),
+      std::move(callback));
+}
+
+void OnDeviceClusteringBackend::
+    DispatchGetClusterTriggerabilityToBackgroundThread(
+        ClustersCallback callback,
+        std::vector<history::Cluster> clusters,
+        base::flat_map<std::string, optimization_guide::EntityMetadata>
+            entity_metadata_map) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  best_effort_priority_background_task_runner_->PostTaskAndReplyWithResult(
+      FROM_HERE,
+      base::BindOnce(&OnDeviceClusteringBackend::
+                         GetClusterTriggerabilityOnBackgroundThread,
+                     engagement_score_provider_ != nullptr, std::move(clusters),
+                     base::OwnedRef(std::move(entity_metadata_map))),
+      std::move(callback));
+}
+
 // static
 std::vector<history::Cluster>
 OnDeviceClusteringBackend::ClusterVisitsOnBackgroundThread(
diff --git a/components/history_clusters/core/on_device_clustering_backend.h b/components/history_clusters/core/on_device_clustering_backend.h
index df2289c6..8faf929d 100644
--- a/components/history_clusters/core/on_device_clustering_backend.h
+++ b/components/history_clusters/core/on_device_clustering_backend.h
@@ -56,39 +56,67 @@
       std::vector<history::Cluster> clusters) override;
 
  private:
+  // Returns the unique set of entity IDs that were annotated for the visits in
+  // `clusters`.
+  base::flat_set<std::string> GetEntityIdsForClusters(
+      const std::vector<history::Cluster>& clusters);
+
+  // Whether to retrieve entity metadata for `entity`.
+  bool ShouldRetrieveEntityMetadataForEntity(
+      const history::VisitContentModelAnnotations::Category& entity);
+
+  using EntityRetrievedCallback = base::OnceCallback<void(
+      base::flat_map<std::string, optimization_guide::EntityMetadata>)>;
+  // Retrieves batch entity metadata for `entity_ids` and later invokes
+  // `entity_retrieved_callback` once the metadata has been retrieved.
+  void RetrieveBatchEntityMetadata(
+      base::flat_set<std::string> entity_ids,
+      EntityRetrievedCallback entity_retrieved_callback);
+
   // Callback invoked when batch entity metadata has been received from
-  // `completed_task`. This will normalize `annotated_visits` and proceed to
-  // cluster them after normalization.
+  // `completed_task`. Will invoke `entity_retrieved_callback` with
+  // `entity_metadata_map` after metrics collected.
   void OnBatchEntityMetadataRetrieved(
-      ClusteringRequestSource clustering_request_source,
       optimization_guide::BatchEntityMetadataTask* completed_task,
-      std::vector<history::AnnotatedVisit> annotated_visits,
       absl::optional<base::TimeTicks> entity_metadata_start,
-      ClustersCallback callback,
+      EntityRetrievedCallback entity_retrieved_callback,
       const base::flat_map<std::string, optimization_guide::EntityMetadata>&
           entity_metadata_map);
 
-  // ProcessVisits adds additional metadata that might be used for clustering or
+  // Adds additional metadata that might be used for clustering or
   // Journeys to each visit in `annotated_visits`, such as human-readable
   // entities and categories, site engagement, etc.
   void ProcessVisits(
       ClusteringRequestSource clustering_request_source,
-      optimization_guide::BatchEntityMetadataTask* completed_task,
       std::vector<history::AnnotatedVisit> annotated_visits,
-      absl::optional<base::TimeTicks> entity_metadata_start,
       ClustersCallback callback,
-      const base::flat_map<std::string, optimization_guide::EntityMetadata>&
+      base::flat_map<std::string, optimization_guide::EntityMetadata>
           entity_metadata_map);
 
   // Called when all visits have been processed.
   void OnAllVisitsFinishedProcessing(
       ClusteringRequestSource clustering_request_source,
-      optimization_guide::BatchEntityMetadataTask* completed_task,
       std::vector<history::ClusterVisit> cluster_visits,
       base::flat_map<std::string, optimization_guide::EntityMetadata>
           entity_id_to_entity_metadata_map,
       ClustersCallback callback);
 
+  // Dispatches call to `GetClustersForUIOnBackgroundThread()` from the main
+  // thread.
+  void DispatchGetClustersForUIToBackgroundThread(
+      ClustersCallback callback,
+      std::vector<history::Cluster> clusters,
+      base::flat_map<std::string, optimization_guide::EntityMetadata>
+          entity_metadata_map);
+
+  // Dispatches call to `GetClusterTriggerabilityOnBackgroundThread()` from the
+  // main thread.
+  void DispatchGetClusterTriggerabilityToBackgroundThread(
+      ClustersCallback callback,
+      std::vector<history::Cluster> clusters,
+      base::flat_map<std::string, optimization_guide::EntityMetadata>
+          entity_metadata_map);
+
   // Clusters `visits` on background thread.
   static std::vector<history::Cluster> ClusterVisitsOnBackgroundThread(
       bool engagement_score_provider_is_valid,
diff --git a/components/history_clusters/core/on_device_clustering_backend_unittest.cc b/components/history_clusters/core/on_device_clustering_backend_unittest.cc
index eff50e2f..24d4753 100644
--- a/components/history_clusters/core/on_device_clustering_backend_unittest.cc
+++ b/components/history_clusters/core/on_device_clustering_backend_unittest.cc
@@ -584,6 +584,86 @@
           testing::VisitResult(2, 1.0), testing::VisitResult(10, 0.5))));
 }
 
+TEST_F(OnDeviceClusteringWithContentBackendTest, GetClustersForUIWithContent) {
+  std::vector<history::Cluster> clusters;
+
+  history::Cluster cluster1;
+  history::AnnotatedVisit visit = testing::CreateDefaultAnnotatedVisit(
+      1, GURL("https://github.com/"), base::Time::FromTimeT(1));
+  visit.content_annotations.model_annotations.entities = {{"github", 100}};
+  cluster1.visits.push_back(testing::CreateClusterVisit(visit));
+
+  history::AnnotatedVisit visit2 = testing::CreateDefaultAnnotatedVisit(
+      2, GURL("https://google.com/"), base::Time::FromTimeT(2));
+  visit2.content_annotations.model_annotations.entities = {{"github", 100}};
+  visit2.referring_visit_of_redirect_chain_start = 1;
+  // Set the visit duration to be 2x the default so it has the same duration
+  // after |visit| and |visit4| are deduped.
+  visit2.visit_row.visit_duration = base::Seconds(20);
+  cluster1.visits.push_back(testing::CreateClusterVisit(visit2));
+
+  history::AnnotatedVisit visit4 = testing::CreateDefaultAnnotatedVisit(
+      4, GURL("https://github.com/"), base::Time::FromTimeT(4));
+  visit4.content_annotations.model_annotations.entities = {{"github", 100}};
+  cluster1.visits.push_back(testing::CreateClusterVisit(visit4));
+  clusters.push_back(cluster1);
+
+  // After the context clustering, visit5 will not be in the same cluster as
+  // visit, visit2, and visit4 but all of the visits have the same entities
+  // so they will be clustered in the content pass.
+  history::Cluster cluster2;
+  history::AnnotatedVisit visit5 = testing::CreateDefaultAnnotatedVisit(
+      10,
+      GURL("https://shouldskip.com/butnotsincehostcheckingisfalse/"
+           "andhasnonexistentreferrer"),
+      base::Time::FromTimeT(10));
+  visit5.content_annotations.model_annotations.entities = {{"github", 100}};
+  visit5.referring_visit_of_redirect_chain_start = 6;
+  cluster2.visits.push_back(testing::CreateClusterVisit(visit5));
+  clusters.push_back(cluster2);
+
+  std::vector<history::Cluster> result_clusters = GetClustersForUI(clusters);
+  EXPECT_THAT(
+      testing::ToVisitResults(result_clusters),
+      ElementsAre(ElementsAre(
+          testing::VisitResult(4, 1.0, {history::DuplicateClusterVisit{1}}),
+          testing::VisitResult(2, 1.0), testing::VisitResult(10, 0.5))));
+}
+
+TEST_F(OnDeviceClusteringWithContentBackendTest,
+       GetClusterTriggerabilityWithContent) {
+  std::vector<history::Cluster> clusters;
+
+  history::Cluster cluster1;
+  history::AnnotatedVisit visit = testing::CreateDefaultAnnotatedVisit(
+      1, GURL("https://github.com/"), base::Time::FromTimeT(1));
+  visit.content_annotations.model_annotations.entities = {{"github", 100},
+                                                          {"scoretoolow", 10}};
+  cluster1.visits.push_back(testing::CreateClusterVisit(visit));
+
+  history::AnnotatedVisit visit2 = testing::CreateDefaultAnnotatedVisit(
+      2, GURL("https://google.com/"), base::Time::FromTimeT(2));
+  visit2.content_annotations.model_annotations.entities = {{"github", 100}};
+  visit2.referring_visit_of_redirect_chain_start = 1;
+  // Set the visit duration to be 2x the default so it has the same duration
+  // after |visit| and |visit4| are deduped.
+  visit2.visit_row.visit_duration = base::Seconds(20);
+  cluster1.visits.push_back(testing::CreateClusterVisit(visit2));
+
+  history::AnnotatedVisit visit4 = testing::CreateDefaultAnnotatedVisit(
+      4, GURL("https://github.com/"), base::Time::FromTimeT(4));
+  visit4.content_annotations.model_annotations.entities = {{"github", 100},
+                                                           {"nometadata", 100}};
+  cluster1.visits.push_back(testing::CreateClusterVisit(visit4));
+  clusters.push_back(cluster1);
+
+  std::vector<history::Cluster> result_clusters =
+      GetClusterTriggerability(clusters);
+  EXPECT_THAT(result_clusters.size(), 1u);
+  EXPECT_THAT(result_clusters[0].GetKeywords(),
+              UnorderedElementsAre(u"alias-github", u"rewritten-github"));
+}
+
 TEST_F(OnDeviceClusteringWithContentBackendTest,
        ClusterOnContentBelowThreshold) {
   base::HistogramTester histogram_tester;
diff --git a/components/omnibox/browser/base_search_provider_unittest.cc b/components/omnibox/browser/base_search_provider_unittest.cc
index ff6d8f5..fedb3b0 100644
--- a/components/omnibox/browser/base_search_provider_unittest.cc
+++ b/components/omnibox/browser/base_search_provider_unittest.cc
@@ -27,6 +27,7 @@
 #include "components/search_engines/template_url_service_client.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/omnibox_proto/entity_info.pb.h"
 
 namespace {
 
@@ -37,6 +38,9 @@
     const std::string& additional_query_params,
     int relevance,
     bool should_prerender) {
+  omnibox::EntityInfo entity_info;
+  entity_info.set_suggest_search_parameters(additional_query_params);
+
   return SearchSuggestionParser::SuggestResult(
       /*suggestion=*/query,
       /*type=*/type,
@@ -44,11 +48,8 @@
       /*match_contents=*/query,
       /*match_contents_prefix=*/u"",
       /*annotation=*/std::u16string(),
-      /*additional_query_params=*/additional_query_params,
-      /*entity_id=*/"",
+      /*entity_info=*/entity_info,
       /*deletion_url=*/std::string(),
-      /*image_dominant_color=*/std::string(),
-      /*image_url=*/std::string(),
       /*from_keyword=*/false,
       /*relevance=*/relevance,
       /*relevance_from_server=*/true,
diff --git a/components/omnibox/browser/omnibox.mojom b/components/omnibox/browser/omnibox.mojom
index 0f95fc1b..87fcef5 100644
--- a/components/omnibox/browser/omnibox.mojom
+++ b/components/omnibox/browser/omnibox.mojom
@@ -146,4 +146,6 @@
   AutocompleteResultChanged(AutocompleteResult result);
   // Updates the WebUI omnibox with the autocomplete results.
   OmniboxAutocompleteResultChanged(AutocompleteResult result);
+  // Selects the match located at |line|.
+  SelectMatchAtLine(uint8 line);
 };
diff --git a/components/omnibox/browser/search_suggestion_parser.cc b/components/omnibox/browser/search_suggestion_parser.cc
index 11c7ad7..19e0773 100644
--- a/components/omnibox/browser/search_suggestion_parser.cc
+++ b/components/omnibox/browser/search_suggestion_parser.cc
@@ -239,11 +239,8 @@
                     suggestion,
                     /*match_contents_prefix=*/std::u16string(),
                     /*annotation=*/std::u16string(),
-                    /*additional_query_params=*/"",
-                    /*entity_id=*/"",
+                    /*entity_info=*/omnibox::EntityInfo(),
                     /*deletion_url=*/"",
-                    /*image_dominant_color=*/"",
-                    /*image_url=*/"",
                     from_keyword,
                     relevance,
                     relevance_from_server,
@@ -258,11 +255,8 @@
     const std::u16string& match_contents,
     const std::u16string& match_contents_prefix,
     const std::u16string& annotation,
-    const std::string& additional_query_params,
-    const std::string& entity_id,
+    const omnibox::EntityInfo& entity_info,
     const std::string& deletion_url,
-    const std::string& image_dominant_color,
-    const std::string& image_url,
     bool from_keyword,
     int relevance,
     bool relevance_from_server,
@@ -277,14 +271,16 @@
              deletion_url),
       suggestion_(suggestion),
       match_contents_prefix_(match_contents_prefix),
-      annotation_(annotation),
-      additional_query_params_(additional_query_params),
-      entity_id_(entity_id),
-      image_dominant_color_(image_dominant_color),
-      image_url_(GURL(image_url)),
+      image_url_(GURL(entity_info.image_url())),
+      entity_info_(entity_info),
       should_prefetch_(should_prefetch),
       should_prerender_(should_prerender) {
-  match_contents_ = match_contents;
+  annotation_ = !entity_info.annotation().empty()
+                    ? base::UTF8ToUTF16(entity_info.annotation())
+                    : annotation;
+  match_contents_ = !entity_info.name().empty()
+                        ? base::UTF8ToUTF16(entity_info.name())
+                        : match_contents;
   DCHECK(!match_contents_.empty());
   ClassifyMatchContents(true, input_text);
 }
@@ -827,11 +823,6 @@
               FindStringKeyOrEmpty(suggestion_detail, "zae"));
         }
 
-        if (!entity_info.annotation().empty())
-          annotation = base::UTF8ToUTF16(entity_info.annotation());
-        if (!entity_info.name().empty())
-          match_contents = base::UTF8ToUTF16(entity_info.name());
-
         match_contents_prefix =
             base::UTF8ToUTF16(FindStringKeyOrEmpty(suggestion_detail, "mp"));
 
@@ -860,9 +851,7 @@
       results->suggest_results.push_back(SuggestResult(
           suggestion, match_type, subtypes[index],
           base::CollapseWhitespace(match_contents, false),
-          match_contents_prefix, annotation,
-          entity_info.suggest_search_parameters(), entity_info.entity_id(),
-          deletion_url, entity_info.dominant_color(), entity_info.image_url(),
+          match_contents_prefix, annotation, entity_info, deletion_url,
           is_keyword_result, relevance, relevances != nullptr, should_prefetch,
           should_prerender, trimmed_input));
 
diff --git a/components/omnibox/browser/search_suggestion_parser.h b/components/omnibox/browser/search_suggestion_parser.h
index 6be4ba6..9fe4c1f 100644
--- a/components/omnibox/browser/search_suggestion_parser.h
+++ b/components/omnibox/browser/search_suggestion_parser.h
@@ -18,6 +18,7 @@
 #include "components/omnibox/browser/suggestion_group_util.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/metrics_proto/chrome_searchbox_stats.pb.h"
+#include "third_party/omnibox_proto/entity_info.pb.h"
 #include "third_party/omnibox_proto/types.pb.h"
 #include "url/gurl.h"
 
@@ -143,11 +144,8 @@
                   const std::u16string& match_contents,
                   const std::u16string& match_contents_prefix,
                   const std::u16string& annotation,
-                  const std::string& additional_query_params,
-                  const std::string& entity_id,
+                  const omnibox::EntityInfo& entity_info,
                   const std::string& deletion_url,
-                  const std::string& image_dominant_color,
-                  const std::string& image_url,
                   bool from_keyword,
                   int relevance,
                   bool relevance_from_server,
@@ -164,10 +162,13 @@
       return match_contents_prefix_;
     }
     const std::u16string& annotation() const { return annotation_; }
+    // Optional additional parameters to be added to the search URL.
     const std::string& additional_query_params() const {
-      return additional_query_params_;
+      return entity_info_.suggest_search_parameters();
     }
-    const std::string& entity_id() const { return entity_id_; }
+    // Optional entity id for entity suggestions. Empty string means no entity
+    // ID.
+    const std::string& entity_id() const { return entity_info_.entity_id(); }
 
     void set_suggestion_group_id(
         absl::optional<omnibox::GroupId> suggestion_group_id) {
@@ -180,8 +181,11 @@
     void SetAnswer(const SuggestionAnswer& answer);
     const absl::optional<SuggestionAnswer>& answer() const { return answer_; }
 
+    // Optional image information. Used for entity suggestions. The dominant
+    // color can be used to paint the image placeholder while fetching the
+    // image.
     const std::string& image_dominant_color() const {
-      return image_dominant_color_;
+      return entity_info_.dominant_color();
     }
     const GURL& image_url() const { return image_url_; }
 
@@ -214,13 +218,6 @@
     // separately to facilitate different formatting.
     std::u16string annotation_;
 
-    // Optional additional parameters to be added to the search URL.
-    std::string additional_query_params_;
-
-    // Optional entity id for entity suggestions. Empty string means no entity
-    // ID.
-    std::string entity_id_;
-
     // The optional suggestion group ID used to look up the suggestion group
     // config for the group this suggestion belongs to from the server response.
     absl::optional<omnibox::GroupId> suggestion_group_id_;
@@ -228,12 +225,11 @@
     // Optional short answer to the input that produced this suggestion.
     absl::optional<SuggestionAnswer> answer_;
 
-    // Optional image information. Used for entity suggestions. The dominant
-    // color can be used to paint the image placeholder while fetching the
-    // image.
-    std::string image_dominant_color_;
     GURL image_url_;
 
+    // Proto containing various pieces of data related to entity suggestions.
+    omnibox::EntityInfo entity_info_;
+
     // Should this result be prefetched?
     bool should_prefetch_;
 
diff --git a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm
index ae3ca66..c8ddc72e 100644
--- a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm
+++ b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm
@@ -1033,12 +1033,6 @@
 
   NotifyVisibilityChangeDown();
   host_->OnVisibilityChanged(window_visible_);
-
-  // Toolkit-views suppresses redraws while not visible. To prevent Cocoa asking
-  // for an "empty" draw, disable auto-display while hidden. For example, this
-  // prevents Cocoa drawing just *after* a minimize, resulting in a blank window
-  // represented in the deminiaturize animation.
-  [window_ setAutodisplay:window_visible_];
 }
 
 void NativeWidgetNSWindowBridge::OnSystemControlTintChanged() {
diff --git a/content/browser/service_worker/service_worker_clients_api_browsertest.cc b/content/browser/service_worker/service_worker_clients_api_browsertest.cc
index 563fbb5f..e95093b5 100644
--- a/content/browser/service_worker/service_worker_clients_api_browsertest.cc
+++ b/content/browser/service_worker/service_worker_clients_api_browsertest.cc
@@ -125,7 +125,7 @@
   EXPECT_EQ("navigate failed", EvalJs(shell(), "requestToNavigate();"));
 
   // The browser-initiated navigation should finish.
-  navigation.WaitForNavigationFinished();  // Resume navigation.
+  ASSERT_TRUE(navigation.WaitForNavigationFinished());  // Resume navigation.
   EXPECT_TRUE(navigation.was_successful());
 }
 
diff --git a/extensions/browser/BUILD.gn b/extensions/browser/BUILD.gn
index f8fb263..ef9ce47 100644
--- a/extensions/browser/BUILD.gn
+++ b/extensions/browser/BUILD.gn
@@ -108,6 +108,8 @@
     "api/declarative_net_request/composite_matcher.h",
     "api/declarative_net_request/constants.cc",
     "api/declarative_net_request/constants.h",
+    "api/declarative_net_request/declarative_net_request_prefs_helper.cc",
+    "api/declarative_net_request/declarative_net_request_prefs_helper.h",
     "api/declarative_net_request/extension_url_pattern_index_matcher.cc",
     "api/declarative_net_request/extension_url_pattern_index_matcher.h",
     "api/declarative_net_request/file_backed_ruleset_source.cc",
diff --git a/extensions/browser/api/declarative_net_request/BUILD.gn b/extensions/browser/api/declarative_net_request/BUILD.gn
index 6c03f3a..9d206f8 100644
--- a/extensions/browser/api/declarative_net_request/BUILD.gn
+++ b/extensions/browser/api/declarative_net_request/BUILD.gn
@@ -11,8 +11,6 @@
   sources = [
     "declarative_net_request_api.cc",
     "declarative_net_request_api.h",
-    "declarative_net_request_prefs_helper.cc",
-    "declarative_net_request_prefs_helper.h",
     "web_contents_helper.cc",
     "web_contents_helper.h",
   ]
diff --git a/extensions/browser/api/declarative_net_request/declarative_net_request_api.cc b/extensions/browser/api/declarative_net_request/declarative_net_request_api.cc
index 3e67741..2ebc4fa 100644
--- a/extensions/browser/api/declarative_net_request/declarative_net_request_api.cc
+++ b/extensions/browser/api/declarative_net_request/declarative_net_request_api.cc
@@ -18,6 +18,7 @@
 #include "extensions/browser/api/declarative_net_request/action_tracker.h"
 #include "extensions/browser/api/declarative_net_request/composite_matcher.h"
 #include "extensions/browser/api/declarative_net_request/constants.h"
+#include "extensions/browser/api/declarative_net_request/declarative_net_request_prefs_helper.h"
 #include "extensions/browser/api/declarative_net_request/file_backed_ruleset_source.h"
 #include "extensions/browser/api/declarative_net_request/request_params.h"
 #include "extensions/browser/api/declarative_net_request/rules_monitor_service.h"
@@ -327,6 +328,62 @@
       ArgumentList(dnr_api::GetEnabledRulesets::Results::Create(public_ids)));
 }
 
+DeclarativeNetRequestUpdateStaticRulesFunction::
+    DeclarativeNetRequestUpdateStaticRulesFunction() = default;
+DeclarativeNetRequestUpdateStaticRulesFunction::
+    ~DeclarativeNetRequestUpdateStaticRulesFunction() = default;
+
+ExtensionFunction::ResponseAction
+DeclarativeNetRequestUpdateStaticRulesFunction::Run() {
+  using Params = dnr_api::UpdateStaticRules::Params;
+  using DNRManifestData = declarative_net_request::DNRManifestData;
+  using RulesMonitorService = declarative_net_request::RulesMonitorService;
+  using RuleIdsToUpdate = declarative_net_request::
+      DeclarativeNetRequestPrefsHelper::RuleIdsToUpdate;
+
+  std::u16string error;
+  std::unique_ptr<Params> params(Params::Create(args(), &error));
+  EXTENSION_FUNCTION_VALIDATE(params);
+  EXTENSION_FUNCTION_VALIDATE(error.empty());
+
+  const DNRManifestData::ManifestIDToRulesetMap& public_id_map =
+      DNRManifestData::GetManifestIDToRulesetMap(*extension());
+  auto it = public_id_map.find(params->options.ruleset_id);
+  if (it == public_id_map.end()) {
+    return RespondNow(Error(ErrorUtils::FormatErrorMessage(
+        declarative_net_request::kInvalidRulesetIDError,
+        params->options.ruleset_id)));
+  }
+
+  RuleIdsToUpdate rule_ids_to_update(params->options.disable_rule_ids,
+                                     params->options.enable_rule_ids);
+
+  if (rule_ids_to_update.Empty()) {
+    return RespondNow(NoArguments());
+  }
+
+  auto* rules_monitor_service = RulesMonitorService::Get(browser_context());
+  DCHECK(rules_monitor_service);
+  DCHECK(extension());
+
+  rules_monitor_service->UpdateStaticRules(
+      *extension(), it->second->id, std::move(rule_ids_to_update),
+      base::BindOnce(
+          &DeclarativeNetRequestUpdateStaticRulesFunction::OnStaticRulesUpdated,
+          this));
+
+  return did_respond() ? AlreadyResponded() : RespondLater();
+}
+
+void DeclarativeNetRequestUpdateStaticRulesFunction::OnStaticRulesUpdated(
+    absl::optional<std::string> error) {
+  if (error) {
+    Respond(Error(std::move(*error)));
+  } else {
+    Respond(NoArguments());
+  }
+}
+
 // static
 bool
     DeclarativeNetRequestGetMatchedRulesFunction::disable_throttling_for_test_ =
diff --git a/extensions/browser/api/declarative_net_request/declarative_net_request_api.h b/extensions/browser/api/declarative_net_request/declarative_net_request_api.h
index e8429e1..467a21a 100644
--- a/extensions/browser/api/declarative_net_request/declarative_net_request_api.h
+++ b/extensions/browser/api/declarative_net_request/declarative_net_request_api.h
@@ -111,6 +111,23 @@
   ExtensionFunction::ResponseAction Run() override;
 };
 
+class DeclarativeNetRequestUpdateStaticRulesFunction
+    : public ExtensionFunction {
+ public:
+  DeclarativeNetRequestUpdateStaticRulesFunction();
+  DECLARE_EXTENSION_FUNCTION("declarativeNetRequest.updateStaticRules",
+                             DECLARATIVENETREQUEST_UPDATESTATICRULES)
+
+ protected:
+  ~DeclarativeNetRequestUpdateStaticRulesFunction() override;
+
+ private:
+  void OnStaticRulesUpdated(absl::optional<std::string> error);
+
+  // ExtensionFunction override:
+  ExtensionFunction::ResponseAction Run() override;
+};
+
 class DeclarativeNetRequestGetMatchedRulesFunction : public ExtensionFunction {
  public:
   DeclarativeNetRequestGetMatchedRulesFunction();
diff --git a/extensions/browser/api/declarative_net_request/rules_monitor_service.cc b/extensions/browser/api/declarative_net_request/rules_monitor_service.cc
index 72c6c2c..9d03cce 100644
--- a/extensions/browser/api/declarative_net_request/rules_monitor_service.cc
+++ b/extensions/browser/api/declarative_net_request/rules_monitor_service.cc
@@ -344,6 +344,20 @@
       std::move(callback));
 }
 
+void RulesMonitorService::UpdateStaticRules(const Extension& extension,
+                                            RulesetID ruleset_id,
+                                            RuleIdsToUpdate rule_ids_to_update,
+                                            ApiCallback callback) {
+  // Sanity check that this is only called for an enabled extension.
+  DCHECK(extension_registry_->enabled_extensions().Contains(extension.id()));
+
+  update_enabled_rulesets_queue_map_[extension.id()].ExecuteOrQueueApiCall(
+      base::BindOnce(&RulesMonitorService::UpdateStaticRulesInternal,
+                     weak_factory_.GetWeakPtr(), extension.id(),
+                     std::move(ruleset_id), std::move(rule_ids_to_update)),
+      std::move(callback));
+}
+
 const base::Value::List& RulesMonitorService::GetSessionRulesValue(
     const ExtensionId& extension_id) const {
   static const base::NoDestructor<base::Value::List> empty_rules;
@@ -727,6 +741,51 @@
                                       std::move(load_ruleset_callback));
 }
 
+void RulesMonitorService::UpdateStaticRulesInternal(
+    const ExtensionId& extension_id,
+    RulesetID ruleset_id,
+    RuleIdsToUpdate rule_ids_to_update,
+    ApiCallback callback) {
+  const Extension* extension =
+      extension_registry_->enabled_extensions().GetByID(extension_id);
+  if (!extension) {
+    // There is no enabled extension to respond to. While this is probably a
+    // no-op, still dispatch the callback to ensure any related bookkeeping is
+    // done.
+    std::move(callback).Run(absl::nullopt /* error */);
+    return;
+  }
+
+  auto result =
+      DeclarativeNetRequestPrefsHelper(*prefs_).UpdateDisabledStaticRules(
+          extension_id, ruleset_id, rule_ids_to_update);
+
+  if (result.error) {
+    std::move(callback).Run(result.error);
+    return;
+  }
+
+  if (!result.changed) {
+    std::move(callback).Run(absl::nullopt /* error */);
+    return;
+  }
+
+  if (CompositeMatcher* matcher =
+          ruleset_manager_.GetMatcherForExtension(extension->id())) {
+    for (const auto& ruleset_matcher : matcher->matchers()) {
+      if (ruleset_matcher->id() != ruleset_id) {
+        continue;
+      }
+
+      ruleset_matcher->SetDisabledRuleIds(
+          std::move(result.disabled_rule_ids_after_update));
+      break;
+    }
+  }
+
+  std::move(callback).Run(absl::nullopt /* error */);
+}
+
 void RulesMonitorService::OnInitialRulesetsLoadedFromDisk(
     LoadRequestData load_data) {
   if (test_observer_)
@@ -809,6 +868,11 @@
       continue;
 
     static_rule_count = new_ruleset_count;
+
+    matcher->SetDisabledRuleIds(
+        DeclarativeNetRequestPrefsHelper(*prefs_).GetDisabledStaticRuleIds(
+            extension->id(), matcher->id()));
+
     matchers.push_back(std::move(matcher));
   }
 
@@ -900,6 +964,11 @@
 
     static_ruleset_count += 1;
     static_rule_count += matcher_count;
+
+    ruleset_matcher->SetDisabledRuleIds(
+        DeclarativeNetRequestPrefsHelper(*prefs_).GetDisabledStaticRuleIds(
+            extension->id(), ruleset_matcher->id()));
+
     new_matchers.push_back(std::move(ruleset_matcher));
   }
 
diff --git a/extensions/browser/api/declarative_net_request/rules_monitor_service.h b/extensions/browser/api/declarative_net_request/rules_monitor_service.h
index 8d1eebd8..d7d2ffd 100644
--- a/extensions/browser/api/declarative_net_request/rules_monitor_service.h
+++ b/extensions/browser/api/declarative_net_request/rules_monitor_service.h
@@ -18,6 +18,7 @@
 #include "base/values.h"
 #include "extensions/browser/api/declarative_net_request/action_tracker.h"
 #include "extensions/browser/api/declarative_net_request/composite_matcher.h"
+#include "extensions/browser/api/declarative_net_request/declarative_net_request_prefs_helper.h"
 #include "extensions/browser/api/declarative_net_request/global_rules_tracker.h"
 #include "extensions/browser/api/declarative_net_request/ruleset_manager.h"
 #include "extensions/browser/browser_context_keyed_api_factory.h"
@@ -100,6 +101,14 @@
                                    std::set<RulesetID> ids_to_enable,
                                    ApiCallback callback);
 
+  // Updates the set of disabled rule ids for the |ruleset_id| of the
+  // |extension| and then invokes |callback| with an optional error.
+  using RuleIdsToUpdate = DeclarativeNetRequestPrefsHelper::RuleIdsToUpdate;
+  void UpdateStaticRules(const Extension& extension,
+                         RulesetID ruleset_id,
+                         RuleIdsToUpdate rule_ids_to_update,
+                         ApiCallback callback);
+
   // Returns the list of session scoped rules for |extension_id| as a
   // base::Value::List.
   const base::Value::List& GetSessionRulesValue(
@@ -175,6 +184,12 @@
                                            std::set<RulesetID> ids_to_enable,
                                            ApiCallback callback);
 
+  // Internal helper for UpdateStaticRules.
+  void UpdateStaticRulesInternal(const ExtensionId& extension_id,
+                                 RulesetID ruleset_id,
+                                 RuleIdsToUpdate rule_ids_to_update,
+                                 ApiCallback callback);
+
   // Internal helper for UpdateSessionRules.
   void UpdateSessionRulesInternal(
       const ExtensionId& extension_id,
diff --git a/extensions/browser/api/declarative_net_request/test_utils.cc b/extensions/browser/api/declarative_net_request/test_utils.cc
index fc5f95d..4dbcd771 100644
--- a/extensions/browser/api/declarative_net_request/test_utils.cc
+++ b/extensions/browser/api/declarative_net_request/test_utils.cc
@@ -13,6 +13,7 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/json/json_file_value_serializer.h"
+#include "extensions/browser/api/declarative_net_request/composite_matcher.h"
 #include "extensions/browser/api/declarative_net_request/file_backed_ruleset_source.h"
 #include "extensions/browser/api/declarative_net_request/indexed_rule.h"
 #include "extensions/browser/api/declarative_net_request/rules_count_pair.h"
@@ -513,5 +514,29 @@
   run_loop_.Quit();
 }
 
+base::flat_set<int> GetDisabledRuleIdsFromMatcherForTesting(
+    const RulesetManager& ruleset_manager,
+    const Extension& extension,
+    const std::string& ruleset_id_string) {
+  const DNRManifestData::ManifestIDToRulesetMap& public_id_map =
+      DNRManifestData::GetManifestIDToRulesetMap(extension);
+  auto it = public_id_map.find(ruleset_id_string);
+  DCHECK(public_id_map.end() != it);
+  RulesetID ruleset_id = it->second->id;
+
+  const CompositeMatcher* composite_matcher =
+      ruleset_manager.GetMatcherForExtension(extension.id());
+  DCHECK(composite_matcher);
+
+  for (const auto& matcher : composite_matcher->matchers()) {
+    if (ruleset_id != matcher->id()) {
+      continue;
+    }
+
+    return matcher->GetDisabledRuleIdsForTesting();
+  }
+  return {};
+}
+
 }  // namespace declarative_net_request
 }  // namespace extensions
diff --git a/extensions/browser/api/declarative_net_request/test_utils.h b/extensions/browser/api/declarative_net_request/test_utils.h
index 9f272c0b..4df8b49d 100644
--- a/extensions/browser/api/declarative_net_request/test_utils.h
+++ b/extensions/browser/api/declarative_net_request/test_utils.h
@@ -150,6 +150,11 @@
   base::RunLoop run_loop_;
 };
 
+base::flat_set<int> GetDisabledRuleIdsFromMatcherForTesting(
+    const RulesetManager& ruleset_manager,
+    const Extension& extension,
+    const std::string& ruleset_id_string);
+
 }  // namespace declarative_net_request
 }  // namespace extensions
 
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index 871cdee74..e8c8c7f 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1807,6 +1807,8 @@
   AUTOFILLPRIVATE_GETIBANLIST = 1744,
   ENTERPRISE_PLATFORMKEYS_CHALLENGEKEY = 1745,
   PDFVIEWERPRIVATE_ISALLOWEDLOCALFILEACCESS = 1746,
+  DECLARATIVENETREQUEST_UPDATESTATICRULES = 1747,
+  FILEMANAGERPRIVATEINTERNAL_SEARCHFILES = 1748,
   // Last entry: Add new entries above, then run:
   // tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/extensions/common/api/declarative_net_request.idl b/extensions/common/api/declarative_net_request.idl
index e0818ff..2e95bfa 100644
--- a/extensions/common/api/declarative_net_request.idl
+++ b/extensions/common/api/declarative_net_request.idl
@@ -546,6 +546,15 @@
     DOMString[]? enableRulesetIds;
   };
 
+  dictionary UpdateStaticRulesOptions {
+    // The id corresponding to a static $(ref:Ruleset).
+    DOMString rulesetId;
+    // Set of ids corresponding to rules in the $(ref:Ruleset) to disable.
+    long[]? disableRuleIds;
+    // Set of ids corresponding to rules in the $(ref:Ruleset) to enable.
+    long[]? enableRuleIds;
+  };
+
   dictionary TabActionCountUpdate {
     // The tab for which to update the action count.
     long tabId;
@@ -647,6 +656,16 @@
     [supportsPromises] static void getEnabledRulesets(
         GetEnabledRulesetsCallback callback);
 
+    // Disables and enables individual static rules in a $(ref:Ruleset).
+    // Changes to rules belonging to a disabled $(ref:Ruleset) will take
+    // effect the next time that it becomes enabled.
+    // |callback|: Called once the update is complete. In case of an error,
+    // $(ref:runtime.lastError) will be set and no change will be made to the
+    // enabled static rules.
+    [nodoc, supportsPromises] static void updateStaticRules(
+        UpdateStaticRulesOptions options,
+        optional EmptyCallback callback);
+
     // Returns all rules matched for the extension. Callers can optionally
     // filter the list of matched rules by specifying a |filter|. This method is
     // only available to extensions with the
diff --git a/headless/BUILD.gn b/headless/BUILD.gn
index 89281da..bfae1e3 100644
--- a/headless/BUILD.gn
+++ b/headless/BUILD.gn
@@ -247,10 +247,8 @@
 
 action("gen_devtools_client_api") {
   script = "lib/browser/devtools_api/client_api_generator.py"
-  deps = [
-    ":protocol_sources",
-    "//third_party/blink/public/devtools_protocol:protocol_version",
-  ]
+  deps = [ "//third_party/blink/public/devtools_protocol:protocol_version" ]
+  public_deps = [ ":protocol_sources" ]
   inputs = [
     "$root_gen_dir/third_party/blink/public/devtools_protocol/protocol.json",
   ]
@@ -322,92 +320,11 @@
   ]
 }
 
-# Code needed in both processes. Only exposed through the |headless_renderer|
-# target and the |headless_non_renderer| component.
-source_set("headless_shared_sources") {
-  visibility = [
-    ":headless_non_renderer",
-    ":headless_renderer",
-  ]
-  defines = []
-
-  sources = [
-    "app/headless_shell_switches.cc",
-    "app/headless_shell_switches.h",
-    "lib/headless_content_client.cc",
-    "lib/headless_content_client.h",
-    "lib/headless_content_main_delegate.cc",
-    "lib/headless_content_main_delegate.h",
-    "public/headless_browser.cc",
-    "public/headless_browser.h",
-    "public/headless_export.h",
-    "public/internal/message_dispatcher.h",
-    "public/internal/value_conversions.h",
-    "public/util/error_reporter.cc",
-    "public/util/error_reporter.h",
-    "public/util/user_agent.cc",
-    "public/util/user_agent.h",
-  ]
-
-  if (headless_enable_commands) {
-    sources += [
-      "app/headless_command_switches.cc",
-      "app/headless_command_switches.h",
-    ]
-  }
-
-  sources += generated_devtools_api_headers + generated_devtools_api_sources
-
-  if (!is_fuchsia) {
-    sources += [
-      "lib/headless_crash_reporter_client.cc",
-      "lib/headless_crash_reporter_client.h",
-    ]
-  }
-
-  deps = [
-    ":gen_devtools_client_api",
-    ":version_header",
-    "//base:base_static",
-    "//components/embedder_support/origin_trials",
-    "//content/public/common",
-    "//ui/base",
-    "//url",
-  ]
-
-  if (!is_fuchsia) {
-    deps += [
-      "//components/crash/content/browser",
-      "//components/crash/core/app",
-    ]
-  }
-  if (is_win) {
-    deps += [ "//sandbox" ]
-  }
-
-  configs += [ ":inside_headless_component" ]
-  configs += [ ":headless_defines_config" ]
-
-  # TODO(caseq): this is only here because headless_content_main_delegate.cc is here.
-  # Move it to the browser-specific part.
-  if (headless_use_embedded_resources) {
-    defines += [ "HEADLESS_USE_EMBEDDED_RESOURCES" ]
-    deps += [
-      ":embedded_resource_pack_data",
-      ":embedded_resource_pack_strings",
-    ]
-    sources += [
-      "$root_gen_dir/headless/embedded_resource_pack_data.cc",
-      "$root_gen_dir/headless/embedded_resource_pack_data.h",
-      "$root_gen_dir/headless/embedded_resource_pack_strings.cc",
-      "$root_gen_dir/headless/embedded_resource_pack_strings.h",
-    ]
-  }
-}
-
 # Code that is not needed in a renderer process.
 component("headless_non_renderer") {
   sources = [
+    "app/headless_shell_switches.cc",
+    "app/headless_shell_switches.h",
     "lib/browser/directory_enumerator.cc",
     "lib/browser/directory_enumerator.h",
     "lib/browser/headless_browser_context_impl.cc",
@@ -418,6 +335,8 @@
     "lib/browser/headless_browser_impl.h",
     "lib/browser/headless_browser_main_parts.cc",
     "lib/browser/headless_browser_main_parts.h",
+    "lib/browser/headless_content_browser_client.cc",
+    "lib/browser/headless_content_browser_client.h",
     "lib/browser/headless_devtools.cc",
     "lib/browser/headless_devtools.h",
     "lib/browser/headless_devtools_agent_host_client.cc",
@@ -446,11 +365,28 @@
     "lib/browser/protocol/page_handler.h",
     "lib/browser/protocol/target_handler.cc",
     "lib/browser/protocol/target_handler.h",
+    "lib/headless_content_client.cc",
+    "lib/headless_content_client.h",
+    "lib/headless_content_main_delegate.cc",
+    "lib/headless_content_main_delegate.h",
+    "lib/renderer/headless_content_renderer_client.cc",
+    "lib/renderer/headless_content_renderer_client.h",
+    "lib/utility/headless_content_utility_client.cc",
+    "lib/utility/headless_content_utility_client.h",
+    "public/headless_browser.cc",
+    "public/headless_browser.h",
     "public/headless_browser_context.h",
     "public/headless_devtools_channel.h",
     "public/headless_devtools_client.h",
     "public/headless_devtools_target.h",
+    "public/headless_export.h",
     "public/headless_web_contents.h",
+    "public/internal/message_dispatcher.h",
+    "public/internal/value_conversions.h",
+    "public/util/error_reporter.cc",
+    "public/util/error_reporter.h",
+    "public/util/user_agent.cc",
+    "public/util/user_agent.h",
   ]
 
   if (is_mac) {
@@ -462,21 +398,15 @@
     ]
   }
 
-  if (is_linux || is_chromeos) {
-    sources += [ "lib/browser/headless_browser_main_parts_linux.cc" ]
+  if (headless_enable_commands) {
+    sources += [
+      "app/headless_command_switches.cc",
+      "app/headless_command_switches.h",
+    ]
   }
 
-  if (headless_use_policy) {
-    sources += [
-      "lib/browser/headless_pref_names.cc",
-      "lib/browser/headless_pref_names.h",
-      "lib/browser/policy/headless_browser_policy_connector.cc",
-      "lib/browser/policy/headless_browser_policy_connector.h",
-      "lib/browser/policy/headless_mode_policy.cc",
-      "lib/browser/policy/headless_mode_policy.h",
-      "lib/browser/policy/headless_policies.cc",
-      "lib/browser/policy/headless_policies.h",
-    ]
+  if (is_linux || is_chromeos) {
+    sources += [ "lib/browser/headless_browser_main_parts_linux.cc" ]
   }
 
   if (use_aura) {
@@ -494,8 +424,9 @@
     ]
   }
 
+  sources += generated_devtools_api_headers + generated_devtools_api_sources
+
   public_deps = [
-    ":headless_shared_sources",
     "//base",
     "//net",
   ]
@@ -506,56 +437,114 @@
 
   if (enable_printing) {
     public_deps += [ "//skia" ]
+    sources += [
+      "lib/renderer/headless_print_render_frame_helper_delegate.cc",
+      "lib/renderer/headless_print_render_frame_helper_delegate.h",
+    ]
   }
 
   deps = [
     ":backend_cdp_bindings",
+    ":gen_devtools_client_api",
+    ":version_header",
     ":version_header",
     "//base:base_static",
+    "//base:base_static",
+    "//build:branding_buildflags",
     "//build:branding_buildflags",
     "//build:chromeos_buildflags",
     "//components/cookie_config",
+    "//components/crash/core/common:common",
     "//components/embedder_support",
+    "//components/embedder_support:embedder_support",
+    "//components/embedder_support/origin_trials",
     "//components/keyed_service/content",
+    "//components/keyed_service/content:content",
     "//components/origin_trials:browser",
     "//components/origin_trials:common",
     "//components/os_crypt:os_crypt",
     "//components/policy:generated",
-    "//components/policy/core/browser",
+    "//components/policy/content:content",
     "//components/policy/core/common:common_constants",
     "//components/pref_registry",
+    "//components/pref_registry:pref_registry",
     "//components/prefs",
+    "//components/prefs:prefs",
     "//components/profile_metrics",
+    "//components/profile_metrics:profile_metrics",
     "//components/security_state/core",
     "//content/public/app",
+    "//content/public/app:app",
     "//content/public/browser",
+    "//content/public/browser:browser",
     "//content/public/common",
+    "//content/public/common",
+    "//content/public/renderer:renderer",
+    "//content/public/utility:utility",
+    "//printing/buildflags",
     "//printing/buildflags",
     "//services/cert_verifier/public/mojom",
     "//services/device/public/cpp/geolocation",
+    "//services/device/public/cpp/geolocation:geolocation",
     "//services/service_manager/public/cpp",
     "//third_party/inspector_protocol:crdtp",
+    "//third_party/inspector_protocol:crdtp",
+    "//ui/base",
     "//ui/base",
     "//ui/base/clipboard",
     "//ui/compositor",
+    "//ui/compositor",
     "//ui/display",
     "//ui/events/devices",
+    "//ui/events/devices:devices",
     "//ui/gfx",
     "//ui/shell_dialogs",
+    "//ui/shell_dialogs:shell_dialogs",
+    "//url",
     "//url",
   ]
 
+  if (headless_use_policy) {
+    sources += [
+      "lib/browser/headless_pref_names.cc",
+      "lib/browser/headless_pref_names.h",
+      "lib/browser/policy/headless_browser_policy_connector.cc",
+      "lib/browser/policy/headless_browser_policy_connector.h",
+      "lib/browser/policy/headless_mode_policy.cc",
+      "lib/browser/policy/headless_mode_policy.h",
+      "lib/browser/policy/headless_policies.cc",
+      "lib/browser/policy/headless_policies.h",
+    ]
+    deps += [
+      "//components/policy/content",
+      "//components/policy/core/browser",
+    ]
+  }
+
   if (enable_printing) {
     deps += [
       "//components/printing/browser",
       "//components/printing/browser/headless",
+      "//components/printing/browser/headless:headless",
+      "//components/printing/browser/print_to_pdf:print_to_pdf",
       "//components/printing/browser/print_to_pdf:print_to_pdf",
       "//components/printing/common:mojo_interfaces",
+      "//components/printing/renderer:renderer",
+      "//components/services/print_compositor",
+      "//components/services/print_compositor/public/mojom",
       "//printing",
       "//printing/mojom",
     ]
   }
 
+  if (use_ozone) {
+    deps += [ "//ui/ozone" ]
+  }
+
+  if (is_mac) {
+    sources += [ "lib/headless_content_main_delegate_mac.mm" ]
+  }
+
   if (headless_use_prefs) {
     deps += [
       "//components/origin_trials:browser",
@@ -566,26 +555,6 @@
   }
 
   if (is_component_build) {
-    sources += [
-      "lib/browser/headless_content_browser_client.cc",
-      "lib/browser/headless_content_browser_client.h",
-      "lib/renderer/headless_content_renderer_client.cc",
-      "lib/renderer/headless_content_renderer_client.h",
-      "lib/utility/headless_content_utility_client.cc",
-      "lib/utility/headless_content_utility_client.h",
-    ]
-
-    if (is_mac) {
-      sources += [ "lib/headless_content_main_delegate_mac.mm" ]
-    }
-
-    if (enable_printing) {
-      sources += [
-        "lib/renderer/headless_print_render_frame_helper_delegate.cc",
-        "lib/renderer/headless_print_render_frame_helper_delegate.h",
-      ]
-    }
-
     deps += [
       "//components/crash/core/common",
       "//components/security_state/content",
@@ -595,13 +564,6 @@
       "//v8",
     ]
 
-    if (!is_fuchsia) {
-      deps += [
-        "//components/crash/content/browser",
-        "//components/crash/core/app",
-      ]
-    }
-
     if (enable_printing) {
       deps += [
         "//components/printing/browser",
@@ -614,10 +576,21 @@
     if (headless_use_prefs) {
       deps += [ "//components/os_crypt" ]
     }
+  }
 
-    if (headless_use_policy) {
-      deps += [ "//components/policy/content" ]
-    }
+  if (!is_fuchsia) {
+    deps += [
+      "//components/crash/content/browser",
+      "//components/crash/core/app",
+    ]
+    sources += [
+      "lib/headless_crash_reporter_client.cc",
+      "lib/headless_crash_reporter_client.h",
+    ]
+  }
+
+  if (is_win) {
+    deps += [ "//sandbox" ]
   }
 
   if (is_linux || is_chromeos) {
@@ -665,10 +638,6 @@
     ]
   }
 
-  if (use_ozone) {
-    deps += [ "//ui/ozone" ]
-  }
-
   if (use_dbus) {
     defines += [ "USE_DBUS" ]
     deps += [ "//device/bluetooth" ]
@@ -678,73 +647,6 @@
   configs += [ ":headless_defines_config" ]
 }
 
-# Headless renderer is a convenience library for non component builds that
-# includes headless classes that depend on the renderer.
-if (!is_component_build) {
-  static_library("headless_renderer") {
-    defines = []
-    sources = [
-      "lib/browser/headless_web_contents_impl.cc",
-      "lib/browser/headless_web_contents_impl.h",
-      "lib/renderer/headless_content_renderer_client.cc",
-      "lib/renderer/headless_content_renderer_client.h",
-      "lib/utility/headless_content_utility_client.cc",
-      "lib/utility/headless_content_utility_client.h",
-    ]
-
-    if (is_mac) {
-      sources += [ "lib/headless_content_main_delegate_mac.mm" ]
-    }
-
-    if (enable_printing) {
-      sources += [
-        "lib/renderer/headless_print_render_frame_helper_delegate.cc",
-        "lib/renderer/headless_print_render_frame_helper_delegate.h",
-      ]
-    }
-
-    public_deps = [ ":headless_shared_sources" ]
-
-    deps = [
-      "//build:chromeos_buildflags",
-      "//components/crash/core/common",
-      "//components/security_state/content",
-      "//components/security_state/core",
-      "//content/public/app",
-      "//content/public/browser",
-      "//content/public/common",
-      "//content/public/renderer",
-      "//content/public/utility",
-      "//printing/buildflags",
-      "//third_party/blink/public:blink_headers",
-      "//ui/base",
-      "//ui/compositor",
-      "//v8",
-    ]
-    if (use_ozone) {
-      deps += [ "//ui/ozone" ]
-    }
-    if (enable_printing) {
-      deps += [
-        "//components/printing/browser/headless:headless",
-        "//components/printing/renderer",
-        "//components/services/print_compositor",
-        "//components/services/print_compositor/public/mojom",
-      ]
-    }
-    configs += [ ":headless_defines_config" ]
-    if (is_mac || is_win || is_linux || is_chromeos) {
-      deps += [ "//components/crash/core/app" ]
-    }
-  }
-} else {
-  # For component builds all dependencies are already included in the headless
-  # component.
-  group("headless_renderer") {
-    public_deps = [ ":headless_non_renderer" ]
-  }
-}
-
 group("headless_tests") {
   testonly = true
 
@@ -957,8 +859,6 @@
       "app/headless_shell_command_line.cc",
       "app/headless_shell_command_line.h",
       "app/headless_shell_switches.h",
-      "lib/browser/headless_content_browser_client.cc",
-      "lib/browser/headless_content_browser_client.h",
       "public/headless_shell.h",
     ]
     deps = [
@@ -1012,8 +912,6 @@
 
   if (!is_component_build) {
     sources += [
-      "lib/browser/headless_content_browser_client.cc",
-      "lib/browser/headless_content_browser_client.h",
       "lib/utility/headless_content_utility_client.cc",
       "lib/utility/headless_content_utility_client.h",
     ]
@@ -1035,7 +933,7 @@
   ]
 
   public_deps = [
-    ":headless_renderer",
+    ":headless_non_renderer",
     "//base",
     "//third_party/inspector_protocol:crdtp",
   ]
diff --git a/headless/lib/browser/protocol/browser_handler.cc b/headless/lib/browser/protocol/browser_handler.cc
index 0b215f8..7fac5ea5 100644
--- a/headless/lib/browser/protocol/browser_handler.cc
+++ b/headless/lib/browser/protocol/browser_handler.cc
@@ -54,7 +54,6 @@
   if (!web_contents)
     return Response::ServerError("No web contents for the given target id");
 
-  auto result = std::make_unique<base::DictionaryValue>();
   *out_window_id = web_contents->window_id();
   *out_bounds = CreateBrowserBounds(web_contents);
   return Response::Success();
diff --git a/headless/lib/browser/protocol/page_handler.cc b/headless/lib/browser/protocol/page_handler.cc
index 8440ac8..21c1fce 100644
--- a/headless/lib/browser/protocol/page_handler.cc
+++ b/headless/lib/browser/protocol/page_handler.cc
@@ -107,7 +107,6 @@
                              std::unique_ptr<PrintToPDFCallback> callback,
                              print_to_pdf::PdfPrintResult print_result,
                              scoped_refptr<base::RefCountedMemory> data) {
-  std::unique_ptr<base::DictionaryValue> response;
   if (print_result != print_to_pdf::PdfPrintResult::kPrintSuccess) {
     callback->sendFailure(Response::ServerError(
         print_to_pdf::PdfPrintResultToString(print_result)));
diff --git a/headless/public/headless_devtools_client.h b/headless/public/headless_devtools_client.h
index d9a3cbe..79da4620 100644
--- a/headless/public/headless_devtools_client.h
+++ b/headless/public/headless_devtools_client.h
@@ -8,13 +8,10 @@
 #include <memory>
 
 #include "base/containers/span.h"
+#include "base/values.h"
 #include "headless/public/headless_devtools_channel.h"
 #include "headless/public/headless_export.h"
 
-namespace base {
-class DictionaryValue;
-}  // namespace base
-
 namespace headless {
 
 namespace accessibility {
@@ -191,9 +188,8 @@
     virtual ~RawProtocolListener() {}
 
     // Returns true if the listener handled the message.
-    virtual bool OnProtocolMessage(
-        base::span<const uint8_t> json_message,
-        const base::DictionaryValue& parsed_message) = 0;
+    virtual bool OnProtocolMessage(base::span<const uint8_t> json_message,
+                                   const base::Value::Dict& parsed_message) = 0;
   };
 
   virtual void AttachToChannel(
diff --git a/ios/chrome/credential_provider_extension/ui/new_password_view_controller.mm b/ios/chrome/credential_provider_extension/ui/new_password_view_controller.mm
index 158312b5..bffdaa48 100644
--- a/ios/chrome/credential_provider_extension/ui/new_password_view_controller.mm
+++ b/ios/chrome/credential_provider_extension/ui/new_password_view_controller.mm
@@ -316,7 +316,7 @@
       stringByReplacingOccurrencesOfString:@"$2"
                                 withString:self.currentHost]
       stringByReplacingOccurrencesOfString:@"$1"
-                                withString:[self currentUsername]];
+                                withString:[self currentUsername] ?: @""];
   UIAlertController* alertController = [UIAlertController
       alertControllerWithTitle:
           NSLocalizedString(
diff --git a/media/base/demuxer.h b/media/base/demuxer.h
index 92152e3be..421b34bb 100644
--- a/media/base/demuxer.h
+++ b/media/base/demuxer.h
@@ -33,6 +33,7 @@
   kMediaUrlDemuxer,
   kFrameInjectingDemuxer,
   kStreamProviderDemuxer,
+  kHlsDemuxer,
 };
 
 class MEDIA_EXPORT DemuxerHost {
diff --git a/media/base/test_helpers.h b/media/base/test_helpers.h
index c78ef60d..127cff89 100644
--- a/media/base/test_helpers.h
+++ b/media/base/test_helpers.h
@@ -558,6 +558,10 @@
                              " frame exceeds range allowed by implementation");
 }
 
+MATCHER(HlsDemuxerCtor, "") {
+  return CONTAINS_STRING(arg, "HlsDemuxer");
+}
+
 }  // namespace media
 
 #endif  // MEDIA_BASE_TEST_HELPERS_H_
diff --git a/media/filters/BUILD.gn b/media/filters/BUILD.gn
index f2eb201..0751a3f3 100644
--- a/media/filters/BUILD.gn
+++ b/media/filters/BUILD.gn
@@ -244,6 +244,13 @@
       "h264_bitstream_buffer.h",
     ]
   }
+
+  if (enable_hls_demuxer) {
+    sources += [
+      "hls_demuxer.cc",
+      "hls_demuxer.h",
+    ]
+  }
 }
 
 source_set("perftests") {
@@ -394,6 +401,10 @@
     }
   }
 
+  if (enable_hls_demuxer) {
+    sources += [ "hls_demuxer_unittest.cc" ]
+  }
+
   if (media_use_ffmpeg) {
     # Direct dependency required to inherit config.
     deps += [ "//third_party/ffmpeg" ]
diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc
index 68cd8d4..5b15d6f 100644
--- a/media/filters/chunk_demuxer.cc
+++ b/media/filters/chunk_demuxer.cc
@@ -213,6 +213,11 @@
   return range.IntersectionWith(valid_time_range);
 }
 
+base::TimeDelta ChunkDemuxerStream::GetLowestPresentationTimestamp() const {
+  base::AutoLock auto_lock(lock_);
+  return stream_->GetLowestPresentationTimestamp();
+}
+
 base::TimeDelta ChunkDemuxerStream::GetHighestPresentationTimestamp() const {
   base::AutoLock auto_lock(lock_);
   return stream_->GetHighestPresentationTimestamp();
@@ -812,6 +817,17 @@
   return itr->second->GetBufferedRanges(duration_, state_ == ENDED);
 }
 
+base::TimeDelta ChunkDemuxer::GetLowestPresentationTimestamp(
+    const std::string& id) const {
+  base::AutoLock auto_lock(lock_);
+  DCHECK(!id.empty());
+
+  auto itr = source_state_map_.find(id);
+
+  DCHECK(itr != source_state_map_.end());
+  return itr->second->GetLowestPresentationTimestamp();
+}
+
 base::TimeDelta ChunkDemuxer::GetHighestPresentationTimestamp(
     const std::string& id) const {
   base::AutoLock auto_lock(lock_);
diff --git a/media/filters/chunk_demuxer.h b/media/filters/chunk_demuxer.h
index 9cb07af..771a56c3 100644
--- a/media/filters/chunk_demuxer.h
+++ b/media/filters/chunk_demuxer.h
@@ -90,6 +90,10 @@
   // Returns the range of buffered data in this stream, capped at |duration|.
   Ranges<base::TimeDelta> GetBufferedRanges(base::TimeDelta duration) const;
 
+  // Returns the lowest PTS of the buffered data.
+  // Returns base::TimeDelta() if the stream has no buffered data.
+  base::TimeDelta GetLowestPresentationTimestamp() const;
+
   // Returns the highest PTS of the buffered data.
   // Returns base::TimeDelta() if the stream has no buffered data.
   base::TimeDelta GetHighestPresentationTimestamp() const;
@@ -283,6 +287,10 @@
   // Gets the currently buffered ranges for the specified ID.
   Ranges<base::TimeDelta> GetBufferedRanges(const std::string& id) const;
 
+  // Gets the lowest buffered PTS for the specified |id|. If there is nothing
+  // buffered, returns base::TimeDelta().
+  base::TimeDelta GetLowestPresentationTimestamp(const std::string& id) const;
+
   // Gets the highest buffered PTS for the specified |id|. If there is nothing
   // buffered, returns base::TimeDelta().
   base::TimeDelta GetHighestPresentationTimestamp(const std::string& id) const;
diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc
index 40f06a4..15f0998 100644
--- a/media/filters/chunk_demuxer_unittest.cc
+++ b/media/filters/chunk_demuxer_unittest.cc
@@ -4578,6 +4578,115 @@
       video_id, GenerateSingleStreamCluster(0, 33, kVideoTrackNum, 33)));
 }
 
+TEST_F(ChunkDemuxerTest, GetLowestAndHighestPresentationTimestamps_NonMuxed) {
+  std::string audio_id = "audio1";
+  std::string video_id = "video1";
+
+  ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
+
+  EXPECT_EQ(base::TimeDelta(),
+            demuxer_->GetLowestPresentationTimestamp(audio_id));
+  EXPECT_EQ(base::TimeDelta(),
+            demuxer_->GetHighestPresentationTimestamp(audio_id));
+  EXPECT_EQ(base::TimeDelta(),
+            demuxer_->GetLowestPresentationTimestamp(video_id));
+  EXPECT_EQ(base::TimeDelta(),
+            demuxer_->GetHighestPresentationTimestamp(video_id));
+
+  // Append audio and video data into separate source ids.
+  AppendSingleStreamCluster(audio_id, kAudioTrackNum, "0K 10K 20D10K");
+  AppendSingleStreamCluster(video_id, kVideoTrackNum, "10K 20K 30D10K");
+  EXPECT_EQ(base::TimeDelta(),
+            demuxer_->GetLowestPresentationTimestamp(audio_id));
+  EXPECT_EQ(base::Milliseconds(20),
+            demuxer_->GetHighestPresentationTimestamp(audio_id));
+  EXPECT_EQ(base::Milliseconds(10),
+            demuxer_->GetLowestPresentationTimestamp(video_id));
+  EXPECT_EQ(base::Milliseconds(30),
+            demuxer_->GetHighestPresentationTimestamp(video_id));
+
+  // Remove the first and last audio and video frames.
+  demuxer_->Remove(audio_id, base::Milliseconds(0), base::Milliseconds(10));
+  demuxer_->Remove(audio_id, base::Milliseconds(20), base::Milliseconds(30));
+  demuxer_->Remove(video_id, base::Milliseconds(10), base::Milliseconds(20));
+  demuxer_->Remove(video_id, base::Milliseconds(30), base::Milliseconds(40));
+  EXPECT_EQ(base::Milliseconds(10),
+            demuxer_->GetLowestPresentationTimestamp(audio_id));
+  EXPECT_EQ(base::Milliseconds(10),
+            demuxer_->GetHighestPresentationTimestamp(audio_id));
+  EXPECT_EQ(base::Milliseconds(20),
+            demuxer_->GetLowestPresentationTimestamp(video_id));
+  EXPECT_EQ(base::Milliseconds(20),
+            demuxer_->GetHighestPresentationTimestamp(video_id));
+
+  CheckExpectedRanges(audio_id, "{ [10,20) }");
+  CheckExpectedRanges(video_id, "{ [20,30) }");
+
+  // Since the buffered range of each of the sources are disjoint, nothing
+  // should be in their intersection (unless endOfStream has been called.)
+  CheckExpectedRangesForMediaSource("{ }");
+  EXPECT_CALL(host_, SetDuration(base::Milliseconds(30)));
+  MarkEndOfStream(PIPELINE_OK);
+  CheckExpectedRangesForMediaSource("{ [20,30) }");
+
+  Seek(base::TimeDelta());
+  CheckExpectedBuffers(GetStream(DemuxerStream::AUDIO), "10K");
+  ExpectEndOfStream(DemuxerStream::AUDIO);
+  CheckExpectedBuffers(GetStream(DemuxerStream::VIDEO), "20K");
+  ExpectEndOfStream(DemuxerStream::VIDEO);
+}
+
+TEST_F(ChunkDemuxerTest, GetLowestAndHighestPresentationTimestamps_Muxed) {
+  InitDemuxer(HAS_AUDIO | HAS_VIDEO);
+  EXPECT_EQ(base::TimeDelta(),
+            demuxer_->GetLowestPresentationTimestamp(kSourceId));
+  EXPECT_EQ(base::TimeDelta(),
+            demuxer_->GetHighestPresentationTimestamp(kSourceId));
+
+  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "10K 33K 56K", 23),
+                     MuxedStreamInfo(kVideoTrackNum, "20K 50K 80K", 30));
+  EXPECT_EQ(base::Milliseconds(10),
+            demuxer_->GetLowestPresentationTimestamp(kSourceId));
+  EXPECT_EQ(base::Milliseconds(80),
+            demuxer_->GetHighestPresentationTimestamp(kSourceId));
+
+  // Note the coded frame group start time was 10ms in this muxed source append,
+  // so the buffered ranges reflect a resulting start time of 10ms even though
+  // there is no video precisely at that presentation time.
+  CheckExpectedRanges("{ [10,79) }");  // 56 + 23 = 79
+  EXPECT_CALL(host_, SetDuration(base::Milliseconds(110)));
+  MarkEndOfStream(PIPELINE_OK);
+  CheckExpectedRanges("{ [10,110) }");  // 80 + 30 = 110
+  Seek(base::TimeDelta());
+  CheckExpectedBuffers(GetStream(DemuxerStream::AUDIO), "10K 33K 56K");
+  ExpectEndOfStream(DemuxerStream::AUDIO);
+  CheckExpectedBuffers(GetStream(DemuxerStream::VIDEO), "20K 50K 80K");
+  ExpectEndOfStream(DemuxerStream::VIDEO);
+
+  demuxer_->UnmarkEndOfStream();
+  // Remove the first audio buffer.
+  demuxer_->Remove(kSourceId, base::Milliseconds(10), base::Milliseconds(11));
+  // Remove the last video buffer.
+  demuxer_->Remove(kSourceId, base::Milliseconds(80), base::Milliseconds(81));
+
+  // Even though no audio or video is actually buffered until time 20ms, the
+  // front removal, above, caused the underlying range start time for video to
+  // move to time 11 since it didn't actually remove any video from the front.
+  EXPECT_EQ(base::Milliseconds(11),
+            demuxer_->GetLowestPresentationTimestamp(kSourceId));
+  EXPECT_EQ(base::Milliseconds(56),
+            demuxer_->GetHighestPresentationTimestamp(kSourceId));
+  CheckExpectedRanges("{ [33,79) }");
+  EXPECT_CALL(host_, SetDuration(base::Milliseconds(80)));
+  MarkEndOfStream(PIPELINE_OK);
+  CheckExpectedRanges("{ [33,80) }");
+  Seek(base::TimeDelta());
+  CheckExpectedBuffers(GetStream(DemuxerStream::AUDIO), "33K 56K");
+  ExpectEndOfStream(DemuxerStream::AUDIO);
+  CheckExpectedBuffers(GetStream(DemuxerStream::VIDEO), "20K 50K");
+  ExpectEndOfStream(DemuxerStream::VIDEO);
+}
+
 TEST_F(ChunkDemuxerTest, Mp4Vp9CodecSupport) {
   demuxer_->Initialize(&host_,
                        base::BindOnce(&ChunkDemuxerTest::DemuxerInitialized,
diff --git a/media/filters/hls_demuxer.cc b/media/filters/hls_demuxer.cc
new file mode 100644
index 0000000..13f893f
--- /dev/null
+++ b/media/filters/hls_demuxer.cc
@@ -0,0 +1,151 @@
+// 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 "media/filters/hls_demuxer.h"
+
+#include <vector>
+
+#include "base/logging.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/task/sequenced_task_runner.h"
+#include "base/time/time.h"
+#include "media/base/container_names.h"
+#include "media/base/demuxer_stream.h"
+#include "media/base/media_log.h"
+#include "media/base/media_track.h"
+#include "media/base/pipeline_status.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace media {
+
+HlsDemuxer::HlsDemuxer(scoped_refptr<base::SequencedTaskRunner> task_runner,
+                       MediaLog* media_log)
+    : media_log_(media_log), task_runner_(std::move(task_runner)) {
+  DCHECK(task_runner_);
+  MEDIA_LOG(INFO, media_log_) << GetDisplayName();
+}
+
+HlsDemuxer::~HlsDemuxer() {
+  DVLOG(1) << __func__;
+}
+
+std::vector<DemuxerStream*> HlsDemuxer::GetAllStreams() {
+  DVLOG(1) << __func__;
+
+  // TODO(crbug/1266991): Consult underlying ChunkDemuxer for its streams
+  // instead of doing this:
+  return std::vector<DemuxerStream*>();
+}
+
+std::string HlsDemuxer::GetDisplayName() const {
+  return "HlsDemuxer";
+}
+
+DemuxerType HlsDemuxer::GetDemuxerType() const {
+  return DemuxerType::kHlsDemuxer;
+}
+
+void HlsDemuxer::Initialize(DemuxerHost* host,
+                            PipelineStatusCallback status_cb) {
+  DVLOG(1) << __func__ << "(host=" << host << ")";
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
+
+  // TODO(crbug/1266991): Save the host, create and wrap a ChunkDemuxerHost and
+  // ChunkDemuxer. Initialize the wrapped ChunkDemuxer, giving it `status_cb`.
+  // Also begin fetching the root playlist URI. Verify and update internal state
+  // machine, too.
+  // TODO(crbug/1266991): Consider suppressing the wrapped ChunkDemuxer's
+  // displayname log when it is constructed (perhaps subtype it?).
+}
+
+void HlsDemuxer::AbortPendingReads() {
+  DVLOG(1) << __func__;
+  // TODO(crbug/1266991): Let the wrapped ChunkDemuxer know to abort pending
+  // reads, if any.
+}
+
+void HlsDemuxer::StartWaitingForSeek(base::TimeDelta seek_time) {
+  DVLOG(1) << __func__ << "(seek_time=" << seek_time.InMicroseconds() << "us)";
+  // TODO(crbug/1266991): Time Remapping.
+  // TODO(crbug/1266991): Let the wrapped ChunkDemuxer know to start waiting for
+  // a seek to `seek_time`.
+}
+
+void HlsDemuxer::CancelPendingSeek(base::TimeDelta seek_time) {
+  DVLOG(1) << __func__ << "(seek_time=" << seek_time.InMicroseconds() << "us)";
+  // TODO(crbug/1266991): Time remapping.
+  // TODO(crbug/1266991): Let the wrapped ChunkDemuxer know to cancel pending
+  // seek for `seek_time`.
+}
+
+void HlsDemuxer::Seek(base::TimeDelta time, PipelineStatusCallback status_cb) {
+  DVLOG(1) << __func__ << "(time=" << time.InMicroseconds() << "us)";
+  // TODO(crbug/1266991): This should be intercepted when performing time
+  // remapping.
+  // TODO(crbug/1266991): Let the wrapped ChunkDemuxer know to seek to `time`
+  // and give it `status_cb`.
+}
+
+void HlsDemuxer::Stop() {
+  DVLOG(1) << __func__;
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
+
+  // TODO(crbug/1266991): Let the wrapped ChunkDemuxer know to stop, clear it,
+  // clear the host for it, invalidate any weak pointers we may have bound.
+}
+
+base::TimeDelta HlsDemuxer::GetStartTime() const {
+  // TODO(crbug/1266991): Is any time remapping of HLS start time necessary
+  // here?
+  DVLOG(2) << __func__ << " -> 0";
+  return base::TimeDelta();
+}
+
+base::Time HlsDemuxer::GetTimelineOffset() const {
+  // TODO(crbug/1266991): Implement this with the value of the
+  // EXT-X-PROGRAM-DATETIME tag.
+  // TODO(crbug/1266991): Moderate that tag with respect to any underlying
+  // streams' nonzero timeline offsets that the wrapped ChunkDemuxer may have?
+  // And should wrapped ChunkDemuxer's enforcement that any specified (non-null)
+  // offset across multiple ChunkDemuxer::OnSourceInitDone() match be relaxed if
+  // its wrapped by an HLS demuxer which might ignore those offsets?
+  DVLOG(2) << __func__ << " -> null time (0)";
+  return base::Time();
+}
+
+int64_t HlsDemuxer::GetMemoryUsage() const {
+  // TODO(crbug/1266991): If we have a wrapped ChunkDemuxer, consider returning
+  // its usage here.
+  // TODO(crbug/1266991): Consider other potential significant memory usage
+  // here, if the data sources, playlist parser(s), rendition metadata or
+  // timeline managers are significant memory consumers.
+  DVLOG(1) << __func__ << " -> 0";
+  return 0;
+}
+
+absl::optional<container_names::MediaContainerName>
+HlsDemuxer::GetContainerForMetrics() const {
+  DVLOG(1) << __func__;
+  // TODO(crbug/1266991): Consider how this is used. HLS can involve multiple
+  // stream types (mp2ts, mp4, etc). Refactor to report something useful.
+  return absl::nullopt;
+}
+
+void HlsDemuxer::OnEnabledAudioTracksChanged(
+    const std::vector<MediaTrack::Id>& track_ids,
+    base::TimeDelta curr_time,
+    TrackChangeCB change_completed_cb) {
+  DVLOG(1) << __func__ << "(curr_time=" << curr_time.InMicroseconds() << "us)";
+  // TODO(crbug/1266991): Handle this as necessary.
+}
+
+void HlsDemuxer::OnSelectedVideoTrackChanged(
+    const std::vector<MediaTrack::Id>& track_ids,
+    base::TimeDelta curr_time,
+    TrackChangeCB change_completed_cb) {
+  DVLOG(1) << __func__ << "(curr_time=" << curr_time.InMicroseconds() << "us)";
+  // TODO(crbug/1266991): Handle this as necessary.
+}
+
+}  // namespace media
diff --git a/media/filters/hls_demuxer.h b/media/filters/hls_demuxer.h
new file mode 100644
index 0000000..905448a0
--- /dev/null
+++ b/media/filters/hls_demuxer.h
@@ -0,0 +1,72 @@
+// 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 MEDIA_FILTERS_HLS_DEMUXER_H_
+#define MEDIA_FILTERS_HLS_DEMUXER_H_
+
+#include <vector>
+
+#include "base/memory/scoped_refptr.h"
+#include "base/task/sequenced_task_runner.h"
+#include "base/time/time.h"
+#include "media/base/container_names.h"
+#include "media/base/demuxer.h"
+#include "media/base/demuxer_stream.h"
+#include "media/base/media_export.h"
+#include "media/base/media_log.h"
+#include "media/base/media_track.h"
+#include "media/base/pipeline_status.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace media {
+
+class MEDIA_EXPORT HlsDemuxer final : public Demuxer {
+ public:
+  explicit HlsDemuxer(
+      scoped_refptr<base::SequencedTaskRunner> task_runner,
+      /* TODO(crbug/1266991) add HLS data source provider here */
+      /* TODO(crbug/1266991) add GURL here for the root playlist uri */
+      /* TODO(crbug/1266991) add progress_cb here? */
+      MediaLog* media_log);
+  ~HlsDemuxer() override;
+  HlsDemuxer(const HlsDemuxer&) = delete;
+  HlsDemuxer(HlsDemuxer&&) = delete;
+  HlsDemuxer& operator=(const HlsDemuxer&) = delete;
+  HlsDemuxer& operator=(HlsDemuxer&&) = delete;
+
+  // `media::MediaResource` implementation
+  std::vector<DemuxerStream*> GetAllStreams() override;
+
+  // `media::Demuxer` implementation
+  std::string GetDisplayName() const override;
+  DemuxerType GetDemuxerType() const override;
+  void Initialize(DemuxerHost* host, PipelineStatusCallback status_cb) override;
+  void AbortPendingReads() override;
+  void StartWaitingForSeek(base::TimeDelta seek_time) override;
+  void CancelPendingSeek(base::TimeDelta seek_time) override;
+  void Seek(base::TimeDelta time, PipelineStatusCallback status_cb) override;
+  void Stop() override;
+  base::TimeDelta GetStartTime() const override;
+  base::Time GetTimelineOffset() const override;
+  int64_t GetMemoryUsage() const override;
+
+  absl::optional<container_names::MediaContainerName> GetContainerForMetrics()
+      const override;
+
+  void OnEnabledAudioTracksChanged(const std::vector<MediaTrack::Id>& track_ids,
+                                   base::TimeDelta curr_time,
+                                   TrackChangeCB change_completed_cb) override;
+
+  void OnSelectedVideoTrackChanged(const std::vector<MediaTrack::Id>& track_ids,
+                                   base::TimeDelta curr_time,
+                                   TrackChangeCB change_completed_cb) override;
+
+ private:
+  MediaLog* media_log_;
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
+};
+
+}  // namespace media
+
+#endif  // MEDIA_FILTERS_HLS_DEMUXER_H_
diff --git a/media/filters/hls_demuxer_unittest.cc b/media/filters/hls_demuxer_unittest.cc
new file mode 100644
index 0000000..04fd552
--- /dev/null
+++ b/media/filters/hls_demuxer_unittest.cc
@@ -0,0 +1,55 @@
+// 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 "media/filters/hls_demuxer.h"
+
+#include "base/task/single_thread_task_runner.h"
+#include "base/test/task_environment.h"
+#include "media/base/mock_media_log.h"
+#include "media/base/test_helpers.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::StrictMock;
+
+namespace media {
+
+class HlsDemuxerTest : public testing::Test {
+ protected:
+  HlsDemuxerTest() { CreateNewDemuxer(); }
+  ~HlsDemuxerTest() override { Shutdown(); }
+
+  HlsDemuxerTest(const HlsDemuxerTest&) = delete;
+  HlsDemuxerTest& operator=(const HlsDemuxerTest&) = delete;
+
+  void Shutdown() {
+    if (demuxer_) {
+      demuxer_->Stop();
+    }
+    demuxer_.reset();
+    task_environment_.RunUntilIdle();
+  }
+
+  void CreateNewDemuxer() {
+    EXPECT_MEDIA_LOG(HlsDemuxerCtor());
+    demuxer_ = std::make_unique<HlsDemuxer>(
+        base::SingleThreadTaskRunner::GetCurrentDefault(), &media_log_);
+  }
+
+  base::test::TaskEnvironment task_environment_;
+  StrictMock<MockMediaLog> media_log_;
+  std::unique_ptr<HlsDemuxer> demuxer_;
+};
+
+TEST_F(HlsDemuxerTest, PreInitializationState) {
+  EXPECT_TRUE(demuxer_);
+  EXPECT_EQ(0u, demuxer_->GetAllStreams().size());
+  EXPECT_EQ("HlsDemuxer", demuxer_->GetDisplayName());
+  EXPECT_EQ(DemuxerType::kHlsDemuxer, demuxer_->GetDemuxerType());
+  EXPECT_EQ(base::TimeDelta(), demuxer_->GetStartTime());
+  EXPECT_EQ(base::Time(), demuxer_->GetTimelineOffset());
+  EXPECT_EQ(0u, demuxer_->GetMemoryUsage());
+  EXPECT_EQ(absl::nullopt, demuxer_->GetContainerForMetrics());
+}
+
+}  // namespace media
diff --git a/media/filters/source_buffer_state.cc b/media/filters/source_buffer_state.cc
index 1b0e79a..7d18724 100644
--- a/media/filters/source_buffer_state.cc
+++ b/media/filters/source_buffer_state.cc
@@ -390,6 +390,29 @@
   return ComputeRangesIntersection(ranges_list, ended);
 }
 
+base::TimeDelta SourceBufferState::GetLowestPresentationTimestamp() const {
+  base::TimeDelta min_pts = kInfiniteDuration;
+
+  for (const auto& it : audio_streams_) {
+    min_pts = std::min(min_pts, it.second->GetLowestPresentationTimestamp());
+  }
+
+  for (const auto& it : video_streams_) {
+    min_pts = std::min(min_pts, it.second->GetLowestPresentationTimestamp());
+  }
+
+  for (const auto& it : text_streams_) {
+    min_pts = std::min(min_pts, it.second->GetLowestPresentationTimestamp());
+  }
+
+  DCHECK_LE(base::TimeDelta(), min_pts);
+  if (min_pts == kInfiniteDuration) {
+    return base::TimeDelta();
+  }
+
+  return min_pts;
+}
+
 base::TimeDelta SourceBufferState::GetHighestPresentationTimestamp() const {
   base::TimeDelta max_pts;
 
diff --git a/media/filters/source_buffer_state.h b/media/filters/source_buffer_state.h
index 31deb83..e7eff93 100644
--- a/media/filters/source_buffer_state.h
+++ b/media/filters/source_buffer_state.h
@@ -141,6 +141,10 @@
   Ranges<base::TimeDelta> GetBufferedRanges(base::TimeDelta duration,
                                             bool ended) const;
 
+  // Returns the lowest PTS of currently buffered frames in this source, or
+  // base::TimeDelta() if none of the streams contain buffered data.
+  base::TimeDelta GetLowestPresentationTimestamp() const;
+
   // Returns the highest PTS of currently buffered frames in this source, or
   // base::TimeDelta() if none of the streams contain buffered data.
   base::TimeDelta GetHighestPresentationTimestamp() const;
diff --git a/media/filters/source_buffer_stream.cc b/media/filters/source_buffer_stream.cc
index 123a9414..dfa917c 100644
--- a/media/filters/source_buffer_stream.cc
+++ b/media/filters/source_buffer_stream.cc
@@ -1723,6 +1723,14 @@
   return ranges;
 }
 
+base::TimeDelta SourceBufferStream::GetLowestPresentationTimestamp() const {
+  if (ranges_.empty()) {
+    return base::TimeDelta();
+  }
+
+  return ranges_.front()->GetStartTimestamp();
+}
+
 base::TimeDelta SourceBufferStream::GetHighestPresentationTimestamp() const {
   if (ranges_.empty())
     return base::TimeDelta();
diff --git a/media/filters/source_buffer_stream.h b/media/filters/source_buffer_stream.h
index 7191352..8a89cc4 100644
--- a/media/filters/source_buffer_stream.h
+++ b/media/filters/source_buffer_stream.h
@@ -134,6 +134,10 @@
   // Returns a list of the buffered time ranges.
   Ranges<base::TimeDelta> GetBufferedTime() const;
 
+  // Returns the lowest buffered PTS or base::TimeDelta() if nothing is
+  // buffered.
+  base::TimeDelta GetLowestPresentationTimestamp() const;
+
   // Returns the highest buffered PTS or base::TimeDelta() if nothing is
   // buffered.
   base::TimeDelta GetHighestPresentationTimestamp() const;
diff --git a/media/filters/source_buffer_stream_unittest.cc b/media/filters/source_buffer_stream_unittest.cc
index f159c1c..4f92d6d 100644
--- a/media/filters/source_buffer_stream_unittest.cc
+++ b/media/filters/source_buffer_stream_unittest.cc
@@ -5109,6 +5109,62 @@
   CheckNoNextBuffer();
 }
 
+TEST_F(SourceBufferStreamTest, GetLowestPresentationTimestamp_NonMuxed) {
+  EXPECT_EQ(base::TimeDelta(), stream_->GetLowestPresentationTimestamp());
+
+  NewCodedFrameGroupAppend("100K 110K");
+  EXPECT_EQ(base::Milliseconds(100), stream_->GetLowestPresentationTimestamp());
+
+  RemoveInMs(110, 120, 120);
+  EXPECT_EQ(base::Milliseconds(100), stream_->GetLowestPresentationTimestamp());
+
+  RemoveInMs(100, 110, 120);
+  EXPECT_EQ(base::TimeDelta(), stream_->GetLowestPresentationTimestamp());
+
+  NewCodedFrameGroupAppend("100K 110K");
+  EXPECT_EQ(base::Milliseconds(100), stream_->GetLowestPresentationTimestamp());
+
+  RemoveInMs(100, 110, 120);
+  EXPECT_EQ(base::Milliseconds(110), stream_->GetLowestPresentationTimestamp());
+
+  RemoveInMs(110, 120, 120);
+  EXPECT_EQ(base::TimeDelta(), stream_->GetLowestPresentationTimestamp());
+}
+
+TEST_F(SourceBufferStreamTest, GetLowestPresentationTimestamp_Muxed) {
+  // Simulate `stream_` being one of multiple resulting from parsing and
+  // buffering a muxed bytestream. In this case, it is common for range start
+  // times across the streams in the same muxed segment to not precisely align.
+  // The frame processing algorithm indicates the segment's "coded frame group
+  // start time" to the SourceBufferStream, and the underlying range remembers
+  // this even if the corresponding actual start time in the underlying range is
+  // later than that start time. However, if the start of that range is removed,
+  // then the underlying range no longer attempts to maintain the original
+  // "coded frame group start time" as the lowest timestamp. This impacts
+  // GetLowestPresentationTimestamp(), since the underlying range start time of
+  // the first range is involved and is conditional. See also
+  // SourceBufferRange::GetStartTimestamp().
+  EXPECT_EQ(base::TimeDelta(), stream_->GetLowestPresentationTimestamp());
+
+  NewCodedFrameGroupAppend(base::Milliseconds(50), "100K 110K");
+  EXPECT_EQ(base::Milliseconds(50), stream_->GetLowestPresentationTimestamp());
+
+  RemoveInMs(110, 120, 120);
+  EXPECT_EQ(base::Milliseconds(50), stream_->GetLowestPresentationTimestamp());
+
+  RemoveInMs(100, 110, 120);
+  EXPECT_EQ(base::TimeDelta(), stream_->GetLowestPresentationTimestamp());
+
+  NewCodedFrameGroupAppend(base::Milliseconds(50), "100K 110K");
+  EXPECT_EQ(base::Milliseconds(50), stream_->GetLowestPresentationTimestamp());
+
+  RemoveInMs(100, 110, 120);
+  EXPECT_EQ(base::Milliseconds(110), stream_->GetLowestPresentationTimestamp());
+
+  RemoveInMs(110, 120, 120);
+  EXPECT_EQ(base::TimeDelta(), stream_->GetLowestPresentationTimestamp());
+}
+
 TEST_F(SourceBufferStreamTest, GetHighestPresentationTimestamp) {
   EXPECT_EQ(base::TimeDelta(), stream_->GetHighestPresentationTimestamp());
 
diff --git a/third_party/abseil-cpp/README.chromium b/third_party/abseil-cpp/README.chromium
index f5bb00b..62f3ba4 100644
--- a/third_party/abseil-cpp/README.chromium
+++ b/third_party/abseil-cpp/README.chromium
@@ -4,7 +4,7 @@
 License: Apache 2.0
 License File: LICENSE
 Version: 0
-Revision: 8caa47cfcddbcddd36d22bbab13f4cd9bccbf5c2
+Revision: 6abc1958562c49d797ea23270a355caf5dc39f94
 Security Critical: yes
 
 Description:
diff --git a/third_party/abseil-cpp/absl/base/internal/raw_logging.h b/third_party/abseil-cpp/absl/base/internal/raw_logging.h
index db2ef38..c7b889c 100644
--- a/third_party/abseil-cpp/absl/base/internal/raw_logging.h
+++ b/third_party/abseil-cpp/absl/base/internal/raw_logging.h
@@ -78,7 +78,7 @@
         ABSL_RAW_LOG_INTERNAL_##severity, absl_raw_log_internal_filename, \
         __LINE__, message);                                               \
     if (ABSL_RAW_LOG_INTERNAL_##severity == ::absl::LogSeverity::kFatal)  \
-      ABSL_INTERNAL_UNREACHABLE;                                          \
+      ABSL_UNREACHABLE();                                                 \
   } while (0)
 
 #define ABSL_INTERNAL_CHECK(condition, message)                    \
diff --git a/third_party/abseil-cpp/absl/base/internal/thread_identity.h b/third_party/abseil-cpp/absl/base/internal/thread_identity.h
index 659694b..463acbc7 100644
--- a/third_party/abseil-cpp/absl/base/internal/thread_identity.h
+++ b/third_party/abseil-cpp/absl/base/internal/thread_identity.h
@@ -134,6 +134,10 @@
 
 // The instances of this class are allocated in NewThreadIdentity() with an
 // alignment of PerThreadSynch::kAlignment.
+//
+// NOTE: The layout of fields in this structure is critical, please do not
+//       add, remove, or modify the field placements without fully auditing the
+//       layout.
 struct ThreadIdentity {
   // Must be the first member.  The Mutex implementation requires that
   // the PerThreadSynch object associated with each thread is
diff --git a/third_party/abseil-cpp/absl/base/macros.h b/third_party/abseil-cpp/absl/base/macros.h
index 3e085a9..bbf7494 100644
--- a/third_party/abseil-cpp/absl/base/macros.h
+++ b/third_party/abseil-cpp/absl/base/macros.h
@@ -103,17 +103,11 @@
 // aborts the program in release mode (when NDEBUG is defined). The
 // implementation should abort the program as quickly as possible and ideally it
 // should not be possible to ignore the abort request.
-#if (ABSL_HAVE_BUILTIN(__builtin_trap) &&         \
-     ABSL_HAVE_BUILTIN(__builtin_unreachable)) || \
-    (defined(__GNUC__) && !defined(__clang__))
-#define ABSL_INTERNAL_HARDENING_ABORT() \
-  do {                                  \
-    __builtin_trap();                   \
-    __builtin_unreachable();            \
+#define ABSL_INTERNAL_HARDENING_ABORT()   \
+  do {                                    \
+    ABSL_INTERNAL_IMMEDIATE_ABORT_IMPL(); \
+    ABSL_INTERNAL_UNREACHABLE_IMPL();     \
   } while (false)
-#else
-#define ABSL_INTERNAL_HARDENING_ABORT() abort()
-#endif
 
 // ABSL_HARDENING_ASSERT()
 //
@@ -144,15 +138,7 @@
 #define ABSL_INTERNAL_RETHROW do {} while (false)
 #endif  // ABSL_HAVE_EXCEPTIONS
 
-// `ABSL_INTERNAL_UNREACHABLE` is an unreachable statement.  A program which
-// reaches one has undefined behavior, and the compiler may optimize
-// accordingly.
-#if defined(__GNUC__) || ABSL_HAVE_BUILTIN(__builtin_unreachable)
-#define ABSL_INTERNAL_UNREACHABLE __builtin_unreachable()
-#elif defined(_MSC_VER)
-#define ABSL_INTERNAL_UNREACHABLE __assume(0)
-#else
-#define ABSL_INTERNAL_UNREACHABLE
-#endif
+// TODO(b/261916195): Replace ABSL_INTERNAL_UNREACHABLE with ABSL_UNREACHABLE().
+#define ABSL_INTERNAL_UNREACHABLE ABSL_UNREACHABLE()
 
 #endif  // ABSL_BASE_MACROS_H_
diff --git a/third_party/abseil-cpp/absl/base/optimization.h b/third_party/abseil-cpp/absl/base/optimization.h
index d706100c..ad0121a 100644
--- a/third_party/abseil-cpp/absl/base/optimization.h
+++ b/third_party/abseil-cpp/absl/base/optimization.h
@@ -181,6 +181,53 @@
 #define ABSL_PREDICT_TRUE(x) (x)
 #endif
 
+// `ABSL_INTERNAL_IMMEDIATE_ABORT_IMPL()` aborts the program in the fastest
+// possible way, with no attempt at logging. One use is to implement hardening
+// aborts with ABSL_OPTION_HARDENED.  Since this is an internal symbol, it
+// should not be used directly outside of Abseil.
+#if ABSL_HAVE_BUILTIN(__builtin_trap) || \
+    (defined(__GNUC__) && !defined(__clang__))
+#define ABSL_INTERNAL_IMMEDIATE_ABORT_IMPL() __builtin_trap()
+#else
+#define ABSL_INTERNAL_IMMEDIATE_ABORT_IMPL() abort()
+#endif
+
+// `ABSL_INTERNAL_UNREACHABLE_IMPL()` is the platform specific directive to
+// indicate that a statement is unreachable, and to allow the compiler to
+// optimize accordingly. Clients should use `ABSL_UNREACHABLE()`, which is
+// defined below.
+#if defined(__cpp_lib_unreachable) && __cpp_lib_unreachable >= 202202L
+#define ABSL_INTERNAL_UNREACHABLE_IMPL() std::unreachable()
+#elif defined(__GNUC__) || ABSL_HAVE_BUILTIN(__builtin_unreachable)
+#define ABSL_INTERNAL_UNREACHABLE_IMPL() __builtin_unreachable()
+#elif ABSL_HAVE_BUILTIN(__builtin_assume)
+#define ABSL_INTERNAL_UNREACHABLE_IMPL() __builtin_assume(false)
+#elif defined(_MSC_VER)
+#define ABSL_INTERNAL_UNREACHABLE_IMPL() __assume(false)
+#else
+#define ABSL_INTERNAL_UNREACHABLE_IMPL()
+#endif
+
+// `ABSL_UNREACHABLE()` is an unreachable statement.  A program which reaches
+// one has undefined behavior, and the compiler may optimize accordingly.
+#if ABSL_OPTION_HARDENED == 1 && defined(NDEBUG)
+// Abort in hardened mode to avoid dangerous undefined behavior.
+#define ABSL_UNREACHABLE()                \
+  do {                                    \
+    ABSL_INTERNAL_IMMEDIATE_ABORT_IMPL(); \
+    ABSL_INTERNAL_UNREACHABLE_IMPL();     \
+  } while (false)
+#else
+// The assert only fires in debug mode to aid in debugging.
+// When NDEBUG is defined, reaching ABSL_UNREACHABLE() is undefined behavior.
+#define ABSL_UNREACHABLE()                       \
+  do {                                           \
+    /* NOLINTNEXTLINE: misc-static-assert */     \
+    assert(false && "ABSL_UNREACHABLE reached"); \
+    ABSL_INTERNAL_UNREACHABLE_IMPL();            \
+  } while (false)
+#endif
+
 // ABSL_ASSUME(cond)
 //
 // Informs the compiler that a condition is always true and that it can assume
@@ -209,18 +256,23 @@
 #define ABSL_ASSUME(cond) assert(cond)
 #elif ABSL_HAVE_BUILTIN(__builtin_assume)
 #define ABSL_ASSUME(cond) __builtin_assume(cond)
+#elif defined(_MSC_VER)
+#define ABSL_ASSUME(cond) __assume(cond)
+#elif defined(__cpp_lib_unreachable) && __cpp_lib_unreachable >= 202202L
+#define ABSL_ASSUME(cond)            \
+  do {                               \
+    if (!(cond)) std::unreachable(); \
+  } while (false)
 #elif defined(__GNUC__) || ABSL_HAVE_BUILTIN(__builtin_unreachable)
 #define ABSL_ASSUME(cond)                 \
   do {                                    \
     if (!(cond)) __builtin_unreachable(); \
-  } while (0)
-#elif defined(_MSC_VER)
-#define ABSL_ASSUME(cond) __assume(cond)
+  } while (false)
 #else
 #define ABSL_ASSUME(cond)               \
   do {                                  \
     static_cast<void>(false && (cond)); \
-  } while (0)
+  } while (false)
 #endif
 
 // ABSL_INTERNAL_UNIQUE_SMALL_NAME(cond)
diff --git a/third_party/abseil-cpp/absl/container/fixed_array.h b/third_party/abseil-cpp/absl/container/fixed_array.h
index 5543243..b67379c 100644
--- a/third_party/abseil-cpp/absl/container/fixed_array.h
+++ b/third_party/abseil-cpp/absl/container/fixed_array.h
@@ -62,11 +62,10 @@
 // A `FixedArray` provides a run-time fixed-size array, allocating a small array
 // inline for efficiency.
 //
-// Most users should not specify an `inline_elements` argument and let
-// `FixedArray` automatically determine the number of elements
-// to store inline based on `sizeof(T)`. If `inline_elements` is specified, the
-// `FixedArray` implementation will use inline storage for arrays with a
-// length <= `inline_elements`.
+// Most users should not specify the `N` template parameter and let `FixedArray`
+// automatically determine the number of elements to store inline based on
+// `sizeof(T)`. If `N` is specified, the `FixedArray` implementation will use
+// inline storage for arrays with a length <= `N`.
 //
 // Note that a `FixedArray` constructed with a `size_type` argument will
 // default-initialize its values by leaving trivially constructible types
diff --git a/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h b/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h
index ad4c2cc..3762820 100644
--- a/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h
+++ b/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h
@@ -2064,8 +2064,8 @@
       // This is after resize, to ensure that we have completed the allocation
       // and have potentially sampled the hashtable.
       infoz().RecordReservation(n);
-      common().reset_reserved_growth(n);
     }
+    common().reset_reserved_growth(n);
   }
 
   // Extension API: support for heterogeneous keys.
diff --git a/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc
index 3bfb15f..8096567 100644
--- a/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc
+++ b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc
@@ -2292,6 +2292,21 @@
   EXPECT_DEATH_IF_SUPPORTED(*it, kInvalidIteratorDeathMessage);
 }
 
+TEST(Table, ReservedGrowthUpdatesWhenTableDoesntGrow) {
+  IntTable t;
+  for (int i = 0; i < 8; ++i) t.insert(i);
+  // Want to insert twice without invalidating iterators so reserve.
+  const size_t cap = t.capacity();
+  t.reserve(t.size() + 2);
+  // We want to be testing the case in which the reserve doesn't grow the table.
+  ASSERT_EQ(cap, t.capacity());
+  auto it = t.find(0);
+  t.insert(100);
+  t.insert(200);
+  // `it` shouldn't have been invalidated.
+  EXPECT_EQ(*it, 0);
+}
+
 }  // namespace
 }  // namespace container_internal
 ABSL_NAMESPACE_END
diff --git a/third_party/abseil-cpp/absl/debugging/leak_check.h b/third_party/abseil-cpp/absl/debugging/leak_check.h
index eff162f67..6bd7940 100644
--- a/third_party/abseil-cpp/absl/debugging/leak_check.h
+++ b/third_party/abseil-cpp/absl/debugging/leak_check.h
@@ -37,7 +37,7 @@
 // not also use AddressSanitizer). To use the mode, simply pass
 // `-fsanitize=leak` to both the compiler and linker. Since GCC does not
 // currently provide a way of detecting this mode at compile-time, GCC users
-// must also pass -DLEAK_SANIITIZER to the compiler. An example Bazel command
+// must also pass -DLEAK_SANITIZER to the compiler. An example Bazel command
 // could be
 //
 //   $ bazel test --copt=-DLEAK_SANITIZER --copt=-fsanitize=leak
diff --git a/third_party/abseil-cpp/absl/functional/internal/any_invocable.h b/third_party/abseil-cpp/absl/functional/internal/any_invocable.h
index 8fce4bf6..6bfbda18 100644
--- a/third_party/abseil-cpp/absl/functional/internal/any_invocable.h
+++ b/third_party/abseil-cpp/absl/functional/internal/any_invocable.h
@@ -66,6 +66,7 @@
 #include "absl/base/config.h"
 #include "absl/base/internal/invoke.h"
 #include "absl/base/macros.h"
+#include "absl/base/optimization.h"
 #include "absl/meta/type_traits.h"
 #include "absl/utility/utility.h"
 
@@ -281,7 +282,7 @@
       from_object.~T();  // Must not throw. // NOLINT
       return;
   }
-  ABSL_INTERNAL_UNREACHABLE;
+  ABSL_UNREACHABLE();
 }
 
 // The invoker that is used when a target function is in local storage
@@ -319,7 +320,7 @@
 #endif  // __cpp_sized_deallocation
       return;
   }
-  ABSL_INTERNAL_UNREACHABLE;
+  ABSL_UNREACHABLE();
 }
 
 // The manager that is used when a target function is in remote storage and the
@@ -341,7 +342,7 @@
       ::delete static_cast<T*>(from->remote.target);  // Must not throw.
       return;
   }
-  ABSL_INTERNAL_UNREACHABLE;
+  ABSL_UNREACHABLE();
 }
 
 // The invoker that is used when a target function is in remote storage
diff --git a/third_party/abseil-cpp/absl/status/status.cc b/third_party/abseil-cpp/absl/status/status.cc
index bbf2335d..160eb417 100644
--- a/third_party/abseil-cpp/absl/status/status.cc
+++ b/third_party/abseil-cpp/absl/status/status.cc
@@ -20,6 +20,7 @@
 
 #include "absl/base/internal/raw_logging.h"
 #include "absl/base/internal/strerror.h"
+#include "absl/base/macros.h"
 #include "absl/debugging/stacktrace.h"
 #include "absl/debugging/symbolize.h"
 #include "absl/status/status_payload_printer.h"
diff --git a/third_party/abseil-cpp/absl/status/status_test.cc b/third_party/abseil-cpp/absl/status/status_test.cc
index 89cce7d..74a64ac 100644
--- a/third_party/abseil-cpp/absl/status/status_test.cc
+++ b/third_party/abseil-cpp/absl/status/status_test.cc
@@ -505,4 +505,5 @@
   EXPECT_EQ(status.code(), absl::StatusCode::kNotFound);
   EXPECT_EQ(status.message(), "Cannot open 'path': No such file or directory");
 }
+
 }  // namespace
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc
index 985f0724..a86fdc0 100644
--- a/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc
+++ b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc
@@ -23,6 +23,7 @@
 #include "absl/base/attributes.h"
 #include "absl/base/config.h"
 #include "absl/base/internal/raw_logging.h"
+#include "absl/base/optimization.h"
 #include "absl/strings/internal/cord_data_edge.h"
 #include "absl/strings/internal/cord_internal.h"
 #include "absl/strings/internal/cord_rep_consume.h"
@@ -286,7 +287,7 @@
       case CordRepBtree::kSelf:
         return result.tree;
     }
-    ABSL_INTERNAL_UNREACHABLE;
+    ABSL_UNREACHABLE();
     return result.tree;
   }
 
diff --git a/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h b/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h
index 020472a..f5c2c0ef 100644
--- a/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h
+++ b/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h
@@ -19,8 +19,8 @@
 // Constructible from a absl::Time (for a timeout to be respected) or {}
 // (for "no timeout".)
 // This is a private low-level API for use by a handful of low-level
-// components that are friends of this class. Higher-level components
-// should build APIs based on absl::Time and absl::Duration.
+// components. Higher-level components should build APIs based on
+// absl::Time and absl::Duration.
 
 #ifndef ABSL_SYNCHRONIZATION_INTERNAL_KERNEL_TIMEOUT_H_
 #define ABSL_SYNCHRONIZATION_INTERNAL_KERNEL_TIMEOUT_H_
@@ -39,7 +39,6 @@
 ABSL_NAMESPACE_BEGIN
 namespace synchronization_internal {
 
-class Futex;
 class Waiter;
 
 class KernelTimeout {
@@ -124,10 +123,9 @@
     }
     return 0;
   }
-#endif
 
-  friend class Futex;
   friend class Waiter;
+#endif
 };
 
 inline struct timespec KernelTimeout::MakeAbsTimespec() const {
diff --git a/third_party/abseil-cpp/absl/synchronization/mutex.cc b/third_party/abseil-cpp/absl/synchronization/mutex.cc
index c9d7c41..23919de4 100644
--- a/third_party/abseil-cpp/absl/synchronization/mutex.cc
+++ b/third_party/abseil-cpp/absl/synchronization/mutex.cc
@@ -54,6 +54,7 @@
 #include "absl/base/internal/sysinfo.h"
 #include "absl/base/internal/thread_identity.h"
 #include "absl/base/internal/tsan_mutex_interface.h"
+#include "absl/base/optimization.h"
 #include "absl/base/port.h"
 #include "absl/debugging/stacktrace.h"
 #include "absl/debugging/symbolize.h"
@@ -1154,7 +1155,7 @@
 // if the wait extends past the absolute time specified, even if "s" is still
 // on the mutex queue.  In this case, remove "s" from the queue and return
 // true, otherwise return false.
-ABSL_XRAY_LOG_ARGS(1) void Mutex::Block(PerThreadSynch *s) {
+void Mutex::Block(PerThreadSynch *s) {
   while (s->state.load(std::memory_order_acquire) == PerThreadSynch::kQueued) {
     if (!DecrementSynchSem(this, s, s->waitp->timeout)) {
       // After a timeout, we go into a spin loop until we remove ourselves
@@ -1503,7 +1504,7 @@
   return false;
 }
 
-ABSL_XRAY_LOG_ARGS(1) void Mutex::Lock() {
+void Mutex::Lock() {
   ABSL_TSAN_MUTEX_PRE_LOCK(this, 0);
   GraphId id = DebugOnlyDeadlockCheck(this);
   intptr_t v = mu_.load(std::memory_order_relaxed);
@@ -1521,7 +1522,7 @@
   ABSL_TSAN_MUTEX_POST_LOCK(this, 0, 0);
 }
 
-ABSL_XRAY_LOG_ARGS(1) void Mutex::ReaderLock() {
+void Mutex::ReaderLock() {
   ABSL_TSAN_MUTEX_PRE_LOCK(this, __tsan_mutex_read_lock);
   GraphId id = DebugOnlyDeadlockCheck(this);
   intptr_t v = mu_.load(std::memory_order_relaxed);
@@ -1634,7 +1635,7 @@
   return res;
 }
 
-ABSL_XRAY_LOG_ARGS(1) bool Mutex::TryLock() {
+bool Mutex::TryLock() {
   ABSL_TSAN_MUTEX_PRE_LOCK(this, __tsan_mutex_try_lock);
   intptr_t v = mu_.load(std::memory_order_relaxed);
   if ((v & (kMuWriter | kMuReader | kMuEvent)) == 0 &&  // try fast acquire
@@ -1663,7 +1664,7 @@
   return false;
 }
 
-ABSL_XRAY_LOG_ARGS(1) bool Mutex::ReaderTryLock() {
+bool Mutex::ReaderTryLock() {
   ABSL_TSAN_MUTEX_PRE_LOCK(this,
                            __tsan_mutex_read_lock | __tsan_mutex_try_lock);
   intptr_t v = mu_.load(std::memory_order_relaxed);
@@ -1709,7 +1710,7 @@
   return false;
 }
 
-ABSL_XRAY_LOG_ARGS(1) void Mutex::Unlock() {
+void Mutex::Unlock() {
   ABSL_TSAN_MUTEX_PRE_UNLOCK(this, 0);
   DebugOnlyLockLeave(this);
   intptr_t v = mu_.load(std::memory_order_relaxed);
@@ -1761,7 +1762,7 @@
   return (v & kMuMultipleWaitersMask) == 0;
 }
 
-ABSL_XRAY_LOG_ARGS(1) void Mutex::ReaderUnlock() {
+void Mutex::ReaderUnlock() {
   ABSL_TSAN_MUTEX_PRE_UNLOCK(this, __tsan_mutex_read_lock);
   DebugOnlyLockLeave(this);
   intptr_t v = mu_.load(std::memory_order_relaxed);
@@ -1791,7 +1792,7 @@
     case 1:  // blocked; turn off the designated waker bit
       return ~static_cast<intptr_t>(kMuDesig);
   }
-  ABSL_INTERNAL_UNREACHABLE;
+  ABSL_UNREACHABLE();
 }
 
 // Conditionally ignores the existence of waiting writers if a reader that has
@@ -1805,7 +1806,7 @@
     case 1:  // blocked; pretend there are no waiting writers
       return ~static_cast<intptr_t>(kMuWrWait);
   }
-  ABSL_INTERNAL_UNREACHABLE;
+  ABSL_UNREACHABLE();
 }
 
 // Internal version of LockWhen().  See LockSlowWithDeadline()
diff --git a/third_party/abseil-cpp/absl/types/compare.h b/third_party/abseil-cpp/absl/types/compare.h
index 19b076e..78aa26d 100644
--- a/third_party/abseil-cpp/absl/types/compare.h
+++ b/third_party/abseil-cpp/absl/types/compare.h
@@ -544,9 +544,9 @@
 // Helper functions to do a boolean comparison of two keys given a boolean
 // or three-way comparator.
 // SFINAE prevents implicit conversions to bool (such as from int).
-template <typename Bool,
-          absl::enable_if_t<std::is_same<bool, Bool>::value, int> = 0>
-constexpr bool compare_result_as_less_than(const Bool r) { return r; }
+template <typename BoolT,
+          absl::enable_if_t<std::is_same<bool, BoolT>::value, int> = 0>
+constexpr bool compare_result_as_less_than(const BoolT r) { return r; }
 constexpr bool compare_result_as_less_than(const absl::weak_ordering r) {
   return r < 0;
 }
diff --git a/third_party/blink/renderer/modules/compute_pressure/pressure_observer.cc b/third_party/blink/renderer/modules/compute_pressure/pressure_observer.cc
index 1872e4c..34155eb 100644
--- a/third_party/blink/renderer/modules/compute_pressure/pressure_observer.cc
+++ b/third_party/blink/renderer/modules/compute_pressure/pressure_observer.cc
@@ -51,6 +51,13 @@
 }
 
 // static
+size_t PressureObserver::ToSourceIndex(V8PressureSource::Enum source) {
+  size_t index = static_cast<size_t>(source);
+  DCHECK_LT(index, V8PressureSource::kEnumSize);
+  return index;
+}
+
+// static
 Vector<V8PressureSource> PressureObserver::supportedSources() {
   return Vector<V8PressureSource>(
       {V8PressureSource(V8PressureSource::Enum::kCpu)});
@@ -76,16 +83,15 @@
     return ScriptPromise();
   }
 
-  const size_t source_index = static_cast<size_t>(source.AsEnum());
   auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(
       script_state, exception_state.GetContext());
-  pending_resolvers_[source_index].insert(resolver);
+  pending_resolvers_[ToSourceIndex(source.AsEnum())].insert(resolver);
 
   if (!manager_) {
     LocalDOMWindow* window = To<LocalDOMWindow>(execution_context);
     manager_ = PressureObserverManager::From(*window);
   }
-  manager_->AddObserver(source, this);
+  manager_->AddObserver(source.AsEnum(), this);
 
   return resolver->Promise();
 }
@@ -96,10 +102,10 @@
     return;
 
   // https://wicg.github.io/compute-pressure/#the-unobserve-method
-  manager_->RemoveObserver(source, this);
-  last_record_map_[static_cast<size_t>(source.AsEnum())].Clear();
+  manager_->RemoveObserver(source.AsEnum(), this);
+  last_record_map_[ToSourceIndex(source.AsEnum())].Clear();
   // Reject all pending promises for `source`.
-  RejectPendingResolvers(source, DOMExceptionCode::kNotSupportedError,
+  RejectPendingResolvers(source.AsEnum(), DOMExceptionCode::kNotSupportedError,
                          "Called unobserve method.");
   switch (source.AsEnum()) {
     case V8PressureSource::Enum::kCpu:
@@ -119,7 +125,8 @@
     last_record.Clear();
   // Reject all pending promises.
   for (const auto& source : supportedSources()) {
-    RejectPendingResolvers(source, DOMExceptionCode::kNotSupportedError,
+    RejectPendingResolvers(source.AsEnum(),
+                           DOMExceptionCode::kNotSupportedError,
                            "Called disconnect method.");
   }
   records_.clear();
@@ -151,7 +158,7 @@
   auto* record =
       MakeGarbageCollected<PressureRecord>(source, state, factors, timestamp);
 
-  last_record_map_[static_cast<size_t>(source)] = record;
+  last_record_map_[ToSourceIndex(source)] = record;
 
   // This should happen infrequently since `records_` is supposed
   // to be emptied at every callback invoking or takeRecords().
@@ -171,11 +178,11 @@
                     WrapWeakPersistent(execution_context)));
 }
 
-void PressureObserver::OnBindingSucceeded(V8PressureSource source) {
+void PressureObserver::OnBindingSucceeded(V8PressureSource::Enum source) {
   ResolvePendingResolvers(source);
 }
 
-void PressureObserver::OnBindingFailed(V8PressureSource source,
+void PressureObserver::OnBindingFailed(V8PressureSource::Enum source,
                                        DOMExceptionCode exception_code) {
   RejectPendingResolvers(source, exception_code,
                          "Not available on this platform.");
@@ -183,7 +190,8 @@
 
 void PressureObserver::OnConnectionError() {
   for (const auto& source : supportedSources()) {
-    RejectPendingResolvers(source, DOMExceptionCode::kNotSupportedError,
+    RejectPendingResolvers(source.AsEnum(),
+                           DOMExceptionCode::kNotSupportedError,
                            "Connection error.");
   }
 }
@@ -213,7 +221,7 @@
 bool PressureObserver::PassesRateTest(
     V8PressureSource::Enum source,
     const DOMHighResTimeStamp& timestamp) const {
-  const auto& last_record = last_record_map_[static_cast<size_t>(source)];
+  const auto& last_record = last_record_map_[ToSourceIndex(source)];
 
   if (!last_record)
     return true;
@@ -228,7 +236,7 @@
     V8PressureSource::Enum source,
     V8PressureState::Enum state,
     const Vector<V8PressureFactor>& factors) const {
-  const auto& last_record = last_record_map_[static_cast<size_t>(source)];
+  const auto& last_record = last_record_map_[ToSourceIndex(source)];
 
   if (!last_record)
     return true;
@@ -237,9 +245,8 @@
          !base::ranges::equal(last_record->factors(), factors);
 }
 
-void PressureObserver::ResolvePendingResolvers(V8PressureSource source) {
-  const wtf_size_t source_index = static_cast<wtf_size_t>(source.AsEnum());
-  for (const auto& resolver : pending_resolvers_[source_index]) {
+void PressureObserver::ResolvePendingResolvers(V8PressureSource::Enum source) {
+  for (const auto& resolver : pending_resolvers_[ToSourceIndex(source)]) {
     ScriptState* const script_state = resolver->GetScriptState();
     // Check if callback's resolver is still valid.
     if (!IsInParallelAlgorithmRunnable(resolver->GetExecutionContext(),
@@ -248,14 +255,13 @@
     }
     resolver->Resolve();
   }
-  pending_resolvers_[source_index].clear();
+  pending_resolvers_[ToSourceIndex(source)].clear();
 }
 
-void PressureObserver::RejectPendingResolvers(V8PressureSource source,
+void PressureObserver::RejectPendingResolvers(V8PressureSource::Enum source,
                                               DOMExceptionCode exception_code,
                                               const String& message) {
-  const wtf_size_t source_index = static_cast<wtf_size_t>(source.AsEnum());
-  for (const auto& resolver : pending_resolvers_[source_index]) {
+  for (const auto& resolver : pending_resolvers_[ToSourceIndex(source)]) {
     ScriptState* const script_state = resolver->GetScriptState();
     // Check if callback's resolver is still valid.
     if (!IsInParallelAlgorithmRunnable(resolver->GetExecutionContext(),
@@ -266,7 +272,7 @@
     ScriptState::Scope script_state_scope(resolver->GetScriptState());
     resolver->RejectWithDOMException(exception_code, message);
   }
-  pending_resolvers_[source_index].clear();
+  pending_resolvers_[ToSourceIndex(source)].clear();
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/compute_pressure/pressure_observer.h b/third_party/blink/renderer/modules/compute_pressure/pressure_observer.h
index 8572cf79..200396a 100644
--- a/third_party/blink/renderer/modules/compute_pressure/pressure_observer.h
+++ b/third_party/blink/renderer/modules/compute_pressure/pressure_observer.h
@@ -52,6 +52,8 @@
                                   PressureObserverOptions*,
                                   ExceptionState&);
 
+  static size_t ToSourceIndex(V8PressureSource::Enum);
+
   // PressureObserver IDL implementation.
   ScriptPromise observe(ScriptState*, V8PressureSource, ExceptionState&);
   void unobserve(V8PressureSource);
@@ -71,8 +73,8 @@
                 V8PressureState::Enum,
                 const Vector<V8PressureFactor>&,
                 DOMHighResTimeStamp);
-  void OnBindingSucceeded(V8PressureSource);
-  void OnBindingFailed(V8PressureSource, DOMExceptionCode);
+  void OnBindingSucceeded(V8PressureSource::Enum);
+  void OnBindingFailed(V8PressureSource::Enum, DOMExceptionCode);
   void OnConnectionError();
 
  private:
@@ -85,8 +87,8 @@
                        const Vector<V8PressureFactor>&) const;
 
   // Resolve/reject pending resolvers.
-  void ResolvePendingResolvers(V8PressureSource);
-  void RejectPendingResolvers(V8PressureSource,
+  void ResolvePendingResolvers(V8PressureSource::Enum);
+  void RejectPendingResolvers(V8PressureSource::Enum,
                               DOMExceptionCode,
                               const String&);
 
diff --git a/third_party/blink/renderer/modules/compute_pressure/pressure_observer_manager.cc b/third_party/blink/renderer/modules/compute_pressure/pressure_observer_manager.cc
index e7cdda0..a706a04 100644
--- a/third_party/blink/renderer/modules/compute_pressure/pressure_observer_manager.cc
+++ b/third_party/blink/renderer/modules/compute_pressure/pressure_observer_manager.cc
@@ -26,6 +26,8 @@
 
 namespace {
 
+constexpr auto ToSourceIndex = &blink::PressureObserver::ToSourceIndex;
+
 V8PressureFactor::Enum PressureFactorToV8PressureFactor(PressureFactor factor) {
   switch (factor) {
     case PressureFactor::kThermal:
@@ -77,10 +79,9 @@
 
 PressureObserverManager::~PressureObserverManager() = default;
 
-void PressureObserverManager::AddObserver(V8PressureSource source,
+void PressureObserverManager::AddObserver(V8PressureSource::Enum source,
                                           blink::PressureObserver* observer) {
-  const wtf_size_t source_index = static_cast<wtf_size_t>(source.AsEnum());
-  observers_[source_index].insert(observer);
+  observers_[ToSourceIndex(source)].insert(observer);
 
   if (state_ == State::kUninitialized) {
     DCHECK(!receiver_.is_bound());
@@ -101,14 +102,13 @@
 }
 
 void PressureObserverManager::RemoveObserver(
-    V8PressureSource source,
+    V8PressureSource::Enum source,
     blink::PressureObserver* observer) {
-  const wtf_size_t source_index = static_cast<wtf_size_t>(source.AsEnum());
-  observers_[source_index].erase(observer);
+  observers_[ToSourceIndex(source)].erase(observer);
 
   // Disconnected from the browser process only when PressureObserverManager is
   // active and there is no other observers.
-  if (receiver_.is_bound() && observers_[source_index].empty()) {
+  if (receiver_.is_bound() && observers_[ToSourceIndex(source)].empty()) {
     // TODO(crbug.com/1342184): Consider other sources.
     // For now, "cpu" is the only source, so disconnect directly.
     Reset();
@@ -119,7 +119,7 @@
     blink::PressureObserver* observer) {
   // TODO(crbug.com/1342184): Consider other sources.
   // For now, "cpu" is the only source.
-  auto source = V8PressureSource(V8PressureSource::Enum::kCpu);
+  auto source = V8PressureSource::Enum::kCpu;
   RemoveObserver(source, observer);
 }
 
@@ -138,15 +138,13 @@
   if (!PassesPrivacyTest())
     return;
 
-  // TODO(crbug.com/1342184): Consider other sources.
-  // For now, "cpu" is the only source.
-  const wtf_size_t source_index =
-      static_cast<wtf_size_t>(V8PressureSource::Enum::kCpu);
-
   // New observers may be created and added. Take a snapshot so as
   // to safely iterate.
+  //
+  // TODO(crbug.com/1342184): Consider other sources.
+  // For now, "cpu" is the only source.
   HeapVector<Member<blink::PressureObserver>> observers(
-      observers_[source_index]);
+      observers_[ToSourceIndex(V8PressureSource::Enum::kCpu)]);
   for (const auto& observer : observers) {
     Vector<V8PressureFactor> v8_factors;
     for (const auto& factor : update->factors) {
@@ -249,16 +247,15 @@
 }
 
 void PressureObserverManager::DidBindObserver(
-    V8PressureSource source,
+    V8PressureSource::Enum source,
     mojom::blink::PressureStatus status) {
   DCHECK_EQ(state_, State::kInitializing);
   DCHECK(receiver_.is_bound());
   DCHECK(pressure_service_.is_bound());
 
-  const wtf_size_t source_index = static_cast<wtf_size_t>(source.AsEnum());
   // Take a snapshot so as to safely iterate.
   HeapVector<Member<blink::PressureObserver>> observers(
-      observers_[source_index]);
+      observers_[ToSourceIndex(source)]);
   switch (status) {
     case mojom::blink::PressureStatus::kOk: {
       state_ = State::kInitialized;
diff --git a/third_party/blink/renderer/modules/compute_pressure/pressure_observer_manager.h b/third_party/blink/renderer/modules/compute_pressure/pressure_observer_manager.h
index 93cc3fc..a0e52089 100644
--- a/third_party/blink/renderer/modules/compute_pressure/pressure_observer_manager.h
+++ b/third_party/blink/renderer/modules/compute_pressure/pressure_observer_manager.h
@@ -36,8 +36,8 @@
   PressureObserverManager(const PressureObserverManager&) = delete;
   PressureObserverManager& operator=(const PressureObserverManager&) = delete;
 
-  void AddObserver(V8PressureSource, blink::PressureObserver*);
-  void RemoveObserver(V8PressureSource, blink::PressureObserver*);
+  void AddObserver(V8PressureSource::Enum, blink::PressureObserver*);
+  void RemoveObserver(V8PressureSource::Enum, blink::PressureObserver*);
   void RemoveObserverFromAllSources(blink::PressureObserver*);
 
   // ContextLifecycleStateimplementation.
@@ -69,7 +69,7 @@
   // Called when `receiver_` is disconnected.
   void Reset();
 
-  void DidBindObserver(V8PressureSource, mojom::blink::PressureStatus);
+  void DidBindObserver(V8PressureSource::Enum, mojom::blink::PressureStatus);
 
   constexpr static size_t kPressureSourceSize = V8PressureSource::kEnumSize;
 
diff --git a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder_test.cc b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder_test.cc
index 9abf53b..9b880904 100644
--- a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder_test.cc
+++ b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder_test.cc
@@ -7,6 +7,7 @@
 #include <cmath>
 #include <memory>
 #include <ostream>
+#include <utility>
 #include <vector>
 
 #include "base/bit_cast.h"
@@ -567,7 +568,7 @@
 
   scoped_refptr<SharedBuffer> data = ReadFile(avif_file);
   ASSERT_TRUE(data.get());
-  decoder->SetData(data.get(), true);
+  decoder->SetData(std::move(data), true);
 
   if (error_phase == ErrorPhase::kParse) {
     EXPECT_FALSE(decoder->IsSizeAvailable());
@@ -602,7 +603,7 @@
   ASSERT_TRUE(data);
 
   auto decoder = CreateAVIFDecoder();
-  decoder->SetData(data.get(), true);
+  decoder->SetData(std::move(data), true);
 
   ASSERT_TRUE(decoder->IsDecodedSizeAvailable());
   ASSERT_TRUE(decoder->CanDecodeToYUV());
@@ -805,7 +806,7 @@
   constexpr char kHeader[] = {0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70};
   auto buffer = SharedBuffer::Create();
   buffer->Append(kHeader, std::size(kHeader));
-  decoder->SetData(buffer.get(), false);
+  decoder->SetData(std::move(buffer), false);
   EXPECT_FALSE(decoder->ImageHasBothStillAndAnimatedSubImages());
 }
 
@@ -1067,7 +1068,7 @@
   EXPECT_EQ(param.compression_format,
             ImageDecoder::GetCompressionFormat(data, "image/avif"));
 #endif
-  decoder->SetData(data.get(), true);
+  decoder->SetData(std::move(data), true);
   EXPECT_EQ(1u, decoder->FrameCount());
   EXPECT_EQ(kAnimationNone, decoder->RepetitionCount());
   EXPECT_EQ(param.bit_depth > 8, decoder->ImageIsHighBitDepth());
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
index f5d6649d..d729607 100644
--- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
+++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -1026,7 +1026,7 @@
 ### external/wpt/css/css-text/overflow-wrap/
 crbug.com/1019695 external/wpt/css/css-text/overflow-wrap/overflow-wrap-shaping-001.html [ Failure ]
 crbug.com/1019695 external/wpt/css/css-text/overflow-wrap/overflow-wrap-shaping-002.html [ Failure ]
-crbug.com/1020749 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-004.html [ Failure ]
+crbug.com/1020749 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-004.tentative.html [ Failure ]
 crbug.com/1205334 external/wpt/css/css-text/overflow-wrap/overflow-wrap-min-content-size-009.html [ Failure ]
 
 ### external/wpt/css/css-text/shaping/
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index ffac4c4..10c5f394 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -448,7 +448,6 @@
 
 # This test depends on synchronous focus() which does not exist (anymore?).
 crbug.com/1074482 external/wpt/html/interaction/focus/the-autofocus-attribute/update-the-rendering.html [ Failure ]
-crbug.com/1074482 external/wpt/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-cross-origin-tentative.https.sub.html [ Failure Pass ]
 crbug.com/1104125 external/wpt/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html [ Failure Pass ]
 
 # This test has a bug in it that prevents it from being able to deal with order
@@ -2983,6 +2982,9 @@
 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/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 [ Linux ] external/wpt/resource-timing/response-status-code.html [ Timeout ]
@@ -3012,173 +3014,59 @@
 crbug.com/626703 [ Win11 ] external/wpt/credential-management/fedcm-iframe.https.html [ Timeout ]
 crbug.com/626703 [ Win11 ] external/wpt/fetch/metadata/generated/element-meta-refresh.optional.sub.html [ Timeout ]
 crbug.com/626703 [ Win11 ] virtual/pending-beacon/external/wpt/pending-beacon/pending_post_beacon-cors.tentative.https.window.html [ Timeout ]
-crbug.com/626703 [ Win11 ] virtual/prefetch/external/wpt/speculation-rules/prefetch/out-of-document-rule-set.https.html?include=FollowRedirect [ Timeout ]
 crbug.com/626703 [ Mac11-arm64 ] virtual/pending-beacon/external/wpt/pending-beacon/pending_post_beacon-cors.tentative.https.window.html [ Timeout ]
 crbug.com/626703 external/wpt/geolocation-API/enabled-by-permission-policy-attribute-redirect-on-load.https.sub.html [ Timeout ]
 crbug.com/626703 external/wpt/geolocation-API/enabled-by-permission-policy-attribute.https.sub.html [ Timeout ]
 crbug.com/626703 external/wpt/geolocation-API/enabled-by-permissions-policy.https.sub.html [ Timeout ]
 crbug.com/626703 external/wpt/geolocation-API/enabled-on-self-origin-by-permissions-policy.https.sub.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/shape-detection/detected-boundingBox-read-only.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/shape-detection/detected-postMessage.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/shape-detection/detection-HTMLCanvasElement.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/shape-detection/detection-HTMLImageElement.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/shape-detection/detection-HTMLVideoElement.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/shape-detection/detection-ImageBitmap.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/shape-detection/detection-ImageData.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/shape-detection/detection-getSupportedFormats.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/shape-detection/detection-on-worker.https.worker.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/shape-detection/detection-options.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/shape-detection/detector-same-object.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/video-rvfc/request-video-frame-callback-during-xr-session.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/web-nfc/NDEFReader_make-read-only.https.window.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/web-nfc/NDEFReader_scan.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/web-nfc/NDEFReader_write.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/anchors/ar_anchor_freefloating_create_move.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/anchors/ar_anchor_freefloating_delay_creation.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/anchors/ar_anchor_freefloating_failure.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/anchors/ar_anchor_freefloating_pause_resume_stop.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/anchors/ar_anchor_getAnchors.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/anchors/ar_anchor_states.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/ar-module/xrDevice_isSessionSupported_immersive-ar.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/ar-module/xrDevice_requestSession_immersive-ar.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/ar-module/xrSession_environmentBlendMode.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/ar-module/xrSession_interactionMode.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/camera-access/xrCamera_resolution.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_dataUnavailable.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_inactiveFrame.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_incorrectUsage.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_luminance_alpha_dataValid.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_staleView.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/depth-sensing/depth_sensing_notEnabled.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/dom-overlay/ar_dom_overlay.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/dom-overlay/ar_dom_overlay_hit_test.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/dom-overlay/nested_fullscreen.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/events_input_source_recreation.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/events_input_sources_change.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/events_referenceSpace_reset_immersive.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/events_session_select.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/events_session_select_subframe.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/events_session_squeeze.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/exclusive_requestFrame_nolayer.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/gamepads-module/xrInputSource_gamepad_disconnect.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/gamepads-module/xrInputSource_gamepad_input_registered.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/getInputPose_handedness.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/getInputPose_pointer.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/getViewerPose_emulatedPosition.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/hit-test/ar_hittest_source_cancel.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/hit-test/ar_hittest_subscription_inputSources.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/hit-test/ar_hittest_subscription_refSpaces.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/hit-test/ar_hittest_subscription_states_regular.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/hit-test/ar_hittest_subscription_states_transient.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/hit-test/ar_hittest_subscription_unlocalizable.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/layers/xrWebGLBinding_constructor.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/light-estimation/xrFrame_getLightEstimate_oldSession.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/light-estimation/xrFrame_getLightEstimate_staleFrame.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/light-estimation/xrFrame_getLightEstimate_valid.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/light-estimation/xrSession_getLightProbe_ended.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/light-estimation/xrSession_getLightProbe_notEnabled.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/light-estimation/xrSession_getLightProbe_valid.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/light-estimation/xrWebGLBinding_getReflectionCubeMap.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/navigator_xr_sameObject.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/render_state_update.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/render_state_vertical_fov_immersive.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/render_state_vertical_fov_inline.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/webGLCanvasContext_create_xrcompatible.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/webGLCanvasContext_makecompatible_contextlost.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/webGLCanvasContext_makecompatible_reentrant.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/webxr_feature_policy.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrBoundedReferenceSpace_updates.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrDevice_disconnect_ends.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrDevice_isSessionSupported_immersive.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrDevice_isSessionSupported_immersive_unsupported.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrDevice_requestSession_immersive.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrDevice_requestSession_immersive_unsupported.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/xrDevice_requestSession_optionalFeatures.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrFrame_getPose.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrFrame_getViewerPose_getPose.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrFrame_getViewerPose_getPose_identities.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrFrame_lifetime.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrFrame_session_sameObject.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrInputSource_add_remove.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrInputSource_emulatedPosition.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/xrInputSource_getPose_targetRay_grip.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrInputSource_profiles.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrInputSource_sameObject.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrPose_transform_sameObject.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrReferenceSpace_originOffset.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrReferenceSpace_originOffsetBounded.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/xrReferenceSpace_originOffset_viewer.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrReferenceSpace_relationships.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrRigidTransform_constructor.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrRigidTransform_inverse.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrRigidTransform_sameObject.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrSession_cancelAnimationFrame.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/xrSession_end.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrSession_features_deviceSupport.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrSession_input_events_end.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrSession_prevent_multiple_exclusive.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrSession_requestAnimationFrame_callback_calls.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrSession_requestAnimationFrame_data_valid.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrSession_requestAnimationFrame_timestamp.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrSession_requestReferenceSpace.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/xrSession_requestReferenceSpace_features.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrSession_requestSessionDuringEnd.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/xrSession_sameObject.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrSession_viewer_availability.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrSession_viewer_referenceSpace.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/xrView_eyes.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrView_match.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrView_oneframeupdate.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrView_sameObject.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrViewerPose_secondaryViews.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/webxr/xrViewerPose_views_sameObject.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrViewport_valid.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrWebGLLayer_constructor.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrWebGLLayer_framebuffer_draw.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrWebGLLayer_framebuffer_sameObject.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrWebGLLayer_framebuffer_scale.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrWebGLLayer_opaque_framebuffer.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrWebGLLayer_opaque_framebuffer_stencil.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/xrWebGLLayer_viewports.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 ]
 crbug.com/626703 [ Linux ] virtual/abort-signal-remove/external/wpt/web-nfc/NDEFReader_scan.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] wpt_internal/forms/file/file-input-webkitdirectory-key-enter-prevent-keypress.html [ Timeout ]
 crbug.com/626703 [ Linux ] wpt_internal/storage/quota/partitioned-webkitStorageInfo-persistent-quota-usage-details.tentative.sub.html [ Timeout ]
-crbug.com/626703 [ Linux ] wpt_internal/vibration/vibration-iframe.html [ Timeout ]
 crbug.com/626703 [ Linux ] wpt_internal/vibration/vibration.html [ Timeout ]
-crbug.com/626703 [ Linux ] wpt_internal/webmidi/add-port.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] wpt_internal/webmidi/implicit-open.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] wpt_internal/webmidi/loopback-receive.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] wpt_internal/webmidi/loopback-with-timestamp.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] wpt_internal/webmidi/open-close.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] wpt_internal/webmidi/permission.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] wpt_internal/webmidi/requestmidiaccess-fail.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] wpt_internal/webmidi/requestmidiaccess-options.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] wpt_internal/webmidi/requestmidiaccess-upgrade.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] wpt_internal/webmidi/requestmidiaccess.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] wpt_internal/webmidi/send-messages.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] wpt_internal/webmidi/send-system-messages.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] wpt_internal/webxr/ar/ar_anchor_getAnchors_null.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] wpt_internal/webxr/ar/ar_hittestsource_lifetimes.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] wpt_internal/webxr/ar/iframe-oopif.sub.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] wpt_internal/webxr/events_deviceconnect.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] wpt_internal/webxr/render_state_vertical_fov_inline.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] wpt_internal/webxr/xrDevice_supportsSession_immersive.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] wpt_internal/webxr/xrDevice_supportsSession_immersive_unsupported.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] wpt_internal/webxr/xrFrame_getPose.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] wpt_internal/webxr/xrSession_dataProviderDisconnect_immersive.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] wpt_internal/webxr/xrSession_dataProviderDisconnect_inline.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] wpt_internal/webxr/xrSession_environmentBlendMode.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] wpt_internal/webxr/xrSession_environmentProviderDisconnect.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] wpt_internal/webxr/xrSession_framesThrottled.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] wpt_internal/webxr/xrWebGLLayer_dirty_framebuffer.https.html [ Timeout ]
 crbug.com/626703 [ Mac11 ] external/wpt/credential-management/fedcm-network-requests.https.html [ Timeout ]
 crbug.com/626703 [ Win11 ] external/wpt/credential-management/fedcm-network-requests.https.html [ Timeout ]
 crbug.com/626703 [ Mac11 ] external/wpt/fetch/private-network-access/iframe.tentative.https.window.html [ Timeout ]
@@ -3485,12 +3373,12 @@
 # overlay scrollbars have been fixed (crrev.com/c/3455024).
 crbug.com/1296816 [ Win ] virtual/overlay-scrollbar/plugin-overlay-scrollbar-mouse-capture.html [ Failure ]
 
-crbug.com/964181 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-002.html [ Failure ]
-crbug.com/964181 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-003.html [ Failure ]
-crbug.com/964181 external/wpt/css/css-text/word-break/word-break-break-all-inline-004.html [ Failure ]
-crbug.com/964181 external/wpt/css/css-text/word-break/word-break-break-all-inline-007.html [ Failure ]
+crbug.com/964181 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-002.tentative.html [ Failure ]
+crbug.com/964181 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-003.tentative.html [ Failure ]
+crbug.com/964181 external/wpt/css/css-text/word-break/word-break-break-all-inline-004.tentative.html [ Failure ]
+crbug.com/964181 external/wpt/css/css-text/word-break/word-break-break-all-inline-007.tentative.html [ Failure ]
 crbug.com/964181 external/wpt/css/css-text/word-break/word-break-break-all-inline-009.html [ Failure ]
-crbug.com/964181 external/wpt/css/css-text/word-break/word-break-break-all-inline-010.html [ Failure ]
+crbug.com/964181 external/wpt/css/css-text/word-break/word-break-break-all-inline-010.tentative.html [ Failure ]
 
 crbug.com/1017164 external/wpt/css/css-text/word-break/word-break-break-all-006.html [ Failure ]
 crbug.com/1017164 external/wpt/css/css-text/word-break/word-break-break-all-007.html [ Failure ]
@@ -4626,7 +4514,6 @@
 crbug.com/1153648 external/wpt/html/cross-origin-opener-policy/navigate-top-to-aboutblank.https.html [ Failure ]
 
 # Stale revalidation shouldn't be blocked:
-crbug.com/1079188 external/wpt/fetch/stale-while-revalidate/revalidate-not-blocked-by-csp.html [ Timeout ]
 
 # the inspector-protocol/media tests only work in the virtual test environment.
 crbug.com/1074129 inspector-protocol/media/media-player.js [ Skip Timeout ]
@@ -4901,14 +4788,11 @@
 # Expected to fail - Chrome's WebXR Depth Sensing API implementation does not currently support `gpu-optimized` usage mode.
 crbug.com/1179461 [ Mac ] external/wpt/webxr/depth-sensing/gpu/depth_sensing_gpu_dataUnavailable.https.html [ Failure ]
 crbug.com/1179461 [ Win ] external/wpt/webxr/depth-sensing/gpu/depth_sensing_gpu_dataUnavailable.https.html [ Failure ]
-crbug.com/1179461 [ Linux ] external/wpt/webxr/depth-sensing/gpu/depth_sensing_gpu_dataUnavailable.https.html [ Failure ]
 crbug.com/1179461 external/wpt/webxr/depth-sensing/gpu/depth_sensing_gpu_inactiveFrame.https.html [ Failure ]
 crbug.com/1179461 [ Mac ] external/wpt/webxr/depth-sensing/gpu/depth_sensing_gpu_incorrectUsage.https.html [ Failure ]
 crbug.com/1179461 [ Win ] external/wpt/webxr/depth-sensing/gpu/depth_sensing_gpu_incorrectUsage.https.html [ Failure ]
-crbug.com/1179461 [ Linux ] external/wpt/webxr/depth-sensing/gpu/depth_sensing_gpu_incorrectUsage.https.html [ Failure ]
 crbug.com/1179461 [ Mac ] external/wpt/webxr/depth-sensing/gpu/depth_sensing_gpu_staleView.https.html [ Failure ]
 crbug.com/1179461 [ Win ] external/wpt/webxr/depth-sensing/gpu/depth_sensing_gpu_staleView.https.html [ Failure ]
-crbug.com/1179461 [ Linux ] external/wpt/webxr/depth-sensing/gpu/depth_sensing_gpu_staleView.https.html [ Failure ]
 
 # Sheriff 2021-02-17
 
@@ -5531,7 +5415,6 @@
 crbug.com/1249176 [ Mac12-arm64 ] external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-011.html [ Crash Failure Pass ]
 crbug.com/1249176 [ Mac11-arm64 ] external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-018.html [ Failure Pass ]
 crbug.com/1249176 [ Mac12-arm64 ] external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-018.html [ Failure Pass ]
-crbug.com/1249176 [ Mac11-arm64 ] http/tests/security/cross-origin-shared-worker-allowed.html [ Crash Pass ]
 crbug.com/1249176 [ Mac12-arm64 ] http/tests/security/cross-origin-shared-worker-allowed.html [ Crash Pass ]
 
 # Sheriff 2021-09-16
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 783f692..673966c6 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
@@ -171300,6 +171300,34 @@
      ]
     },
     "css-text": {
+     "bidi": {
+      "bidi-lines-001.html": [
+       "c49d5729baa94097cfa0fc3c684a9d881dfd4c2b",
+       [
+        null,
+        [
+         [
+          "/css/css-text/bidi/reference/bidi-lines-001-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
+      "bidi-lines-002.html": [
+       "5a90387a1c498ff53d626f116705f270fb83b099",
+       [
+        null,
+        [
+         [
+          "/css/css-text/bidi/reference/bidi-lines-002-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ]
+     },
      "boundary-shaping": {
       "boundary-shaping-001.html": [
        "d6c8fa2b236f56e11f07b15c491321e062972ca3",
@@ -175894,6 +175922,71 @@
         {}
        ]
       ],
+      "line-breaking-023.html": [
+       "b8e957dc1b6cccd07ecef84b8b1f515a3bf04bb7",
+       [
+        null,
+        [
+         [
+          "/css/css-text/line-breaking/reference/line-breaking-023-ref.html",
+          "!="
+         ]
+        ],
+        {}
+       ]
+      ],
+      "line-breaking-024.html": [
+       "14b8c9b93c9baacfbeecee6aecae1774e8b6eeb1",
+       [
+        null,
+        [
+         [
+          "/css/css-text/line-breaking/reference/line-breaking-024-ref.html",
+          "!="
+         ]
+        ],
+        {}
+       ]
+      ],
+      "line-breaking-025.html": [
+       "57c9ee4d3a7b245bacd700424a70af351301180e",
+       [
+        null,
+        [
+         [
+          "/css/css-text/line-breaking/reference/line-breaking-025-ref.html",
+          "!="
+         ]
+        ],
+        {}
+       ]
+      ],
+      "line-breaking-026.html": [
+       "fdabe9fa07ad75f2d76f1f558c58adfc50c499ec",
+       [
+        null,
+        [
+         [
+          "/css/css-text/line-breaking/reference/line-breaking-026-ref.html",
+          "!="
+         ]
+        ],
+        {}
+       ]
+      ],
+      "line-breaking-027.html": [
+       "de6ee4cbde3ef26a336bd84ca2a24acf8fbe6080",
+       [
+        null,
+        [
+         [
+          "/css/css-text/line-breaking/reference/line-breaking-027-ref.html",
+          "!="
+         ]
+        ],
+        {}
+       ]
+      ],
       "line-breaking-atomic-001.html": [
        "e071378c95fd436484a3056ecb2ba6ff35ddbaae",
        [
@@ -177079,7 +177172,7 @@
         {}
        ]
       ],
-      "overflow-wrap-anywhere-inline-002.html": [
+      "overflow-wrap-anywhere-inline-002.tentative.html": [
        "38dc19631d3794e011f046acb225471aec2363dd",
        [
         null,
@@ -177092,8 +177185,8 @@
         {}
        ]
       ],
-      "overflow-wrap-anywhere-inline-003.html": [
-       "511294901d914cf8f836ea8b50662544fb72dbf4",
+      "overflow-wrap-anywhere-inline-003.tentative.html": [
+       "9ed035fdc84d29cb88ed0726afc6f4847fcc4474",
        [
         null,
         [
@@ -177105,7 +177198,7 @@
         {}
        ]
       ],
-      "overflow-wrap-anywhere-inline-004.html": [
+      "overflow-wrap-anywhere-inline-004.tentative.html": [
        "e498e1eff16a40ce96279173b42c3827b566ba5c",
        [
         null,
@@ -179109,6 +179202,19 @@
         {}
        ]
       ],
+      "text-align-match-parent-05.html": [
+       "390d98acc75e6d53a4fc352524af542d6ce00d8f",
+       [
+        null,
+        [
+         [
+          "/css/css-text/text-align/text-align-match-parent-05-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
       "text-align-match-parent-root-logical.html": [
        "719fa04fe70b5c6d6f069c2ee21a0083587ef7f4",
        [
@@ -187146,7 +187252,7 @@
         {}
        ]
       ],
-      "word-break-break-all-inline-004.html": [
+      "word-break-break-all-inline-004.tentative.html": [
        "2fad813661d0561666b9dd0d0cf71213c63e9352",
        [
         null,
@@ -187189,7 +187295,7 @@
         {}
        ]
       ],
-      "word-break-break-all-inline-007.html": [
+      "word-break-break-all-inline-007.tentative.html": [
        "bc5a08d38a505b1b08f204e6d243b43fa3dd34bc",
        [
         null,
@@ -187228,8 +187334,8 @@
         {}
        ]
       ],
-      "word-break-break-all-inline-010.html": [
-       "3c2df3cea296b32b4bb4972ed50e28e9d3f5427b",
+      "word-break-break-all-inline-010.tentative.html": [
+       "36c9e47ff54d50d3311910a1ab4b6c619e56b9e5",
        [
         null,
         [
@@ -260765,11 +260871,11 @@
   "support": {
    ".cache": {
     "gitignore2.json": [
-     "4e67c387b96a28e08daae3fc820a3c2f0054851f",
+     "5311421387f19d50ff6ddc37e581ea8d1aa2cdc5",
      []
     ],
     "mtime.json": [
-     "ac7cc593b956a25e53df49457971838981506980",
+     "7f5e8bcc2fce951fa47977d9ca1a850598e315a2",
      []
     ]
    },
@@ -260992,7 +261098,7 @@
       []
      ],
      "url-charset.window.js.ini": [
-      "bf7e035b0f4fe29c89de1cb228abd31ce882e4ec",
+      "3b6728bf6a26cf7a55ccfd65d73a54650eb36e83",
       []
      ],
      "url-lifetime.html.ini": [
@@ -261038,6 +261144,10 @@
      "e9ec6bf98544bbbf3bf03b0aca3ccbfdef063eb6",
      []
     ],
+    "bindings-inject-values-bypass-chain.html.ini": [
+     "ab75b1b8be2142a31c2653c6cbef5204d9df5c75",
+     []
+    ],
     "database-names-by-origin.html.ini": [
      "21e89fe0a7caf86946c6fe5d345b6fb4b68defa9",
      []
@@ -261047,7 +261157,7 @@
      []
     ],
     "idbobjectstore_batchGetAll_largeValue.tentative.any.js.ini": [
-     "d66e6b887896c6d60dcf800bde54a84d722ecd0d",
+     "8aa6e3eb2b931d2f05a8d929bc9bf71bbe2a33d5",
      []
     ],
     "resources": {
@@ -261912,7 +262022,7 @@
       []
      ],
      "test.html.ini": [
-      "c8912513d1acc0793255ac02ac33f112376bf92c",
+      "4cb35b9b730cf71f8d8b4fae76427cd1e4019682",
       []
      ],
      "xhtml.1": [
@@ -266225,16 +266335,12 @@
       "7eb847a0268bd10502726ba130c396651e1e88c2",
       []
      ],
-     "blob-url-inherits-from-initiator.sub.html.ini": [
-      "6341f19658e94450ac244cba556407c313da3210",
-      []
-     ],
      "history-iframe.sub.html.ini": [
       "3d47c07320d23e9f61a5faf20eee5119d20d0b8a",
       []
      ],
      "history.sub.html.ini": [
-      "9728b70673c3922eafeeb1decc0608dd5a1ab388",
+      "5d8b1077eae12aa530e4176d66acb5f7c5db4d6d",
       []
      ],
      "iframe-all-local-schemes.sub.html.ini": [
@@ -266306,6 +266412,10 @@
      "unsandboxed-data-scheme.html.sub.headers": [
       "f4a6088578f0ad11573989f13da3146342fde302",
       []
+     ],
+     "window.html.ini": [
+      "b774166194521b76da5d126bdb84682a9105b6e6",
+      []
      ]
     },
     "inside-worker": {
@@ -266528,7 +266638,7 @@
       []
      ],
      "prefetch-header-allowed.html.ini": [
-      "126f726516e8f7d6b2073faa3e8764d7230ae16a",
+      "1aa1e894994ce74a612daa45fa27aaf85c8efcdf",
       []
      ],
      "prefetch-header-blocked-by-default.html.headers": [
@@ -267473,7 +267583,7 @@
      []
     ],
     "cookieStore_set_arguments.https.any.js.ini": [
-     "f5c29c66e90afde45b8e12929a5bd569aeda1d94",
+     "a1ab72a598b5d4f7d3f104d2fa2ab4d3264a86eb",
      []
     ],
     "cookieStore_subscribe_arguments.https.any.js.ini": [
@@ -267766,7 +267876,7 @@
     },
     "samesite": {
      "form-post-blank-reload.https.html.ini": [
-      "474bdcb939113d28f9ec5d5eeedd78f0f3c471d7",
+      "25c3e4acef5bf932cb514f79d326a9118b69c153",
       []
      ],
      "form-post-blank.https.html.ini": [
@@ -270835,7 +270945,7 @@
        []
       ],
       "float-nowrap-4.html.ini": [
-       "5b5e8dbb4ca2103520f29ee0352a8a413b00b51c",
+       "118137923cf41d279118a91dc1e6d3caca8e1ef7",
        []
       ],
       "float-nowrap-5-ref.html": [
@@ -276744,7 +276854,7 @@
       []
      ],
      "Element-getAnimations-dynamic-changes.tentative.html.ini": [
-      "cd79bce0007ca0a053223c57c0ae0e86b094c20e",
+      "42b61d6f41cfdf580f6218af564a8fd3b594a116",
       []
      ],
      "KeyframeEffect-getKeyframes.tentative-expected.txt": [
@@ -281605,10 +281715,6 @@
       "f596b559b0e26b9c03d47b7dcab966a4d091308b",
       []
      ],
-     "all-prop-revert-layer-noop.html.ini": [
-      "2d361077e6ba0febfbed2ec0d38a48b2516520fa",
-      []
-     ],
      "all-prop-revert-visited-ref.html": [
       "0ef326c2722a4f65f6657d7740a990c079b08289",
       []
@@ -282839,7 +282945,7 @@
        []
       ],
       "nested-query-containers.html.ini": [
-       "076a237cb6ed39fb8a51cd6b9ce67f6cbdab5f88",
+       "e92a5bb1a4fa7e9a60bb42f506d455adf8c71d9a",
        []
       ],
       "percentage-padding-orthogonal-expected.txt": [
@@ -283540,7 +283646,7 @@
       []
      ],
      "content-none-option.html.ini": [
-      "01e09de35f928a3751c48a8e2096dcaac7ef8dd6",
+      "4a2bf32c973ddec9d938f3820069b0dfdc27eefe",
       []
      ],
      "content-none-root-block-ref.html": [
@@ -287510,7 +287616,7 @@
       []
      ],
      "image-as-flexitem-size-007v.html.ini": [
-      "af286b78b87333a0d4219cbe6702798373ef4162",
+      "a76df177f3188b6f7b243e879b0c8997905d9cf0",
       []
      ],
      "interactive": {
@@ -288020,7 +288126,7 @@
       []
      ],
      "scrollbars.html.ini": [
-      "61aafeb32d0aec3849dac9f9715d72fe0795db2c",
+      "63fe9f1fdfa860517f25ccacf28eb939206c8c94",
       []
      ],
      "select-element-zero-height-001-ref.html": [
@@ -300767,7 +300873,7 @@
        []
       ],
       "Initial-letter-breaking-rtl.html.ini": [
-       "9451204c3f8e54260349e0a2b1aaf03911bce7bd",
+       "46ebc05b8e015794e21ad5efbbb278c2a1c4a978",
        []
       ],
       "Initial-letter-breaking-vlr-ref.html": [
@@ -300775,7 +300881,7 @@
        []
       ],
       "Initial-letter-breaking-vlr.html.ini": [
-       "eb1934959aac2f6cb97b9e30c1779095f18306f6",
+       "0a5f574510cb5f345a90739935b5e98b45045d91",
        []
       ],
       "Initial-letter-breaking-vrl-ref.html": [
@@ -300783,7 +300889,7 @@
        []
       ],
       "Initial-letter-breaking-vrl.html.ini": [
-       "5e2b2a74cc4d9e4f8705bcd7b03560faf6b02136",
+       "e5040afd3078b86080090466669e3b0db6411fad",
        []
       ],
       "Initial-letter-breaking.html.ini": [
@@ -300799,7 +300905,7 @@
        []
       ],
       "initial-letter-block-position-drop-over-ruby-tall.html.ini": [
-       "7ba52f02d6af7e6b823d92b68bb40d05b8f623d9",
+       "c971ae336f29936e17db2f18d4d396216a7c1f69",
        []
       ],
       "initial-letter-block-position-drop-over-ruby.html.ini": [
@@ -300831,7 +300937,7 @@
        []
       ],
       "initial-letter-block-position-margins-rtl.html.ini": [
-       "59e19d6cc6bdf6b9f0ccad40c043f6fe13f248e2",
+       "4954d8f4a8db0b1d5b0d823b6afc0a867f54d895",
        []
       ],
       "initial-letter-block-position-margins-vlr-ref.html": [
@@ -300879,7 +300985,7 @@
        []
       ],
       "initial-letter-block-position-raise-under-ruby-tall.html.ini": [
-       "9de6f5239f65c9b9304e7e3cde450b6955382295",
+       "60f3521d23121d823dd9aa9651134b35bc1ba7ef",
        []
       ],
       "initial-letter-block-position-raise-under-ruby.html.ini": [
@@ -300907,7 +301013,7 @@
        []
       ],
       "initial-letter-drop-initial-vlr.html.ini": [
-       "160941f6aecc0de467460153ffd661a29afa8b9b",
+       "984123ce1ba95aaa082597019805d29f51c77e3b",
        []
       ],
       "initial-letter-drop-initial-vrl-ref.html": [
@@ -300919,7 +301025,7 @@
        []
       ],
       "initial-letter-drop-initial.html.ini": [
-       "bda49d3ccb569063ca848311b14c11d0f95c0743",
+       "497ccbc87b10a361c6b9e430069b7a98ab683bcf",
        []
       ],
       "initial-letter-float-001-ref.html": [
@@ -300931,7 +301037,7 @@
        []
       ],
       "initial-letter-float-001-rtl.html.ini": [
-       "339ba097181503a01941c72029c50429997669b5",
+       "d350ddf83f1e17d4136d8752eb9a1968572ec2f3",
        []
       ],
       "initial-letter-float-001-vlr-ref.html": [
@@ -300947,11 +301053,11 @@
        []
       ],
       "initial-letter-float-001-vrl.html.ini": [
-       "a18c5464f5026e45a21f831363c83c8eca388b34",
+       "ff51dd5cdcff0bccc5d40823c59f455f9227ecb4",
        []
       ],
       "initial-letter-float-001.html.ini": [
-       "ae13c19797a134284cfe0ffd2c225b9e7bbc0b3e",
+       "4b45bbf55e041276119bcbd59878946c3a181b5b",
        []
       ],
       "initial-letter-float-002-ref.html": [
@@ -300995,7 +301101,7 @@
        []
       ],
       "initial-letter-indentation-rtl.html.ini": [
-       "495a53a6ef2d7a4f80602738e4b7058d62834041",
+       "9cd2cdc3b127278f137aa55c1f97d78f9a2b21e8",
        []
       ],
       "initial-letter-indentation.html.ini": [
@@ -301019,7 +301125,7 @@
        []
       ],
       "initial-letter-raise-initial-rtl.html.ini": [
-       "679ba2c613504a1e2a9d001d28604dcff64e3239",
+       "518607759b544245fcf09960370b14928f1905dc",
        []
       ],
       "initial-letter-raise-initial-vlr-ref.html": [
@@ -301039,7 +301145,7 @@
        []
       ],
       "initial-letter-raise-initial.html.ini": [
-       "73516018f2e071792ef7eefb28d0fecd73b34972",
+       "e37e026a1f13a8aa9ae6d202ea3592aa01932f60",
        []
       ],
       "initial-letter-raised-sunken-caps-raise-ref.html": [
@@ -301091,7 +301197,7 @@
        []
       ],
       "initial-letter-sunk-initial-vlr.html.ini": [
-       "63edb9daefeaa31d03daeaadcb51df9c06d934a9",
+       "82403e6cdd18b0ebec9a7c35b1b47fc6b75784e1",
        []
       ],
       "initial-letter-sunk-initial-vrl-ref.html": [
@@ -301099,11 +301205,11 @@
        []
       ],
       "initial-letter-sunk-initial-vrl.html.ini": [
-       "77a501b58596bd661170dd5bd74ceaac0d7c228d",
+       "145423c11791d55ae88c994d027a2d62c7a4c7e1",
        []
       ],
       "initial-letter-sunk-initial.html.ini": [
-       "e605fe83f4bdb1aa2271bb1d3cbccfb340cd042d",
+       "2a59287b17e01ed8269d07ba13bb1676f9161c73",
        []
       ],
       "initial-letter-valid.html.ini": [
@@ -301115,7 +301221,7 @@
        []
       ],
       "initial-letter-with-first-line.html.ini": [
-       "56e94a8670efbccb3863be467419c218b0835400",
+       "7f69acbb5b8b735f2cc960f4832090c3f085738a",
        []
       ],
       "initial-letter-with-tab-ref.html": [
@@ -301328,6 +301434,10 @@
       }
      },
      "fallback-intrinsic-sizes": {
+      "constructor-error.https.html.ini": [
+       "ec85dd01b511a3edf5a7c7531259a15aabb2a158",
+       []
+      ],
       "fallback-ref.html": [
        "6808e14eb683fde8c30a2c89318c6cccba12ca1a",
        []
@@ -303706,7 +303816,7 @@
       []
      ],
      "getclientrects-000.html.ini": [
-      "daa4f64c9adc1345b62cb23143e26e5492c383bd",
+      "78f81bd358fc69d813a81cd385f5dd52f34cd545",
       []
      ],
      "hit-test-transformed-child.html.ini": [
@@ -305596,7 +305706,7 @@
       []
      ],
      "scrollable-overflow-input-001.html.ini": [
-      "6351a3d300d23195dab2184d6186ddabe934b9f4",
+      "0fd1d59cb6c19d9b4b5345ed50e850ffaa5eafd8",
       []
      ],
      "scrollable-overflow-input-002-ref.html": [
@@ -306087,6 +306197,10 @@
       "2edd14e12a43b757148df8a9ac14ae1b23870660",
       []
      ],
+     "paint-function-this-value.https.html.ini": [
+      "28735b17c56554ccfecca0e8b18fd084ba834fd5",
+      []
+     ],
      "paint2d-canvasFilter-ref.html": [
       "e8231c254c6500ed37eae68a5d29e04a7921707a",
       []
@@ -306168,7 +306282,7 @@
       []
      ],
      "parse-input-arguments-018.https.html.ini": [
-      "50b52c179545e86a6df15078555aeb000bd12752",
+      "9905f9f8ad5e64a36db44308b83d79cce7f0dad7",
       []
      ],
      "parse-input-arguments-019.https.html.ini": [
@@ -308931,10 +309045,6 @@
       "0df837fbb07d756aa4f778765d6ce08a5f296275",
       []
      ],
-     "ruby-text-combine-upright-001b.html.ini": [
-      "654ce463d1c2e4eac1fc8aad024ad0e5ce2313f9",
-      []
-     ],
      "ruby-text-combine-upright-002-ref.html": [
       "1bb4386e7abfb468de92edcb9a2633d5ceb96174",
       []
@@ -312501,6 +312611,22 @@
        []
       ]
      },
+     "bidi": {
+      "bidi-lines-002.html.ini": [
+       "6a5b59fbeabb8475ad7befbc62206cdad0103a20",
+       []
+      ],
+      "reference": {
+       "bidi-lines-001-ref.html": [
+        "ab13fef116c4eba70a09e01558425bb508173d90",
+        []
+       ],
+       "bidi-lines-002-ref.html": [
+        "af162f0149f70594a14e6ba556bd655a9fda0dd8",
+        []
+       ]
+      }
+     },
      "boundary-shaping": {
       "boundary-shaping-001.html.ini": [
        "ff3d1bbc783d11a376a486d8bb7aa5f4deb69c5e",
@@ -314170,6 +314296,10 @@
        "faa943ebfdc2ca9ab649f7938c446f630723e4a3",
        []
       ],
+      "line-breaking-023.html.ini": [
+       "b72147da8657566f1c80852cef0ff554a6bc863e",
+       []
+      ],
       "line-breaking-atomic-003.html.ini": [
        "d69bdb220dd1ae432905a487158b7da2bcc82d6b",
        []
@@ -314239,6 +314369,26 @@
         "b1cc22bd2049f66a86f61bd8bf8f6c8a6ec26258",
         []
        ],
+       "line-breaking-023-ref.html": [
+        "ddf4974eb915fe180ed2161fa0a6b22d76a30b39",
+        []
+       ],
+       "line-breaking-024-ref.html": [
+        "f96d3e05eed6c9094d978a31343ed8e7f6286500",
+        []
+       ],
+       "line-breaking-025-ref.html": [
+        "27a02910e8f15208e84cd41b07b5a746cb390719",
+        []
+       ],
+       "line-breaking-026-ref.html": [
+        "7c1656ea59062c2dcd88478f754890bf277f14ee",
+        []
+       ],
+       "line-breaking-027-ref.html": [
+        "fad3f46f1a872bf44477263c72cafb0fa0c8aa12",
+        []
+       ],
        "line-breaking-atomic-004-ref.html": [
         "022004bfc70268dbe22d6731f323ba3bfe8246b8",
         []
@@ -314572,16 +314722,16 @@
        "25d7fc7958bc6222d44c810e189b8fccbb679d43",
        []
       ],
-      "overflow-wrap-anywhere-inline-002.html.ini": [
-       "712f0e1b9fcd0d1d268100f5dbd6d1c5f173254c",
+      "overflow-wrap-anywhere-inline-002.tentative.html.ini": [
+       "97039429c525da715b12e793c0dbcf1d96754468",
        []
       ],
-      "overflow-wrap-anywhere-inline-003.html.ini": [
-       "bde68abaad42094173e5be43b8ebd8d86eda39ea",
+      "overflow-wrap-anywhere-inline-003.tentative.html.ini": [
+       "887c19b3dedc79fa52517f209c892d780e17a600",
        []
       ],
-      "overflow-wrap-anywhere-inline-004.html.ini": [
-       "7b4883f383f5123686b328df821c3eb3dcd7adb4",
+      "overflow-wrap-anywhere-inline-004.tentative.html.ini": [
+       "ae3e8946daa5ef38cd04be8de3b1baeeead29cb6",
        []
       ],
       "overflow-wrap-min-content-size-009.html.ini": [
@@ -315470,6 +315620,14 @@
        "464ca87af9e47600fcd8253fb0d5c8f82a05f773",
        []
       ],
+      "text-align-match-parent-05-ref.html": [
+       "de42ee7a5a644ec18269d06d59c4c01935bee556",
+       []
+      ],
+      "text-align-match-parent-05.html.ini": [
+       "5dbe4e3bcb998404b17d2cb38c42eb8a7a02ace3",
+       []
+      ],
       "text-align-match-parent-ref.html": [
        "f916b44c9867ed55b143bb54c340564c07c831d7",
        []
@@ -317580,16 +317738,16 @@
        "4cd08ee4c345e7301b1ab10962b4878142a75438",
        []
       ],
-      "word-break-break-all-inline-004.html.ini": [
-       "008c46fd7aa9382d4f779607bba461549f82c041",
+      "word-break-break-all-inline-004.tentative.html.ini": [
+       "4f8a76e98c7d29a02f5f3b380bb4ed940db52693",
        []
       ],
       "word-break-break-all-inline-006.html.ini": [
        "dc03c44592d84d7462c667455c534d34b2c57aa3",
        []
       ],
-      "word-break-break-all-inline-007.html.ini": [
-       "09ea3391a317f6742943e011360e182a2dc26126",
+      "word-break-break-all-inline-007.tentative.html.ini": [
+       "0aad3a150dda236f9de9a534983cb8a82fb24e59",
        []
       ],
       "word-break-break-all-inline-008.html.ini": [
@@ -317600,8 +317758,8 @@
        "8b0de9552fc9b47b4aafce65471364105e3a453f",
        []
       ],
-      "word-break-break-all-inline-010.html.ini": [
-       "e3b2f4c4067355e43f6eb5d3c97cae98f5749f36",
+      "word-break-break-all-inline-010.tentative.html.ini": [
+       "96372271bca93f7925f2dc36d578810a6a51775e",
        []
       ],
       "word-break-break-word-overflow-wrap-interactions-ref.html": [
@@ -322273,6 +322431,10 @@
       "kind-of-widget-fallback-meter-border-top-width-001.html.ini": [
        "7c80b5380e3c8d729306e315fa98b48056a6dcc7",
        []
+      ],
+      "kind-of-widget-fallback-range-border-inline-end-width-001.html.ini": [
+       "f3bbc312a7def4d12ce50b151b0578d9fd76a0af",
+       []
       ]
      },
      "compute-kind-widget-no-fallback-props-001.html.ini": [
@@ -324761,6 +324923,10 @@
       "a82b5fe7efd36ace3df5046d650bc9b337b13bdd",
       []
      ],
+     "line-break-ch-unit.html.ini": [
+      "ec39a9352bc2b526b932b8429e9d54669eb42cd2",
+      []
+     ],
      "minmax-angle-serialize-expected.txt": [
       "8f56a1de89b32088e7f0cc5bb09c190f42d67620",
       []
@@ -330178,7 +330344,7 @@
       ]
      },
      "scroll-behavior-element.html.ini": [
-      "e90ab331f72f0215aa1b881128f3277777b5f5bb",
+      "26477ab2dead0782d4e1646b7e8648c409ed6faa",
       []
      ],
      "scroll-behavior-main-frame-root.html.ini": [
@@ -331901,7 +332067,7 @@
        []
       ],
       "has-complexity.html.ini": [
-       "e68b8834c35b14faf8441aeae6645f26015c9331",
+       "abe15aeacde200f0388f4f5429cb6dcc5498773e",
        []
       ],
       "logical-combinations-in-has-expected.txt": [
@@ -332654,7 +332820,7 @@
       []
      ],
      "ElementInternals-target-element-is-held-strongly.html.ini": [
-      "0e40cdcfd4fb985ed37bafbd93a7a0943aa52541",
+      "64240c7da3675b2e19a60595557e1f8dc3938b1b",
       []
      ],
      "ElementInternals-validation-expected.txt": [
@@ -333741,6 +333907,10 @@
      ]
     },
     "nodes": {
+     "CharacterData-surrogates.html.ini": [
+      "392efab58a9a3ef5d0d408cd1f41c37b82f49478",
+      []
+     ],
      "ChildNode-remove.js": [
       "c36ba0d117479dc6fc5437733e80050b111895c1",
       []
@@ -334269,6 +334439,14 @@
       "2657bb761955202e50cd65f00431fdc415a09eb3",
       []
      ],
+     "Range-mutations-dataChange.html.ini": [
+      "7158a50a34d3428f41cd3a6672018936c2c3c088",
+      []
+     ],
+     "Range-mutations-deleteData.html.ini": [
+      "8a4d2feb07a10de291aaf74a7996c09fef195942",
+      []
+     ],
      "Range-mutations-insertData.html.ini": [
       "68d21f87b4c182cc3cf799202ad5c108fd19f577",
       []
@@ -334278,7 +334456,7 @@
       []
      ],
      "Range-set.html.ini": [
-      "af8dc57bc24cbfd7b5ed3f984f03f824bed95a27",
+      "1ab4357a2d5e3d52f98561dc40263756e2542a2c",
       []
      ],
      "Range-test-iframe.html": [
@@ -335644,7 +335822,7 @@
       []
      ],
      "delete.html.ini": [
-      "fd05786d9c92117c18849c5eefeeaf818f0fae0d",
+      "920e0307de8e5a23e470c72e116824b697cc4ac2",
       []
      ],
      "delete_1-1000-expected.txt": [
@@ -335744,7 +335922,7 @@
       []
      ],
      "formatblock.html.ini": [
-      "0f70caf78d4f14751d7541fb38a0747de1266bdf",
+      "26b7118836014b111c94c8c7b56435832e587510",
       []
      ],
      "formatblock_1-1000-expected.txt": [
@@ -336143,7 +336321,7 @@
      []
     ],
     "buffer-before-onload.html.ini": [
-     "c477624df618fd2f5b8af8891571d4aa7a63cbfc",
+     "ce81da2a810447a825554af596e36f9227b365e0",
      []
     ],
     "image-carousel.html.ini": [
@@ -336151,7 +336329,7 @@
      []
     ],
     "image-src-change.html.ini": [
-     "80e7f264be0e94492666b9ee4c2380b4f8086097",
+     "1def2aab988ef9e3bb5fe57cd3fbe47d47a3ff21",
      []
     ],
     "images-repeated-resource.html.ini": [
@@ -336528,6 +336706,10 @@
        "1951fffc0f03bacb58105e161234947a35d6876b",
        []
       ],
+      "sjis-encode-form-ms_kanji.html.ini": [
+       "208a24a9b30a8728b70b755eb2f4a73e53567312",
+       []
+      ],
       "sjis-encode-form-shift-jis.html.headers": [
        "3239b8638eb5ced8159b6412058239bafc28cd76",
        []
@@ -336644,10 +336826,6 @@
     },
     "legacy-mb-korean": {
      "euc-kr": {
-      "euckr-decode-iso-ir-149.html.ini": [
-       "ef1c67e493b8033a631cf7f7e1f7c5603dd1a052",
-       []
-      ],
       "euckr-decode-ksc5601.html.ini": [
        "fdc8f2feee986252f0463631a48feaae05b12d7f",
        []
@@ -336680,6 +336858,10 @@
        "524d1bdcbeeeb654bb1f4e0f217f80def93a0244",
        []
       ],
+      "euckr-encode-form-iso-ir-149.html.ini": [
+       "d3d18540d0c9fbd89d896ee71f79b1246c8408ea",
+       []
+      ],
       "euckr-encode-form-korean.html.headers": [
        "4b82def1fb15615e859c871b5b833b2c2716b1e3",
        []
@@ -337159,7 +337341,7 @@
      []
     ],
     "unsupported-labels.window.js.ini": [
-     "280d1d2bbf582aaa4d4db521fd7bdc0937160f86",
+     "450e960b98d0e4b0d49c321f740d312acdb15b08",
      []
     ]
    },
@@ -339001,7 +339183,7 @@
        []
       ],
       "cors-cookies.any.js.ini": [
-       "869920dd4039ecd5f4fc843065e8c66579619ef2",
+       "2ccb092c8c43bf1188c06a108312cec9e907fbd3",
        []
       ],
       "cors-preflight-redirect.any-expected.txt": [
@@ -340431,7 +340613,7 @@
        []
       ],
       "element-input-image.https.sub.html.ini": [
-       "09e396bf461eb56d1db76965d01f98bf09a9dd1a",
+       "8a66759e6de17a0ce486ad1978393980729de31d",
        []
       ],
       "element-link-icon.https.sub.html.ini": [
@@ -340451,7 +340633,7 @@
        []
       ],
       "element-meta-refresh.https.optional.sub.html.ini": [
-       "29e1d9700f36f10e78730dff3d56608e48abb235",
+       "fa73b79686a53c2e71ec74f01fef043047fdcdb6",
        []
       ],
       "element-meta-refresh.optional.sub.html.ini": [
@@ -340507,7 +340689,7 @@
        []
       ],
       "window-history.https.sub.html.ini": [
-       "961d7a601bc2ef54d8e3115a857147c8fcc31286",
+       "157b4da56d17849081074725fb4a67d8add76208",
        []
       ],
       "worker-dedicated-constructor.sub.html.ini": [
@@ -341064,7 +341246,7 @@
       ]
      },
      "service-worker-background-fetch.https.window.js.ini": [
-      "d42f9a199b4509ba801174ac178a5992391449ee",
+      "099c12ff80b1b1124cf3aa64e7e6f80f3f1527b8",
       []
      ],
      "shared-worker.window.js.ini": [
@@ -341241,10 +341423,6 @@
       "495a84e394fb5dbf278c6f18b6fb371a5b60ea58",
       []
      ],
-     "stale-script.html.ini": [
-      "fd8a13f8e1a9f7043fc17c00073c30a757e38623",
-      []
-     ],
      "sw-intercept.js": [
       "dca7de51b0b8c5518276e70ae219b7bc8f869a95",
       []
@@ -341401,7 +341579,7 @@
      []
     ],
     "focus-already-focused-iframe-same-site.html.ini": [
-     "c8cb0f97f7b02f70990a80ee9fe25f1d9b8db7a2",
+     "4f0bb0ce512506e160d3de8c8bdf6bbc231d11df",
      []
     ],
     "focus-event-after-focusing-iframes-expected.txt": [
@@ -341485,7 +341663,7 @@
      []
     ],
     "iframe-focus-with-different-site-intermediate-frame.html.ini": [
-     "501950368012f28203aead245411c7e608f36c68",
+     "a4e9ffefd3d4c43282dea6fd72191db23d6006cb",
      []
     ],
     "iframe-focus-with-same-as-top-intermediate-frame-expected.txt": [
@@ -343759,7 +343937,7 @@
      []
     ],
     "clamped-time-origin-isolated.https.html.ini": [
-     "2e88cea7c61dd7984dc9aea9c6347a39c0a2d7e5",
+     "f365b22e8cbe20444fc1fb1c6fd42211afc4e246",
      []
     ],
     "cross-origin-isolated-timing-attack.https.html.headers": [
@@ -343832,7 +344010,7 @@
       []
      ],
      "embedding.tentative.https.window.js.ini": [
-      "c71a1044935c8354321991b814b22d1632f83617",
+      "5ff21421597c64e75a54a387ec6e9f6343ed2201",
       []
      ],
      "fenced-frame-bypass.tentative.https.window-expected.txt": [
@@ -344072,7 +344250,7 @@
         []
        ],
        "browsing_context_name_cross_origin.html.ini": [
-        "56ade698b6c7489cde0b748943d592698b4fd180",
+        "0de7a3d80963aa3c627daa3f0607254bc04722d9",
         []
        ],
        "browsing_context_name_cross_origin_2-expected.txt": [
@@ -344097,11 +344275,11 @@
          []
         ],
         "before-load-hash-twice.html.ini": [
-         "dfb3afc2684e2ac8e36b3b242e582f0d96cd8852",
+         "5827e20f32e674c3ac9966a1f11d5562542481b9",
          []
         ],
         "before-load-hash.html.ini": [
-         "2fb53e83dc4206afd7eaa87855561bb858c8cb97",
+         "02af6ffdbdf048639d759ed7c5498135b813e9b3",
          []
         ]
        },
@@ -344668,7 +344846,7 @@
         []
        ],
        "cross-document-traversal-cross-document-traversal.html.ini": [
-        "be737b420dc2f29344e92b8e4b8983f273d9c68e",
+        "15c9ca23fb24938d9cdca25f0f13766b038b9383",
         []
        ],
        "cross-document-traversal-same-document-traversal.html.ini": [
@@ -344714,7 +344892,7 @@
         []
        ],
        "same-document-traversal-cross-document-traversal.html.ini": [
-        "1b9a2f4d4fae2c3f3a9eeaa3a885ced4f9a06c52",
+        "7040e50bccb7d404af8e62d84deb5300db03b428",
         []
        ],
        "same-document-traversal-same-document-traversal-hashchange.html.ini": [
@@ -344832,7 +345010,7 @@
         []
        ],
        "004.html.ini": [
-        "ed34d46b6f35314afb9b533d38d293e2949b81ca",
+        "cd2ebe7af9ee22edcd74009839cf7bf5777b80bd",
         []
        ],
        "base.html": [
@@ -344855,6 +345033,10 @@
         "a34b182e70f8e32bc5a5802d46cdf93adc79026b",
         []
        ],
+       "beforeunload-sticky-activation-popup.html.ini": [
+        "cd4970ad7b562bf1d1c52fef7b98901fd5c704b1",
+        []
+       ],
        "navigation-within-beforeunload-1.html": [
         "b96234fba2cb85b10cfa0e086c723f8aa0a82149",
         []
@@ -345167,6 +345349,10 @@
         "c7a9a106823bc81db469d1659cee5c01ef1f863f",
         []
        ],
+       "history_forward_1.html.ini": [
+        "8915243830778515b04215aba0fd548479a6ec53",
+        []
+       ],
        "history_go_no_argument-1.html": [
         "acd9bda31dcfae1d1183bdb47340066426dcdfb3",
         []
@@ -345376,7 +345562,7 @@
         []
        ],
        "location-protocol-setter-non-broken.html.ini": [
-        "74dcce93246ac325a91beaca6f4d04332bbfb647",
+        "6cf1e4ac0715797ad6f631f8ba5707e21810554f",
         []
        ],
        "location-prototype-setting-cross-origin-domain.sub-expected.txt": [
@@ -345606,7 +345792,7 @@
         []
        ],
        "cross-origin-objects.html.ini": [
-        "7f618dd34c4681750bfe32afe4e7a779c90c6b80",
+        "87914ec2f98a7dcf94ced1405af9dd758151f9d6",
         []
        ],
        "frame-with-then.html": [
@@ -345665,7 +345851,7 @@
          []
         ],
         "parent-yes-child-no-port.sub.https.html.ini": [
-         "5383b4d6c44128b9efe8d2a58b3d4660d59f1198",
+         "5504eb18d1640f0d5f622b3cfa215e1f0848689b",
          []
         ],
         "parent-yes-child-no-same.sub.https.html.headers": [
@@ -345681,7 +345867,7 @@
          []
         ],
         "parent-yes-child-no-subdomain.sub.https.html.ini": [
-         "1524e6e285a6186fe7dd732b0faf4db6e3ea8ebf",
+         "4df55d70d7e6176e97c1361ebd0e1542b2b3d290",
          []
         ],
         "parent-yes-child-yes-port.sub.https.html.headers": [
@@ -345689,7 +345875,7 @@
          []
         ],
         "parent-yes-child-yes-port.sub.https.html.ini": [
-         "2c3782b364adde0e5fecca73eec09a86c377271f",
+         "1fe764980cdb004b33f17ae5ae9329436157fe58",
          []
         ],
         "parent-yes-child-yes-same.sub.https.html.headers": [
@@ -345697,7 +345883,7 @@
          []
         ],
         "parent-yes-child-yes-same.sub.https.html.ini": [
-         "e3a89c0f7ce9961f842110f8818e4e27fd505f8b",
+         "21a226635de11b863215c756aee7b0791a7e43bb",
          []
         ],
         "parent-yes-child-yes-subdomain.sub.https.html.headers": [
@@ -345705,7 +345891,7 @@
          []
         ],
         "parent-yes-child-yes-subdomain.sub.https.html.ini": [
-         "3f5747495968065884bca877d8122b834b90e911",
+         "181db94194efbdebc05705175af2653f0bfd00d5",
          []
         ]
        },
@@ -345719,7 +345905,7 @@
          []
         ],
         "parent-no-child1-no-subdomain1-child2-yes-subdomain2.sub.https.html.ini": [
-         "9137709a3919e5eb64d1a45042493b4b7127e96d",
+         "d350ba94fa60e0a348a9414131a2078d8079bc99",
          []
         ],
         "parent-no-child1-yes-subdomain-child2-no-port.sub.https.html.ini": [
@@ -345727,7 +345913,7 @@
          []
         ],
         "parent-no-child1-yes-subdomain-child2-no-subdomain.sub.https.html.ini": [
-         "2a0462ef0b1606a5eff1448b2695394a50f998f0",
+         "2ae4867c1c4fc9e6b1049177e5f6c0476956640b",
          []
         ],
         "parent-yes-child1-no-subdomain-child2-no-subdomain.sub.https.html.headers": [
@@ -345743,7 +345929,7 @@
          []
         ],
         "parent-yes-child1-no-subdomain-child2-no-subdomain2.sub.https.html.ini": [
-         "8bc5dd53bfa10b7cb987cedbe4aeb9be906055c5",
+         "280b292c2b5456e5b3cbcbd3074011922fb62cea",
          []
         ],
         "parent-yes-child1-no-subdomain-child2-yes-subdomain.sub.https.html.headers": [
@@ -345751,7 +345937,7 @@
          []
         ],
         "parent-yes-child1-no-subdomain-child2-yes-subdomain.sub.https.html.ini": [
-         "e77ac91c4531d403826da7b9bb6c47c2ef63b7b1",
+         "a21f71a8ba412e447a26cf2689af00dcb6719f56",
          []
         ],
         "parent-yes-child1-no-subdomain-child2-yes-subdomain2.sub.https.html.headers": [
@@ -345759,7 +345945,7 @@
          []
         ],
         "parent-yes-child1-no-subdomain-child2-yes-subdomain2.sub.https.html.ini": [
-         "cc85d45d274b5fb8b3450e8cb58d577f122d3fc8",
+         "92198b48fca12ee55977af5f8c4e3135d027a40b",
          []
         ],
         "parent-yes-child1-no-subdomain-child2-yes-subdomainport.sub.https.html.headers": [
@@ -345775,7 +345961,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": [
@@ -345791,23 +345977,19 @@
          []
         ],
         "parent-yes-child1-yes-subdomain-child2-yes-subdomain.sub.https.html.ini": [
-         "fd34c1f97540ffeb14d314a0c5bb4ba76b24efb0",
+         "7542bf66fbff1266ab6c5dcffd60abd0180418b2",
          []
         ],
         "parent-yes-child1-yes-subdomain-child2-yes-subdomain2.sub.https.html.headers": [
          "79a20f30fc0f486014c8b93edef7483605101504",
          []
         ],
-        "parent-yes-child1-yes-subdomain-child2-yes-subdomain2.sub.https.html.ini": [
-         "3d196f659d8dcacbe5aa909fba3d95d5f7dc7c92",
-         []
-        ],
         "parent-yes-child1-yes-subdomain-child2-yes-subdomainport.sub.https.html.headers": [
          "79a20f30fc0f486014c8b93edef7483605101504",
          []
         ],
         "parent-yes-child1-yes-subdomain-child2-yes-subdomainport.sub.https.html.ini": [
-         "e3b0508f4657609580638d04ce6d4902d3c18ee9",
+         "cb8c40e9e256893e2f926e7ed55b7338a72568f9",
          []
         ]
        },
@@ -345836,7 +346018,7 @@
         []
        ],
        "document-domain.sub.https.html.ini": [
-        "41ce1a43f0a02b11e3dc2857713e641a1d4c2761",
+        "7e0e5a214ec14f6f3ff5e16432c0edf27d879495",
         []
        ],
        "getter-special-cases": {
@@ -345877,7 +346059,7 @@
          []
         ],
         "removed-iframe.sub.https.html.ini": [
-         "c8a2756f9be9a1cc50ecb71b60812307eb78c13c",
+         "dd33a866e9ddaec5d22f512a0092facd83d3744a",
          []
         ],
         "resources": {
@@ -345911,7 +346093,7 @@
          []
         ],
         "sandboxed-same-origin-iframe-no.https.html.ini": [
-         "e890d00d3b419bdec5486783adba60620b86972b",
+         "6739f44f945f58f283bd3cc722bbf29c0bec78c7",
          []
         ],
         "sandboxed-same-origin-iframe-yes.https.html.headers": [
@@ -345933,23 +346115,27 @@
        ],
        "iframe-navigation": {
         "parent-no-1-no-same-2-yes-port.sub.https.html.ini": [
-         "ec2a502d92a980ccdf4976cc1155f85ad599095b",
+         "43e1bec1c03d27c5865143a3f0a76fccf9ff6020",
          []
         ],
         "parent-no-1-no-same-2-yes-subdomain.sub.https.html.ini": [
-         "8cdf9fa61dd7eeee83b1787df8f2f09ab779f3a8",
+         "9ebe2937def6069ae5061662ee2986369ea06daf",
          []
         ],
         "parent-no-1-no-subdomain-2-yes-subdomain.sub.https.html.ini": [
-         "30dc9ce3869a4f591f2c275ca046b4e81a738b4f",
+         "5a2bf369185e39e6555b97cf11ca022bf431b003",
          []
         ],
         "parent-no-1-no-subdomain-2-yes-subdomain2.sub.https.html.ini": [
-         "5d7dbc4170ddf1fc6e5449bb5166c3917c4d45da",
+         "965bd25ba25e789bbc3c828214f02536ff2bab09",
          []
         ],
         "parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html.ini": [
-         "29817d3ce6772f9d9a9547561e709cbe471d006f",
+         "cdecdf4cd79271fcae720bd886d75a40142e9bdf",
+         []
+        ],
+        "parent-no-1-yes-subdomain-2-no-subdomain.sub.https.html.ini": [
+         "44d462eb481d8bf89c70f89e4aa283ef2bc14dcf",
          []
         ],
         "parent-yes-1-no-same-2-no-port.sub.https.html.headers": [
@@ -345965,7 +346151,7 @@
          []
         ],
         "parent-yes-1-no-same-2-no-subdomain.sub.https.html.ini": [
-         "e25111605bfca5200f58936b1bafa33ab146e662",
+         "7c6b0a820e6594b9dadf79820114bfa5d8a8e89a",
          []
         ]
        },
@@ -345979,15 +346165,11 @@
        ],
        "popups": {
         "opener-no-openee-yes-port.sub.https.html.ini": [
-         "f7666ccee237a6bf47a99a782f347906eda4b5a4",
-         []
-        ],
-        "opener-no-openee-yes-same.sub.https.html.ini": [
-         "97daf51a7fd0ef1448fd5c894b40184c9a22160b",
+         "81caef44d49e6c9883d2cc615f1ed58c3835ecc3",
          []
         ],
         "opener-no-openee-yes-subdomain.sub.https.html.ini": [
-         "1368d4ebe063c13c54fee10ae3d296b08c8ba5ff",
+         "ae12aa82189f2c112ab584dd0fe05cdcf564bc33",
          []
         ],
         "opener-yes-openee-no-port.sub.https.html.headers": [
@@ -346003,7 +346185,7 @@
          []
         ],
         "opener-yes-openee-no-same.sub.https.html.ini": [
-         "8b96f964db7e1b9ae9629b3ea5bae6e2dfa8319c",
+         "053a0b74c9f0692fea76477f8f8ad74481baa651",
          []
         ],
         "opener-yes-openee-no-subdomain.sub.https.html.headers": [
@@ -346011,7 +346193,7 @@
          []
         ],
         "opener-yes-openee-no-subdomain.sub.https.html.ini": [
-         "c3ea49453cb248dafb7cbbee1b8e11fd0cfa6ad2",
+         "89d6e4aaa118f3adda63bf68942f77d7c31dc7e3",
          []
         ],
         "opener-yes-openee-yes-port.sub.https.html.headers": [
@@ -346026,16 +346208,12 @@
          "79a20f30fc0f486014c8b93edef7483605101504",
          []
         ],
-        "opener-yes-openee-yes-same.sub.https.html.ini": [
-         "b6a98657923c945fa98d6cb43ce69180ac9beee1",
-         []
-        ],
         "opener-yes-openee-yes-subdomain.sub.https.html.headers": [
          "79a20f30fc0f486014c8b93edef7483605101504",
          []
         ],
         "opener-yes-openee-yes-subdomain.sub.https.html.ini": [
-         "4a9a4e704f686383f85b3046c2deefd4a9bce109",
+         "42f89ad89f2319febbf177f3fcf115b5f678c7af",
          []
         ]
        },
@@ -346048,7 +346226,7 @@
         []
        ],
        "removing-iframes.sub.https.html.ini": [
-        "830c1b5c37a2ac15a4a68257a15d999517ff560b",
+        "cb6578700d10c64dc4bdd5cb6526d5ed28b5b4a4",
         []
        ],
        "resources": {
@@ -346104,7 +346282,7 @@
       },
       "relaxing-the-same-origin-restriction": {
        "document_domain_access_details.sub.html.ini": [
-        "f928d42c5efbdc78787f5913b5463fb9c87a32e5",
+        "29f86924eef02d1e3b0ae455083488ecd296a665",
         []
        ],
        "document_domain_setter.html.ini": [
@@ -346390,7 +346568,7 @@
         ]
        },
        "open-features-is-popup-condition.html.ini": [
-        "e8fb2011d9ea7c17e83b30fc2a87a1b99a42f189",
+        "55d79a7ff9b048f5d1b998a4cd96b686464b5a9e",
         []
        ],
        "open-features-negative-innerwidth-innerheight.html.ini": [
@@ -346453,6 +346631,10 @@
         "97ab60773abb587368339945de01df4af993a54b",
         []
        ],
+       "open-features-non-integer-width.html.ini": [
+        "1e059b010bdfe835d5f64e515f658e60674c8e98",
+        []
+       ],
        "open-features-tokenization-innerheight-innerwidth.html.ini": [
         "ccc3a0fcdab0bbdab115f67504c21ed44cde45d4",
         []
@@ -346470,7 +346652,7 @@
         []
        ],
        "open-features-tokenization-screenx-screeny.html.ini": [
-        "b009c7a39a075bda00966b2be768041cc0a25701",
+        "a77ce927e2953880786358a3465509e7299bd71d",
         []
        ],
        "open-features-tokenization-top-left-expected.txt": [
@@ -346554,8 +346736,12 @@
        "ba9df39fbb40986537c7a4688da7dd7ea82e32f2",
        []
       ],
+      "window-open-noopener.html.ini": [
+       "959e13b5a93c57f72d37b5ecd5d79d7031e0daf2",
+       []
+      ],
       "window-open-windowfeatures-values.html.ini": [
-       "d9e0e4f30172d211e80db333678752d7aedbe94b",
+       "ef909a9fbff128dcd041f2de23ab974043d2a261",
        []
       ],
       "window-properties.https-expected.txt": [
@@ -346651,6 +346837,10 @@
        }
       },
       "browsing-context-names": {
+       "choose-_blank-002.html.ini": [
+        "6231b72dc642616d4cba43f7713396bd50b8d945",
+        []
+       ],
        "choose-_top-001.html.ini": [
         "32ae56a123bf75f51fdd6c2937085ed6f23ee367",
         []
@@ -348642,6 +348832,12 @@
        "d0524194c9186da948d150da7b36f0f1144a61f9",
        []
       ],
+      "drawing-images-to-the-canvas": {
+       "2d.drawImage.animated.poster.html.ini": [
+        "55cf49a5996f364b25c55a553a419b2ee026a4e9",
+        []
+       ]
+      },
       "fill-and-stroke-styles": {
        "2d.pattern.paint.repeat.basic.html.ini": [
         "59c6d7d3f9c14d3dd9470bb82563a12804617949",
@@ -348669,7 +348865,7 @@
          []
         ],
         "offscreencanvas.resize.html.ini": [
-         "156fb445100700054d45b68c472600d1c358a0c9",
+         "04c2b5077c882649dd32ee79c39b268eaf3c5b39",
          []
         ],
         "offscreencanvas.transferrable-expected.txt": [
@@ -349201,7 +349397,7 @@
        []
       ],
       "dedicated-worker.https.window.js.ini": [
-       "47f8c959ac00cd3f7e328e80ea3c89904cc34f53",
+       "e304d0e0960858efc7d195958082dceb869c61b5",
        []
       ],
       "fetch.https.window.js.ini": [
@@ -349260,7 +349456,7 @@
       []
      ],
      "cross-origin-isolated-permission-worker.https.window.js.ini": [
-      "1ed2310587c0905534e7e6c4c9f12f0866ffc80f",
+      "6e7bbd4c2a84c882cbbda69b8c029d1be6adbaa2",
       []
      ],
      "data.https.html.headers": [
@@ -349382,7 +349578,7 @@
       []
      ],
      "reporting-navigation.https.html.ini": [
-      "3031c79f6bce815ba8c87bbdc359d6787859db9e",
+      "360865ceec1c5218f7bd40e25db3317e21c229e0",
       []
      ],
      "reporting-subresource-corp.https-expected.txt": [
@@ -349726,19 +349922,19 @@
       []
      ],
      "header-parsing-failures.https.html.ini": [
-      "a7b8041d27bdd67318f1b2a7771db2af8f72e164",
+      "46f1485297cf94ca650a935263cf0962d7b421e2",
       []
      ],
      "header-parsing-non-ascii.https.html.headers": [
       "54e44a7113def0babd42f726c878fc90db2e99f9",
       []
      ],
-     "header-parsing-repeated.https.html.headers": [
-      "85c58be8a1c60ed64b2efaed8a155fc5e087537e",
+     "header-parsing-non-ascii.https.html.ini": [
+      "352e7aad6f020561a33cc066d29ae815dd33f1e0",
       []
      ],
-     "header-parsing-repeated.https.html.ini": [
-      "0ff031216698bcc77afe7110f069d5f7d0fd27e9",
+     "header-parsing-repeated.https.html.headers": [
+      "85c58be8a1c60ed64b2efaed8a155fc5e087537e",
       []
      ],
      "historical": {
@@ -349751,7 +349947,7 @@
        []
       ],
       "popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html.ini": [
-       "6095039701b3ae4114a122f88d33f0a291771c10",
+       "0dbd28d2424042e2d2ababfedc49e07f00f97e32",
        []
       ],
       "popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html.headers": [
@@ -349797,10 +349993,6 @@
       "popup-same-site-with-same-site.https.html.headers": [
        "34bd099a302f893f92586241ea38aac812bf28d0",
        []
-      ],
-      "popup-same-site-with-same-site.https.html.ini": [
-       "69a79d91493cba8c3a03888d7dd7a9c37a887452",
-       []
       ]
      },
      "iframe-popup-same-origin-allow-popups-to-same-origin-allow-popups.https.html.headers": [
@@ -349808,7 +350000,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": [
@@ -349832,7 +350024,7 @@
       []
      ],
      "iframe-popup-same-origin-to-same-origin.https.html.ini": [
-      "c6cd6b730183649c8f3a41dd1e35837e05470862",
+      "514b6a367dbb231f2fdf68fc00bc2d916ed45c28",
       []
      ],
      "iframe-popup-same-origin-to-unsafe-none.https.html.headers": [
@@ -349856,11 +350048,11 @@
       []
      ],
      "iframe-popup-unsafe-none-to-unsafe-none.https.html.ini": [
-      "09c7ceb9f09554e5805f828f4c21fbf4b637bfc2",
+      "3deb888f6a7785ad9af9dac239d60e1473bb47d5",
       []
      ],
      "javascript-url.https.html.ini": [
-      "58828791cd8b8b696ef82048bcd73dd676e4d1e3",
+      "7ffc85b18b18bd7d74371b512731cbfdd03f757c",
       []
      ],
      "navigate-to-aboutblank.https.html.ini": [
@@ -349875,12 +350067,16 @@
       "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
       []
      ],
+     "popup-meta-http-equiv.https.html.ini": [
+      "4dcab80a4e0a7c541f3fb0430d498b5017866b16",
+      []
+     ],
      "popup-redirect-cache.https.html.headers": [
       "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
       []
      ],
      "popup-redirect-cache.https.html.ini": [
-      "47017b446f89e8e2f7ed9425095d08ee3c387b9a",
+      "99d5850adff91c55e23c30fb294be8812d367733",
       []
      ],
      "popup-same-origin-allow-popups-with-cross-origin.https.html.headers": [
@@ -349888,7 +350084,7 @@
       []
      ],
      "popup-same-origin-allow-popups-with-cross-origin.https.html.ini": [
-      "ddd028e2ea76a0899bed36a40e2607dc3c213bb7",
+      "78395f064089f40dea0d537a111ffc600cd17768",
       []
      ],
      "popup-same-origin-allow-popups-with-same-origin.https.html.headers": [
@@ -349903,10 +350099,6 @@
       "d83ed86fb9b5d159b9f380424887402edc96cb75",
       []
      ],
-     "popup-same-origin-allow-popups-with-same-site.https.html.ini": [
-      "d64378f76bfbd8e249d03c534dff39fe5b4c10cb",
-      []
-     ],
      "popup-same-origin-non-initial-about-blank.https.html.headers": [
       "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
       []
@@ -349920,7 +350112,7 @@
       []
      ],
      "popup-same-origin-with-same-origin.https.html.ini": [
-      "817cd70b3ddfb062864c8a571da9f0020743a05b",
+      "f1d91d7c42c54ce00e774821719b575fe381a891",
       []
      ],
      "popup-same-origin-with-same-site.https.html.headers": [
@@ -349952,7 +350144,7 @@
       []
      ],
      "popup-with-structured-header.https.html.ini": [
-      "b824bdd45c1be17dc4c7d5fa52416f0562d703a4",
+      "6da6ff1fb621440715858cf87aa8bc554cdd2c0f",
       []
      ],
      "reporting": {
@@ -349966,7 +350158,7 @@
         []
        ],
        "access-from-coop-page-to-openee_coop-ro_cross-origin.https.html.ini": [
-        "9857e85d4f4a705a19df4c474d8ec72e63cbfd0d",
+        "c525d52f14f5dc4556b20fd1965377e84ca1469b",
         []
        ],
        "access-from-coop-page-to-opener_coop-ro.https.html.ini": [
@@ -349974,7 +350166,7 @@
         []
        ],
        "access-from-coop-page-to-opener_coop-ro_cross-origin.https.html.ini": [
-        "f5dc7e33158e9f050426fd709c6e97f9ff3f83fd",
+        "020e7cc34cdfb286a6ab0c4a339e0798c877ea30",
         []
        ],
        "access-from-coop-page-to-other_coop-ro.https.html.ini": [
@@ -349986,7 +350178,7 @@
         []
        ],
        "access-to-coop-page-from-openee_coop-ro.https.html.ini": [
-        "bf827e7921d353b76aa69e62ef999129f23aa7d3",
+        "eeab671e4388a7129d9b5b38a7d7dcd3a9ea211c",
         []
        ],
        "access-to-coop-page-from-openee_coop-ro_cross-origin.https.html.ini": [
@@ -349994,11 +350186,11 @@
         []
        ],
        "access-to-coop-page-from-opener_coop-ro.https.html.ini": [
-        "126bb781deb49f040d95036268ae95af60d600de",
+        "11bfb9c1d561de981e7916b744ea253a4d0974ad",
         []
        ],
        "access-to-coop-page-from-opener_coop-ro_cross-origin.https.html.ini": [
-        "851d459dc9f5bcc7bba4964b07a4e73ae99fccbe",
+        "098e5d0f5b837238225a9a09095f23d4a1dfcee6",
         []
        ],
        "access-to-coop-page-from-other_coop-ro.https.html.ini": [
@@ -350010,7 +350202,7 @@
         []
        ],
        "property-blur.https.html.ini": [
-        "e53b282f99cf54aa6c4fbba52e064b9b5e218c11",
+        "f9427b9f315d90b4a429f3294268dce231651599",
         []
        ],
        "property-close.https.html.ini": [
@@ -350026,7 +350218,7 @@
         []
        ],
        "property-frames.https.html.ini": [
-        "01f4fcd2960d85861b72c469942031529268ec2f",
+        "fe1896e38ae8c8d146493e6c38723469406be460",
         []
        ],
        "property-indexed-getter.https.html.headers": [
@@ -350034,7 +350226,7 @@
         []
        ],
        "property-length.https.html.ini": [
-        "c054f77b2cdebfb1475ba4ad06b48c3f07ecf975",
+        "3435757a0b1006729ce145e2a044df8233d8f4da",
         []
        ],
        "property-location-get.https.html.ini": [
@@ -350042,25 +350234,17 @@
         []
        ],
        "property-location-set.https.html.ini": [
-        "e016cf9c67e1853eefcc7da328877d3d0866029c",
+        "175abd50466fb400cd12a2037fe8c45562610689",
         []
        ],
        "property-named-getter.https.html.headers": [
         "64f4d5fedffd208b7174c7d8e0bce4e99ce1ac0f",
         []
        ],
-       "property-named-getter.https.html.ini": [
-        "d654a715676c6c157522e5b0621143e8faa66bc4",
-        []
-       ],
        "property-opener-get.https.html.ini": [
         "76173f058e7af335f35213295dd3b1a188840c64",
         []
        ],
-       "property-opener-set.https.html.ini": [
-        "5111ef2d847cd0803ce419b5c105a4cc5201287d",
-        []
-       ],
        "property-postmessage-1.https.html.ini": [
         "a7e407dbf5ddb3522e3e56d09b0ed81d59d78338",
         []
@@ -350074,15 +350258,15 @@
         []
        ],
        "property-top.https.html.ini": [
-        "e3a7586a247307c588eb7e9c9a3cdb75dbe2b04c",
+        "c79fa35a1af319641816a95c8a016ffbe562ef7d",
         []
        ],
        "property-window.https.html.ini": [
-        "6f3f34ce6a77bd441682289a5796e5bde956003d",
+        "799db67cf15e60af5be3156b0c11c7bb738c4426",
         []
        ],
        "report-to-both_coop-ro.https.html.ini": [
-        "46d3e2453d8b141994297fa9ca23abea51bbb623",
+        "d4653ba3bc4737029f06e32eecac15936e97218f",
         []
        ],
        "reporting-observer.html.ini": [
@@ -350092,7 +350276,7 @@
       },
       "document-reporting": {
        "report-only-four-reports.https.html.ini": [
-        "c7e7616ada186d8e45cc986b7a6cb636236405f4",
+        "a8b9622cea607a960e3d4f1e21189071bfc2d2d9",
         []
        ],
        "report-only-four-reports.https.html.sub.headers": [
@@ -350100,7 +350284,7 @@
         []
        ],
        "report-to-both_coop-ro.https.html.ini": [
-        "46d3e2453d8b141994297fa9ca23abea51bbb623",
+        "d4653ba3bc4737029f06e32eecac15936e97218f",
         []
        ],
        "reporting-redirect-with-same-origin-allow-popups.https.html.ini": [
@@ -350108,7 +350292,7 @@
         []
        ],
        "reporting-redirect-with-unsafe-none.https.html.ini": [
-        "68909ceb79e01f8e36067b597f04f87f0168fefb",
+        "c95c9d426b3ac2f1ec5bb249afac868a14097372",
         []
        ]
       },
@@ -350206,7 +350390,7 @@
         []
        ],
        "reporting-redirect-with-same-origin-allow-popups.https.html.ini": [
-        "6f1d038e5dd4f3474f52cf8d1ad4d3191d8fda2c",
+        "8030187e3a1965ce1f930b870396f1c180227ae5",
         []
        ]
       },
@@ -350226,7 +350410,7 @@
       }
      },
      "resource-popup.https.html.ini": [
-      "950ed5a35712e468a2528cbffb9fe22d1c6cce11",
+      "f030a189f9ec459fd336f1b123ed5796391ab211",
       []
      ],
      "resources": {
@@ -350302,7 +350486,7 @@
         []
        ],
        "iframe-popup-to-so.https.html.ini": [
-        "1764d44a4816a0c6f9e87999ec8829f6a9413555",
+        "5c47e17f6cb18d76a1388fc605b7479f75d80fe3",
         []
        ],
        "iframe-popup-to-soap.https.html.headers": [
@@ -350310,7 +350494,7 @@
         []
        ],
        "iframe-popup-to-soap.https.html.ini": [
-        "9311679589c79eb9c3b7a6756121044bee700977",
+        "f8661d582e1632d4967a02fc2a63c594f5c87a44",
         []
        ],
        "iframe-popup-to-un.https.html.headers": [
@@ -350318,7 +350502,7 @@
         []
        ],
        "iframe-popup-to-un.https.html.ini": [
-        "9afd7b3f9b0ba4181c16b1de799a272170e49feb",
+        "8fa475c5290cecd1a4e0400a357dc781fd27a5f2",
         []
        ],
        "iframe-popup-to-un.https_1-2-expected.txt": [
@@ -350398,7 +350582,7 @@
         []
        ],
        "popup-soap.https.html.ini": [
-        "75e0479d6d2166149de81f39c592b534987d71e9",
+        "d4cfb804c1cda4b1271b3a5e605bfb31db94812a",
         []
        ],
        "popup-u.https-expected.txt": [
@@ -350406,7 +350590,7 @@
         []
        ],
        "popup-u.https.html.ini": [
-        "d559eb64d610b064449741c83a2d92c703e4b238",
+        "e594813511b6d8b463f199e677c6a2cc6c849b30",
         []
        ],
        "popup-un.https-expected.txt": [
@@ -350418,7 +350602,7 @@
         []
        ],
        "popup-un.https.html.ini": [
-        "8db4429d8877c9375e6fae1f8ff6721486962442",
+        "245d44f04bd04c497a587d0b1f23c067a3808476",
         []
        ],
        "popup-with-cross-origin.https-expected.txt": [
@@ -350522,7 +350706,7 @@
         []
        ],
        "document-cookie.html.ini": [
-        "87ed3754a09930097225b085f7f8528dd5256968",
+        "4bbf824cad421323c92858302f0c08cc58fd0bb9",
         []
        ],
        "document-lastModified.html.headers": [
@@ -351018,6 +351202,10 @@
        "39611704ecd429cf40cdf2a4608949230562c0f2",
        []
       ],
+      "script-inserted-script.html.ini": [
+       "e11044cfb6253752396bd957d05295fc1d8c2c07",
+       []
+      ],
       "script-inserted-stylesheet-link.tentative.html.ini": [
        "64be6e97171f830f84edb718f094f89392c8f731",
        []
@@ -355802,7 +355990,7 @@
       []
      ],
      "pixel-length-attributes.html.ini": [
-      "7843cbb4b9f21ac982fb5a2fb475b26fefea7f5e",
+      "dcfec0f81cb4905f154e587b02dfc65e8c2853fa",
       []
      ],
      "replaced-elements": {
@@ -356566,7 +356754,7 @@
         []
        ],
        "embedded-js.html.ini": [
-        "0f8ef6da3a00ca1d2e50f83d9009eed25f6b2771",
+        "70caf77e0198787c7f78c13eb76d2d6e8b1b547f",
         []
        ],
        "embedded-mp4.html.ini": [
@@ -356707,7 +356895,7 @@
          []
         ],
         "resource-selection-invoke-audio-constructor.html.ini": [
-         "0fb6a8301e84fda502c54a63dd632e2fed3fe47a",
+         "dcd72bec2393a027fdc0be2341132c185d355e48",
          []
         ],
         "resource-selection-invoke-in-sync-event-expected.txt": [
@@ -356747,7 +356935,7 @@
          []
         ],
         "resource-selection-invoke-pause-networkState.html.ini": [
-         "7af7fef5ada4d592b984135b01a3b5518e96d7a5",
+         "90dedabad34d5e276c4e689869b59ca17b37f979",
          []
         ],
         "resource-selection-invoke-pause.html.ini": [
@@ -356759,7 +356947,7 @@
          []
         ],
         "resource-selection-invoke-remove-from-document-networkState.html.ini": [
-         "4eac01d5750e5b6142873b7ff112e45f205007f8",
+         "c3ac9d725634be2d24868f43d41ec818ab9011ea",
          []
         ],
         "resource-selection-invoke-remove-src.html.ini": [
@@ -356771,7 +356959,7 @@
          []
         ],
         "resource-selection-invoke-set-src.html.ini": [
-         "c0581652ef344bf42e125cffdd9d6761b9b91d4b",
+         "87b5d619fbaae0a367aa7c72bf2532149c36e391",
          []
         ],
         "resource-selection-pointer-control-expected.txt": [
@@ -356917,6 +357105,10 @@
          []
         ]
        },
+       "readyState_during_playing.html.ini": [
+        "8d6295b2f4a25a490c741c63c4f348eabd6418ea",
+        []
+       ],
        "src_object_blob-expected.txt": [
         "093acf8490418c38d875e0f82f1846bd143dabbc",
         []
@@ -357257,10 +357449,6 @@
           "96afaef346374e70cdf2fec425f19f7a1239e175",
           []
          ],
-         "track-cue-rendering-after-controls-removed.html.ini": [
-          "1fce059273370ce4937d2b4fd07c3110bc60993c",
-          []
-         ],
          "track-cue-rendering-line-doesnt-fit-ref.html": [
           "8354041eb2a0aa57b283e12d9c0390f16327ac80",
           []
@@ -357532,7 +357720,7 @@
         []
        ],
        "toBlob-cross-realm-callback-report-exception.html.ini": [
-        "57d599e09d5c382f4c5d2e4c537fdd94b44ec8f0",
+        "d445bb825830dd01abab013138c09cb3d186906b",
         []
        ],
        "toDataURL.jpeg.alpha.png": [
@@ -357728,19 +357916,19 @@
         []
        ],
        "sandbox-top-navigation-child-special-cases.tentative.sub.window.js.ini": [
-        "b84cd7fd0eab2893a0db133a02a9809c8b6a100f",
+        "7d22c4482048821e3c3586ad2496e0d23c9ced10",
         []
        ],
        "sandbox-top-navigation-child.tentative.sub.window.js.ini": [
-        "ce6897a13e1dfb8c0b1412cb27eff9d89af02617",
+        "4d916ea98cfcaa51a6b60d1bddcd140e3d53fb5e",
         []
        ],
        "sandbox-top-navigation-escalate-privileges.tentative.sub.window.js.ini": [
-        "565a41906647e44f3e9ad1aaaf336e282670d3ed",
+        "2ad9ba9c2f74eeac1c6cb9889faaf40704c6e94f",
         []
        ],
        "sandbox-top-navigation-grandchild.tentative.sub.window.js.ini": [
-        "f6d097fe095955bb078b69bde166b123ba27c40a",
+        "0f880d19a60c4a6828e6646a4ffe8c3be47f1fb8",
         []
        ],
        "stash.py": [
@@ -357964,7 +358152,7 @@
         []
        ],
        "available-images.html.ini": [
-        "8ab4fbf555708147e1e9ea81531ef1d61badfd6f",
+        "df23c0bb0f75c159820db6153b17ad2e9081d490",
         []
        ],
        "brokenimg.jpg": [
@@ -358016,7 +358204,7 @@
         []
        ],
        "image-loading-lazy-base-url-2.html.ini": [
-        "7db569e54a1aeda53a763786baead693eb89104d",
+        "2e3fbd978f5bd3b40547ee704387081df3fc15fa",
         []
        ],
        "image-loading-lazy-base-url-expected.txt": [
@@ -358024,7 +358212,7 @@
         []
        ],
        "image-loading-lazy-base-url.html.ini": [
-        "5aa4bedf5edf48ad70d638f385b8ac7ce8749d2f",
+        "031fb3b92387285dcaa95bbe69ea331dca2a674f",
         []
        ],
        "image-loading-lazy-clip-path-ref.html": [
@@ -358366,7 +358554,7 @@
         []
        ],
        "resize-during-playback.html.ini": [
-        "ec7d98f7afe7c8d8007a6bac2c5fb7c52450c427",
+        "ce1e80b1785cd8fd35e88b3c7ade06baff70c291",
         []
        ],
        "video-poster-shown-preload-auto-ref.html": [
@@ -358432,7 +358620,7 @@
         []
        ],
        "multipart-formdata.window.js.ini": [
-        "2ba07ce5ec3965a35e79c5c61564907081240328",
+        "ee2b086330239fc74b0b5445b1cd67072cfc96b1",
         []
        ],
        "resources": {
@@ -358470,7 +358658,7 @@
         []
        ],
        "urlencoded2.window.js.ini": [
-        "a6aff0f6d3f2170115f8afd7ecb52d65071ceb76",
+        "499050f218e7b8c43e5b14e84ad5f9790b969e03",
         []
        ]
       },
@@ -358492,7 +358680,11 @@
         []
        ],
        "rel-form-target.html.ini": [
-        "d3d7ac9ee86a9a33d96dd1efb8f9ff5f151d0313",
+        "0de06be7a7b205c5f796af757e873444c2236b52",
+        []
+       ],
+       "rel-input-target.html.ini": [
+        "7e74e3af77c070bd97ff8fdb3e583f57873d9814",
         []
        ],
        "resources": {
@@ -358820,7 +359012,7 @@
         []
        ],
        "selectmenu-form-state-restore.tentative.html.ini": [
-        "12a4ba6bdc34b75a8bbc2857619930c03a08a76b",
+        "2ea1f96065bb88c5198bc9d39de2b8549bfc7d32",
         []
        ],
        "selectmenu-keyboard.tentative.html.ini": [
@@ -359228,7 +359420,7 @@
         []
        ],
        "activation-behavior.window.js.ini": [
-        "eb34930f115e77cb0c6d948be201c94047f3658a",
+        "cff26e378ab9ea723d738cdd8c80322de1f0a487",
         []
        ]
       },
@@ -359250,7 +359442,7 @@
       },
       "links-created-by-a-and-area-elements": {
        "htmlanchorelement_noopener.html.ini": [
-        "caa321ab11c29c38ab3b6643b504fff50f25ebde",
+        "2059836e2d26a26820c8e6da975b385ab8aa4a2c",
         []
        ],
        "support": {
@@ -363569,7 +363761,7 @@
      []
     ],
     "idle-detection-allowed-by-permissions-policy.https.sub.html.ini": [
-     "6f363c189c39ce8e2921eb7be18b2a9a306423f7",
+     "2e5bbacb24c3289077d6bfd1b274b58fc382521f",
      []
     ],
     "idle-detection-default-permissions-policy.https.sub.html.ini": [
@@ -364665,10 +364857,6 @@
       "bc162ac7943eaa4d3851b4f8df60c790c986f0bf",
       []
      ],
-     "webtransport-h3.https.sub.any.js.ini": [
-      "b275aa45896b33e98b0bac348c3c930b18bc0cfb",
-      []
-     ],
      "wpt-server-wpt-flags.sub.html.ini": [
       "7783075b1499080b13d461986d8f5c2ab6a7830d",
       []
@@ -366057,7 +366245,7 @@
      []
     ],
     "cross-origin-iframe.sub.html.ini": [
-     "3f2847a6c39497a2e95e34097d69ed07e60d2520",
+     "4554c60a9c9d0f7f416c826feb2bccfe673b19b5",
      []
     ],
     "idlharness.window-expected.txt": [
@@ -366139,7 +366327,11 @@
       "c224c903c36f273e16c9764e5345643cd909372e",
       []
      ]
-    }
+    },
+    "zero-area-element-hidden.html.ini": [
+     "f8b3d01e2c05b0b868a9fc62f9c3b87565e20ba5",
+     []
+    ]
    },
    "intervention-reporting": {
     "META.yml": [
@@ -366346,10 +366538,14 @@
      "observe-cross-origin-animated-image.tentative.html.ini": [
       "c9f0590e8b0c879d47c4d05dd889b41f18668920",
       []
+     ],
+     "observe-cross-origin-tao-animated-image.tentative.html.ini": [
+      "bd26a29edfe54b30409db23fb6d001cb9b15e2f4",
+      []
      ]
     },
     "first-paint-equals-lcp-text.html.ini": [
-     "1566fffd000d93685999624100dcc752e6398a26",
+     "08be1a5d7994b79a6556902fae15d42f8d4d748d",
      []
     ],
     "image-upscaling-expected.txt": [
@@ -366368,6 +366564,10 @@
      "aa1921a72fc90346d33624a48f77e0ec51733ec2",
      []
     ],
+    "non-tao-image-load-after-fcp.tentative.html.ini": [
+     "dd3f62db9c86db463b32661d300b87272a14e211",
+     []
+    ],
     "non-tao-image-load-before-fcp-render-after.tentative.html.ini": [
      "5cec90b70b6f916c87569ed721fba09a761fa484",
      []
@@ -366477,7 +366677,7 @@
      []
     ],
     "freeze.html.ini": [
-     "f92b7044fe18b236d3f1795dbf066cff3380c120",
+     "cbfe5c129a6d886ed12ab00a3b864f2d904043a8",
      []
     ],
     "resources": {
@@ -366530,7 +366730,7 @@
       []
      ],
      "arbitrary-header-in-early-hints.h2.window.js.ini": [
-      "c1099dd716ca43af4f693f8e5ba9ce774abd287b",
+      "c898b7e138d30cebe40ebd18c19094a0e144bef7",
       []
      ],
      "coep-early-hints-none-final-require-corp.h2.window.js.ini": [
@@ -366550,11 +366750,11 @@
       []
      ],
      "csp-early-hints-absent-final-disallowed.h2.window.js.ini": [
-      "54ac630c1be4eddeca2c4278ad66be467217b7d4",
+      "61174bf3bca852c521cf86cc45134c90d4d154e4",
       []
      ],
      "csp-early-hints-allowed-final-absent.h2.window.js.ini": [
-      "989e58ba306126ae8d3f59f6b35d13ff2eed8f5f",
+      "c53530f115a0d4227a9930724a7caf5cc7ed0e35",
       []
      ],
      "csp-early-hints-allowed-final-allowed.h2.window.js.ini": [
@@ -366570,11 +366770,11 @@
       []
      ],
      "csp-early-hints-disallowed-final-allowed.h2.window.js.ini": [
-      "e935dbe26b09071d110aba686e56187fe3131622",
+      "142c582b058b16f436caf692ca705174ff486a96",
       []
      ],
      "csp-early-hints-disallowed-final-disallowed.h2.window.js.ini": [
-      "3e116223aecd0b524ef6af7118a31a9c70420c49",
+      "2aa08d2c04abd9bcf012352980a3e80d97d9b583",
       []
      ],
      "iframe-coep-disallow.h2.html.headers": [
@@ -366582,7 +366782,7 @@
       []
      ],
      "modulepreload-in-early-hints.h2.window.js.ini": [
-      "8ec782de1f53eb79e8a0216c8c1bd1fc39b480de",
+      "09b074d5d75194fbae0722585764fcf7feb3e2b5",
       []
      ],
      "multiple-early-hints-responses.h2.window.js.ini": [
@@ -366622,11 +366822,11 @@
       []
      ],
      "preload-without-csp-document-disallow.h2.window.js.ini": [
-      "2124955eb8ca58d3f7e0d5c7098c7a3e48a2452c",
+      "acb504f3ae440f2da85cfab12df322fbc141632f",
       []
      ],
      "redirect-cross-origin-between-early-hints.h2.window.js.ini": [
-      "0ae370be525ac30147b722d068ffd6a7063c0c9a",
+      "3a2c386088d8cdcec6a6717bb3058aba1b5d7f03",
       []
      ],
      "redirect-cross-origin.h2.window.js.ini": [
@@ -366901,7 +367101,7 @@
      []
     ],
     "longtask-in-sibling-iframe-crossorigin.html.ini": [
-     "29ede04c48735a05b38f3c19d7ef1a44d44088c6",
+     "b2e386a2fd5c7b43b062a460fedebc6c8cc49099",
      []
     ],
     "longtask-sync-xhr.html.ini": [
@@ -367237,7 +367437,7 @@
        []
       ],
       "legacy-mstyle-attributes.html.ini": [
-       "422903cf4ab17eb19bbc2fc1dcf85dc5b954002b",
+       "be13767bc72bc889393b43bcd0a1a7d1b2c7856d",
        []
       ],
       "mrow-painting-order-ref.html": [
@@ -367398,10 +367598,6 @@
        "f72fdc8403719b0d07a283ad725975ce72dfe056",
        []
       ],
-      "operator-dictionary-arabic-002.html.ini": [
-       "f0fa72f41bfa4a4f79b8af912e2e1b3857c5b907",
-       []
-      ],
       "operator-dictionary-empty-and-three-chars-ref.html": [
        "2cbed129401e721fccfeb12874d6b7223bff8def",
        []
@@ -368765,7 +368961,7 @@
      []
     ],
     "mediasource-duration.html.ini": [
-     "e23991a44d05dc947b282963b19b18ecddc52cab",
+     "123d6b77cf4f9a677b1f8522543420fb07f99ac3",
      []
     ],
     "mediasource-endofstream-expected.txt": [
@@ -368773,7 +368969,7 @@
      []
     ],
     "mediasource-endofstream.html.ini": [
-     "eb2f72db20e269e593f8790db2f3821f655ac224",
+     "7f2faccacee1354143b21a6bf98b6531c6d4e2e5",
      []
     ],
     "mediasource-invalid-codec.html.ini": [
@@ -369337,7 +369533,7 @@
      []
     ],
     "MediaStreamTrack-getSettings.https.html.ini": [
-     "b7ae868a18ce7ea552b64b7320ac878cc72b72aa",
+     "a2f005cab2ed8cbc58912285897e57de5dd3b0ca",
      []
     ],
     "MediaStreamTrack-iframe-audio-transfer.https.html.ini": [
@@ -370060,10 +370256,6 @@
       []
      ]
     },
-    "detach_iframe_during_open.https.window.js.ini": [
-     "428d15b89965708d8f33bff3a52e8699fe23ecad",
-     []
-    ],
     "resources": {
      "opaque-origin-sandbox.html": [
       "b3490c3341a892052ccab603722059cf8bca0cd5",
@@ -370407,7 +370599,7 @@
        []
       ],
       "navigate-initial-about-blank.html.ini": [
-       "b34e07a702ad587d2322cea8e0e3e449cd34fe0c",
+       "4aa58b51dffee4579e004546c37e7d11b687b652",
        []
       ],
       "navigate-intercept-interrupted.html.ini": [
@@ -370538,7 +370730,7 @@
     },
     "scroll-behavior": {
      "after-transition-intercept-handler-modifies.html.ini": [
-      "9d0f5ff4727d6ba7d4a9b9d22e92fcc639cd6226",
+      "b7b9b420fb1b7866b53a0543534bbef4dac2abb7",
       []
      ]
     },
@@ -370685,7 +370877,7 @@
      ]
     },
     "test-performance-attributes.sub.html.ini": [
-     "47d75920efa4ff2749eb551ff212abe5adec6984",
+     "3052bb37c5d59fba96b78feb503ade97582075b4",
      []
     ]
    },
@@ -371074,7 +371266,7 @@
       []
      ],
      "fcp-invisible-scale-transition.html.ini": [
-      "72799d77a2bc0a5d78894925e9650a6effbee268",
+      "1b20a79f0273ad13bf00c682a5baf3093ccad83c",
       []
      ],
      "fcp-invisible-scale.html.ini": [
@@ -371457,19 +371649,19 @@
      []
     ],
     "pending_beacon-sendondiscard.tentative.https.window.js.ini": [
-     "fb4467f9a034c7981e0cf3aaac9de1d0827674fb",
+     "2b9693a38d0ddbb60e799d307d8cabcab8e431f1",
      []
     ],
     "pending_beacon-sendonhidden.tentative.https.window.js.ini": [
      "4c4ab42c6f64c3fcf9fe885da4641c3675142036",
      []
     ],
-    "pending_get_beacon-cors.tentative.https.window.js.ini": [
-     "5c1d3827f1fe2f60d3bf410f4389d63432f8dffd",
+    "pending_get_beacon-send.tentative.https.window.js.ini": [
+     "1b93fe17917716e7ff5c56ebd48b84dbfd981047",
      []
     ],
-    "pending_post_beacon-sendwithdata.tentative.https.window.js.ini": [
-     "ca3117f6b5d2306c7b7c37188ff45511a4772fae",
+    "pending_post_beacon-cors.tentative.https.window.js.ini": [
+     "bec5019ad846c33f82ce713acd9677c1d1cb53ab",
      []
     ],
     "resources": {
@@ -371521,7 +371713,7 @@
      []
     ],
     "navigation-id-reset.tentative.html.ini": [
-     "5e2d5dada087d923ef9a705528b926f34d71ae41",
+     "ec4c72460bd6ab7c371d79171c65c642525550bf",
      []
     ],
     "navigation-id-resource-timing.tentative.html.ini": [
@@ -371550,7 +371742,7 @@
       []
      ],
      "performance-navigation-timing-same-origin-bfcache.tentative.window.js.ini": [
-      "2f6305077661deb5328e8fc03db0b29e57c1654d",
+      "a12a4b0fafaaadb0e55bc76b4b54f7d603b9c3cd",
       []
      ],
      "performance-navigation-timing-same-origin-replace.tentative.window.js.ini": [
@@ -371793,6 +371985,10 @@
       "a54ad04c8585af431bd123c07479959332908ee2",
       []
      ],
+     "unload-allowed-by-default.tentative.window.js.ini": [
+      "6360a03d9b2e0a9a6e94ac5a30cf26dc57b5e32c",
+      []
+     ],
      "vertical-scroll-main-frame-manual.tentative.html.headers": [
       "8d9c01e14835acbc0af74b5b9157a4a8b95243f8",
       []
@@ -371996,7 +372192,7 @@
       []
      ],
      "geolocation-report-only.https.html.ini": [
-      "74bda712526fc1da48f9887893a46a42eb6c3d1b",
+      "eb3d0b73a243e54d9d6ae5fb524a86df5ddaf7ee",
       []
      ],
      "geolocation-reporting.https.html.headers": [
@@ -375176,12 +375372,12 @@
      "4fe4a41af350f4987197ffa3727c3c9a0b40100a",
      []
     ],
-    "callback-iframe.html.ini": [
-     "2c234a543927877ad35b1dc5d40c115f745149a3",
+    "callback-exception.html.ini": [
+     "bac37b07ca084fb8a6474efda72b47b2c8f0d392",
      []
     ],
-    "callback-invoked.html.ini": [
-     "53f024d2d50b4a64394e745da6553cfae8462367",
+    "callback-iframe.html.ini": [
+     "516c69436cb5e5697f9f77fd211fd4e8e9b6ad81",
      []
     ],
     "callback-suspended.html.ini": [
@@ -375209,7 +375405,7 @@
      []
     ],
     "deadline-max-rAF-dynamic.html.ini": [
-     "e3970f541ee3bfca84f0ebb22be35a36be6087d1",
+     "765815f1eee131d9ef45461f83becc63e5ac9e15",
      []
     ],
     "deadline-max-rAF.html.ini": [
@@ -375217,7 +375413,7 @@
      []
     ],
     "deadline-max-timeout-dynamic.html.ini": [
-     "3bfcd650b2eddf708c3f5da01d0bdef9628d79fd",
+     "727f92b8c3c0ebc581c367ce59d7846238a8c034",
      []
     ],
     "deadline-max.html.ini": [
@@ -375321,7 +375517,7 @@
      []
     ],
     "content-type-parsing.html.ini": [
-     "bfcae10c3e2f47afd4197942277bc618a7539f0e",
+     "80eee616d08b673e617fb948e696d5c8fcd04cef",
      []
     ],
     "frameset-timing.html": [
@@ -375361,7 +375557,7 @@
      []
     ],
     "nested-context-navigations-iframe.html.ini": [
-     "3ca68dd96ae35f66e41bdc956f33999979d38ea0",
+     "58d4c1014736b3b59f15fd1d5f7fb57a923ac48b",
      []
     ],
     "nextHopProtocol-is-tao-protected.https.html.ini": [
@@ -375373,7 +375569,7 @@
      []
     ],
     "no-entries-for-cross-origin-css-fetched-memory-cache.sub.html.ini": [
-     "5051a9962a92f58ea898b7725c2cdc595fc253f2",
+     "1d9ea2f91acb2183c63eb009a13beab9d0f0d4fb",
      []
     ],
     "object-not-found-adds-entry.html.ini": [
@@ -375779,7 +375975,7 @@
      ]
     },
     "response-status-code.html.ini": [
-     "3a7934e73e1172008cb90bdd5301b030156be7f6",
+     "54e65d4b2d84c35757c3c266380528fa2f71e55a",
      []
     ],
     "sizes-redirect.any.js.ini": [
@@ -377738,7 +377934,7 @@
       []
      ],
      "cache-add.https.any.js.ini": [
-      "34572225ea93677f933fbc2f91a2644039616dfe",
+      "37c1e59fae0b8a8010c1497a59a22bb6b5910ce1",
       []
      ],
      "cache-add.https.any.serviceworker-expected.txt": [
@@ -377999,10 +378195,6 @@
       "b2a61d9c24fb4e80b97cb4747249e50855d8dddb",
       []
      ],
-     "client-navigate.https.html.ini": [
-      "25e308c6b9131e7814d4a4906a27b814d5fab67d",
-      []
-     ],
      "client-url-of-blob-url-worker.https-expected.txt": [
       "bc07e042a2626d0bf8c80179df67cfd90d4a5463",
       []
@@ -378124,7 +378316,7 @@
       []
      ],
      "getregistrations.https.html.ini": [
-      "3eb206fd59986453872e59eb53f1b15e9ce88b92",
+      "112c74169531f8bf80fd5969e2f2d30cdf439128",
       []
      ],
      "idlharness-sw.https-expected.txt": [
@@ -379896,7 +380088,7 @@
       []
      ],
      "unregister-immediately-during-extendable-events.https.html.ini": [
-      "5f5d44ef6825889ebe4a83a500c41ac97fecd7c6",
+      "4507f109d4a7c9681a8acaa819e15213d5906200",
       []
      ],
      "unregister-then-register-new-script.https-expected.txt": [
@@ -380822,7 +381014,7 @@
       []
      ],
      "csp-script-src-self.html.ini": [
-      "2ee71796f58f33d789fc1d41ffb6a15ca9a22cac",
+      "a85027a5d037376f15157105b98757de136b2a7e",
       []
      ],
      "csp-script-src-unsafe-inline.html.ini": [
@@ -380838,11 +381030,11 @@
       []
      ],
      "iframe-added-post-activation.html.ini": [
-      "4c72df7d4b76f031e55dea9962c4ae6f57ba15fd",
+      "6b9bf4fd20cef688bed633eea961bafe048aa419",
       []
      ],
      "indexeddb.html.ini": [
-      "3dd4ff19b55d1fb59cc6a5c63cbde535ba936cd9",
+      "d3393972fbdada59a2f814402fbe608d71388d0c",
       []
      ],
      "local-storage.html.ini": [
@@ -380854,7 +381046,7 @@
       []
      ],
      "media-autoplay.html.ini": [
-      "dcad0990b062253b60381f1c830be6cd905126e5",
+      "dbcd03784b4242abb9f2fa661b1bbe0a8d8a9b24",
       []
      ],
      "navigation-intercepted-by-service-worker.https.html.ini": [
@@ -380862,7 +381054,7 @@
       []
      ],
      "navigator-plugins.tentative.html.ini": [
-      "6d40224b5f63c0761e26dcc880f5c97c2302d641",
+      "a9fa26cb4b1628423ea781bd5ae1792dd1da06ba",
       []
      ],
      "navigator-subapp.https.tentative.html.ini": [
@@ -380870,7 +381062,7 @@
       []
      ],
      "referrer-policy-from-rules.html.ini": [
-      "c96a9be02b0806a01546d4b2c341b10d0ac3dc43",
+      "9df55d5d766468998afc12861450ec76a8d0a3ac",
       []
      ],
      "referrer-policy-mismatch.html.ini": [
@@ -381308,11 +381500,11 @@
       ]
      },
      "response-code-non-successful.html.ini": [
-      "040882e474fee18f4ad2ac9802ab29fbe6e8b2c9",
+      "66670c752c11444e2581ce351f26a96d1420eb27",
       []
      ],
      "response-code-successful.html.ini": [
-      "4a3d841c51c3b173582d290b60a027d80f4d59e6",
+      "5e8e3e4bed080d5b90b95a3c5f836a3c362e7205",
       []
      ],
      "restriction-audio-setSinkId-with-invalid-sinkId.https.tentative.html.ini": [
@@ -381344,11 +381536,11 @@
       []
      ],
      "restriction-dedicated-worker.https.html.ini": [
-      "4c890c0c2d50ca4fb5a4d1c20937fd13019d14f9",
+      "9362fa3dfd23e482e1bc3618d11486040fcb6064",
       []
      ],
      "restriction-encrypted-media-unsupported-config.https.html.ini": [
-      "a6597b57e39191e52fa5af97b803ec5445912e9a",
+      "ba53aa9f8f5796948c6ae068e81a4e2627481d47",
       []
      ],
      "restriction-encrypted-media.https.html.ini": [
@@ -381364,7 +381556,7 @@
       []
      ],
      "restriction-local-file-system-access.https.html.ini": [
-      "c84576de50370eafaf0fdf6303f14959e0d0b506",
+      "ab826f5f0b49867c20a0fb16953f2a7fca384ed6",
       []
      ],
      "restriction-media-auto-play-attribute.html.ini": [
@@ -381372,7 +381564,7 @@
       []
      ],
      "restriction-media-camera.https.html.ini": [
-      "591023622258a14009844ba4319751027e3d104d",
+      "f2b8f0c656ec7e8f559732df8628b96f7f40a018",
       []
      ],
      "restriction-media-device-info.https.html.ini": [
@@ -381388,7 +381580,7 @@
       []
      ],
      "restriction-message-boxes.html.ini": [
-      "8bd97880f870a2162a3f55e3fd75921935149f95",
+      "aeb2a55b80067815a8f7a29f90ebe9516a3f2544",
       []
      ],
      "restriction-midi-sysex.https.html.ini": [
@@ -381412,7 +381604,7 @@
       []
      ],
      "restriction-prompt-by-before-unload.html.ini": [
-      "9071c15b87697193ea73217de7e7e382282251e6",
+      "465f205d31b2c64fbf8abc8dfd6932d663df3e38",
       []
      ],
      "restriction-push.https.html.ini": [
@@ -381420,11 +381612,11 @@
       []
      ],
      "restriction-request-picture-in-picture.html.ini": [
-      "32004d9c3e0882ddf1626a064294901da9c192c3",
+      "9bfa95ff89d6b4a022ac7a56aa4a2714c610007a",
       []
      ],
      "restriction-screen-capture.https.html.ini": [
-      "eae5030bd126293522bc44be0c8a546ec4d529db",
+      "d5fb1f04fe0f3bcad366f5563e21fbd7616ee3c7",
       []
      ],
      "restriction-screen-orientation-lock.https.html.ini": [
@@ -381456,11 +381648,11 @@
       []
      ],
      "restriction-service-worker-update.https.html.ini": [
-      "fb6c6b0ed6665fbfd6a343a00bbd1bb2c0bc17ac",
+      "f0afa05263b0f0e6cf6d67fa8dc79e0298784281",
       []
      ],
      "restriction-speech-synthesis.html.ini": [
-      "c8b329d54aa3a58e3d46a6bcf37e2690d62df42e",
+      "ad1ad4c2b02022f3bdfe9a9b47eb552ff4a2e77f",
       []
      ],
      "restriction-storage-persist.https.html.ini": [
@@ -381480,7 +381672,7 @@
       []
      ],
      "restriction-web-nfc.https.html.ini": [
-      "7b6623c8927bd428283236118b777abe45c1ec3c",
+      "2a03aca3d9be39ee1474a927a68ebe915eccdab6",
       []
      ],
      "restriction-web-serial.tentative.https.html.ini": [
@@ -381500,7 +381692,7 @@
       []
      ],
      "restriction-web-xr-inline-session.https.html.ini": [
-      "ea71fd807083994b5c7a44a3b3ff9f69514da4f2",
+      "6942089df4db415f51e4425c844b75a400e27e99",
       []
      ],
      "restriction-window-move.html.ini": [
@@ -381508,7 +381700,7 @@
       []
      ],
      "restriction-window-open.html.ini": [
-      "4be1f7aaad1cca7f778a76d02560af283512a421",
+      "73abde50066e763dcde1b4e9fcccacfb79df6b53",
       []
      ],
      "restriction-window-resize.html.ini": [
@@ -381536,7 +381728,7 @@
       []
      ],
      "session-history-navigation.https.html.ini": [
-      "415a3a12191d7a34eaf77563cfefe781cb30152e",
+      "e918764ba330c1dbe8b9acf6df9193097292f7aa",
       []
      ],
      "session-history-pushstate.https.html.ini": [
@@ -381552,7 +381744,7 @@
       []
      ],
      "state-and-event.html.ini": [
-      "1024f525bd89563ef01ad1c2f508ec36b8f28b41",
+      "aa4211fec85a0fcc0270c2b6ac7dcf42375538df",
       []
      ],
      "storage-foundation.https-expected.txt": [
@@ -381580,11 +381772,11 @@
       []
      ],
      "windowclient-navigate.https.html.ini": [
-      "39d9146646fb22716fb2eea79651558ad542443c",
+      "1ea18b66ef38498d1a9a053e0d365cdabc7308d3",
       []
      ],
      "workers.html.ini": [
-      "a986d42ada540991b539b92e5597b2487a0aafc3",
+      "bea4222f27851dccbb90476168b980946342743c",
       []
      ]
     }
@@ -381695,7 +381887,7 @@
      []
     ],
     "partitioned-estimate-usage-details-caches.tentative.https.sub.html.ini": [
-     "d95804af09687c10ced44d69e856cfa2927c32eb",
+     "322ad2157ae639cae314cec8f16bcd57106ea03a",
      []
     ],
     "resources": {
@@ -385397,7 +385589,7 @@
      []
     ],
     "a-element-xhtml.xhtml.ini": [
-     "4dc486023eb7669d5cf960cd965a05edab58ad50",
+     "d60c2c9e998e554b5ee7525b49d427af871ff493",
      []
     ],
     "a-element-xhtml_include=javascript-expected.txt": [
@@ -385409,7 +385601,7 @@
      []
     ],
     "a-element.html.ini": [
-     "b89c7d861ce265a9467fab11c8d84cc772c908c3",
+     "a2b12dccf72956247b5475b462159113b76698b8",
      []
     ],
     "a-element_include=javascript-expected.txt": [
@@ -385421,7 +385613,7 @@
      []
     ],
     "failure.html.ini": [
-     "8d725a2a4e734bf76941dbf0ffa09b3ea6be8269",
+     "ac1e11adfbbca7c154c57a3b425a5394b9424e38",
      []
     ],
     "idlharness-shadowrealm.window-expected.txt": [
@@ -385429,11 +385621,11 @@
      []
     ],
     "idlharness-shadowrealm.window.js.ini": [
-     "1fb49415db04546f898a6416b2794ee4d1c1e4ad",
+     "0c7e3284847a27d3473c7cd5edd910dd3a28ed6a",
      []
     ],
     "percent-encoding.window.js.ini": [
-     "36d57023fae6a0fbf2d834ab075a368470e527de",
+     "1091bffa2c6ebfc3c45547eb4ba0f53edaab55cc",
      []
     ],
     "resources": {
@@ -385471,7 +385663,7 @@
      []
     ],
     "toascii.window.js.ini": [
-     "bfb782f6ca2103ebe15ca2d59c0db841957c0d78",
+     "f1a9b16df7d1ee5bef2cd897d4ab8341aa1e0cea",
      []
     ],
     "url-constructor.any.js.ini": [
@@ -385499,7 +385691,7 @@
      []
     ],
     "url-setters-a-area.window.js.ini": [
-     "96cdbb9f3bd15b9003841def1a428a6cd36f4910",
+     "d90657abb87b4bf1c1f5bf2bb075cec4a4967936",
      []
     ],
     "url-setters-a-area.window_include=javascript-expected.txt": [
@@ -385547,11 +385739,11 @@
      []
     ],
     "urlsearchparams-get.any.js.ini": [
-     "9c74fd4fd8d68e549eeced0730dbb78e09125ef9",
+     "e0afce635f0b70de1d746af7d99c52f03a2f4aab",
      []
     ],
     "urlsearchparams-stringifier.any.js.ini": [
-     "acdd4a89a63a0eb390ff0ae47d16c4300f74b64c",
+     "5874c971b74d0e95b67f80b43d297b8de921010c",
      []
     ]
    },
@@ -385653,10 +385845,6 @@
     "request-video-frame-callback-webrtc.https.html.ini": [
      "447e1523bdef4f7e5ddb4c4907807f1302add84c",
      []
-    ],
-    "request-video-frame-callback.html.ini": [
-     "5fa8925da2dd13e104ed658633b5c8832371245e",
-     []
     ]
    },
    "virtual-keyboard": {
@@ -386475,6 +386663,12 @@
        []
       ]
      },
+     "combining-effects": {
+      "applying-interpolated-transform.html.ini": [
+       "97eea3e28e042fbdfa271d7a2879ad7f30b5de4c",
+       []
+      ]
+     },
      "keyframe-effects": {
       "computed-keyframes-shorthands-expected.txt": [
        "03400ec387856e7c7a2a1d30508bc5e52a08bf20",
@@ -386539,7 +386733,7 @@
      },
      "Animation": {
       "finished.html.ini": [
-       "41cae1fd2692b24015be10ddaaa43571e59f5265",
+       "852bf244c7b63a89a307d9c46bf696398ce12e2a",
        []
       ],
       "onremove.html.ini": [
@@ -386556,6 +386750,10 @@
        "fd109580df55b17271654e178f8b397c6553da83",
        []
       ],
+      "getKeyframes.html.ini": [
+       "d644a16367642c67dc1c62758179427b4f4ff5be",
+       []
+      ],
       "iterationComposite-expected.txt": [
        "5319aefca8ebc4b276a13c936b91f71f2a3a9322",
        []
@@ -386751,7 +386949,7 @@
        []
       ],
       "sibling-iframe-timeline.html.ini": [
-       "a8fc04d2cf93997a96a2830e046638623cf7e75f",
+       "675b3f1bf576cac09b7b92d0a3579e3d0c26c018",
        []
       ],
       "timelines.html.ini": [
@@ -387176,7 +387374,7 @@
       ]
      },
      "reuse-web-bundle-resource.https.tentative.html.ini": [
-      "91c2d2ddb0d2531a8bbdffe5999a1af73c1eff9c",
+      "ffa17e97b5ec0c00e2ede58ad68011546e77569d",
       []
      ]
     },
@@ -387209,6 +387407,10 @@
       "f33d260c1e062f381860e81d3ade0d648d0ecf19",
       []
      ],
+     "held.tentative.https.html.ini": [
+      "2e75f6a531662ba39992bc30b39159007df01141",
+      []
+     ],
      "helpers.js": [
       "7997f982a8f748281c21e1be05c9c74407600fe2",
       []
@@ -387224,20 +387426,12 @@
      "release.tentative.https.html.ini": [
       "f580f5e14398488bb0ca0d1b7db19639af60315f",
       []
-     ],
-     "sharedworker-multiple.tentative.https.html.ini": [
-      "d8bf264011d4080217ef892d547ee92890c3aed3",
-      []
      ]
     },
     "clientids.tentative.https.html.ini": [
      "4423c326ffe912062124a75cc712052f08b5a15e",
      []
     ],
-    "query-ordering.tentative.https.html.ini": [
-     "b63d722ab7dd33bb4eac37228311c006f2ed749b",
-     []
-    ],
     "query.tentative.https.any.js.ini": [
      "ce2966b3d29a183be238c0953ecf1f9b92275f21",
      []
@@ -387777,7 +387971,7 @@
        ]
       },
       "suspended-context-messageport.https.html.ini": [
-       "2a7592e94907ad10e1f5381d896f2b92c552d98a",
+       "fc818e512258c944f06669adeba465158ed469fa",
        []
       ]
      },
@@ -387815,12 +388009,6 @@
        []
       ]
      },
-     "the-mediaelementaudiosourcenode-interface": {
-      "mediaElementAudioSourceToScriptProcessorTest.html.ini": [
-       "54e187f264764606404d9d3cbebc52f956b7cd0c",
-       []
-      ]
-     },
      "the-pannernode-interface": {
       "test-pannernode-automation.html.ini": [
        "20900aabd2ca3a1adb92d1b2b0a46bf8a4213bb2",
@@ -388970,7 +389158,7 @@
       ]
      },
      "workers.html.ini": [
-      "fd51247a007880b73ef8775e6641bb619b299ba4",
+      "49c27878b8e2dd76c9318c237adb8158c68ad935",
       []
      ]
     },
@@ -389008,10 +389196,6 @@
      "user-activation.tentative.any.worker-expected.txt": [
       "f953e25d9ef727b48984300d1e79ce87c71f2400",
       []
-     ],
-     "worker-post-after-close.any.js.ini": [
-      "38e85428689067832d346340f862f98b5478bf08",
-      []
      ]
     },
     "multi-globals": {
@@ -389055,7 +389239,7 @@
      []
     ],
     "postMessage_Date.sub.htm.ini": [
-     "dd186255000a3418f074ec18595d102f3a8b3010",
+     "2ab22ee829dc70f1e8ed1a10c98286e0f0b6f8e6",
      []
     ],
     "resources": {
@@ -389119,8 +389303,8 @@
       "225bd7a41e38280bdb0891ecbf8cd4c39a4c3029",
       []
      ],
-     "021.html.ini": [
-      "fd4aad14082878fb8cd021b5a6791e1d0e4ec620",
+     "020.html.ini": [
+      "b35e66e6b3ce06b2885f4808ec48df56a5e255f0",
       []
      ],
      "025-1.js": [
@@ -394237,7 +394421,7 @@
      ]
     },
     "getInputPose_handedness.https.html.ini": [
-     "d8248cc6ea03b54131d5eb4d5de8c6f0e7ecb718",
+     "7b98d3a540b67c47087c922b94338b8248b119e1",
      []
     ],
     "getInputPose_pointer.https.html.ini": [
@@ -394555,7 +394739,7 @@
      []
     ],
     "xrSession_requestAnimationFrame_getViewerPose.https.html.ini": [
-     "13ee403018cff6c6a876a924f21469c64bebaf7a",
+     "fd22b34a0c12a853179814f71a3c2bcc1eca2838",
      []
     ],
     "xrSession_requestAnimationFrame_timestamp.https.html.ini": [
@@ -394567,7 +394751,7 @@
      []
     ],
     "xrSession_requestReferenceSpace_features.https.html.ini": [
-     "05ff8fbd481253fa3c47593d7a6feafecee3c569",
+     "2e02a8cdd773669852af2fbffb2c8a445e254dc2",
      []
     ],
     "xrSession_requestSessionDuringEnd.https.html.ini": [
@@ -394591,7 +394775,7 @@
      []
     ],
     "xrStationaryReferenceSpace_floorlevel_updates.https.html.ini": [
-     "f3f6f18a9888a159d2246d8b6dadd5c5a47f0a90",
+     "5011c0dba50647a08d3ef0786348647351abe8aa",
      []
     ],
     "xrView_eyes.https.html.ini": [
@@ -394985,7 +395169,7 @@
      []
     ],
     "dedicated-worker-from-blob-url.window.js.ini": [
-     "b6f8e24e5a0d7742cdd446ae46283964140925f2",
+     "282999e38b34fbb255ff0a9021e8419d9f039d02",
      []
     ],
     "dedicated-worker-in-data-url-context.window-expected.txt": [
@@ -394993,7 +395177,7 @@
      []
     ],
     "dedicated-worker-in-data-url-context.window.js.ini": [
-     "491bbc07d1a0296cc85e4779c53f2d568be5445a",
+     "0521a49adf986aad676dc8ffe895e8b2b9128685",
      []
     ],
     "dedicated-worker-parse-error-failure-expected.txt": [
@@ -395116,7 +395300,7 @@
         []
        ],
        "redirect.html.ini": [
-        "3a0f10f26cb7bf5f58f70a9cb9691f6886a5421a",
+        "fd33d33be2f9c0d25ef8afed8d0a024b96686d2f",
         []
        ],
        "redirect.js": [
@@ -395275,10 +395459,6 @@
         "7fc6d0dd64bc82527621a90f848d080a195ed212",
         []
        ],
-       "report-error-same-origin.sub.any.js.ini": [
-        "fc2db87626d1b74fb0a562bc69817960e0d3d0cb",
-        []
-       ],
        "report-error-setTimeout-same-origin.sub.any.js.ini": [
         "c377da75fb4f059f637e853be80518296101ffe7",
         []
@@ -395330,7 +395510,7 @@
       []
      ],
      "dedicated-worker-import-meta.html.ini": [
-      "1457ee30dc6f11cbb7c828c35e02aecbb3d8d32a",
+      "f19304df704b1d471ff207e02c732b496ca0efee",
       []
      ],
      "dedicated-worker-options-credentials.html.headers": [
@@ -395754,10 +395934,6 @@
       ]
      },
      "reporting-errors": {
-      "001.html.ini": [
-       "6dd41a78c5dbadee0bf910831e3d4400c1ed1e8c",
-       []
-      ],
       "001.js": [
        "5736666cc3b623cb47af4fc04161c6c5345198c6",
        []
@@ -395795,10 +395971,6 @@
       "002.js": [
        "627272aaefa3457f90417ed0f19e967a2c036273",
        []
-      ],
-      "003.html.ini": [
-       "d78390839335a1bcdc75a17f3efd17b836a18f5b",
-       []
       ]
      },
      "structured-clone": {
@@ -395861,7 +396033,7 @@
      }
     },
     "shared-worker-from-blob-url.window.js.ini": [
-     "c0b9f73dd5a602a4709377a83f8b99c3f11f7275",
+     "1b1b5385aec1fbd8652e9794e559b215566fd33f",
      []
     ],
     "shared-worker-in-data-url-context.window-expected.txt": [
@@ -395869,7 +396041,7 @@
      []
     ],
     "shared-worker-in-data-url-context.window.js.ini": [
-     "e0d2ea3da3267420c2716d5c8b4fc826e331f0c1",
+     "5f4813ffa460d69a9f767322ae29502df3cdc1c1",
      []
     ],
     "shared-worker-parse-error-failure.html.ini": [
diff --git a/third_party/blink/web_tests/external/wpt/FileAPI/url/url-charset.window.js.ini b/third_party/blink/web_tests/external/wpt/FileAPI/url/url-charset.window.js.ini
index bf7e035b..3b6728bf 100644
--- a/third_party/blink/web_tests/external/wpt/FileAPI/url/url-charset.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/FileAPI/url/url-charset.window.js.ini
@@ -1,3 +1,3 @@
 [url-charset.window.html]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/bindings-inject-values-bypass-chain.html.ini b/third_party/blink/web_tests/external/wpt/IndexedDB/bindings-inject-values-bypass-chain.html.ini
new file mode 100644
index 0000000..ab75b1b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/IndexedDB/bindings-inject-values-bypass-chain.html.ini
@@ -0,0 +1,3 @@
+[bindings-inject-values-bypass-chain.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
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 d66e6b88..8aa6e3e 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 (flag_specific == "") and (product == "chrome"): OK
-    if flag_specific == "disable-site-isolation-trials": OK
+    if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [OK, TIMEOUT]
+    if product == "chrome": OK
     TIMEOUT
   [Get upper/lower excluded]
     expected: [PASS, TIMEOUT]
@@ -14,12 +14,15 @@
 
 
 [idbobjectstore_batchGetAll_largeValue.tentative.any.worker.html]
-  expected: TIMEOUT
+  expected:
+    if flag_specific == "disable-site-isolation-trials": OK
+    TIMEOUT
   [Get bound range with maxCount]
     expected: [PASS, TIMEOUT]
 
   [Get upper/lower excluded]
-    expected: TIMEOUT
+    expected:
+      if product == "chrome": TIMEOUT
 
   [Get bound range]
     expected: [PASS, TIMEOUT]
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 c891251..4cb35b9 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,4 +1,2 @@
 [test.html]
-  expected:
-    if (flag_specific == "") and (os == "win"): [FAIL, TIMEOUT]
-    FAIL
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/inheritance/blob-url-inherits-from-initiator.sub.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/inheritance/blob-url-inherits-from-initiator.sub.html.ini
deleted file mode 100644
index 6341f19..0000000
--- a/third_party/blink/web_tests/external/wpt/content-security-policy/inheritance/blob-url-inherits-from-initiator.sub.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[blob-url-inherits-from-initiator.sub.html]
-  expected:
-    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/inheritance/history.sub.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/inheritance/history.sub.html.ini
index 9728b70..5d8b1077 100644
--- a/third_party/blink/web_tests/external/wpt/content-security-policy/inheritance/history.sub.html.ini
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/inheritance/history.sub.html.ini
@@ -1,3 +1,3 @@
 [history.sub.html]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/inheritance/window.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/inheritance/window.html.ini
new file mode 100644
index 0000000..b774166
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/inheritance/window.html.ini
@@ -0,0 +1,3 @@
+[window.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
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 126f7265..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 flag_specific == "disable-layout-ng": [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 f5c29c6..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,4 +1,6 @@
 [cookieStore_set_arguments.https.any.serviceworker.html]
+
+[cookieStore_set_arguments.https.any.html]
   [cookieStore.set with expires set to a future Date]
     expected:
       if os == "win": [PASS, FAIL]
@@ -6,6 +8,3 @@
   [cookieStore.set with expires set to a future timestamp]
     expected:
       if os == "win": [PASS, FAIL]
-
-
-[cookieStore_set_arguments.https.any.html]
diff --git a/third_party/blink/web_tests/external/wpt/cookies/samesite/form-post-blank-reload.https.html.ini b/third_party/blink/web_tests/external/wpt/cookies/samesite/form-post-blank-reload.https.html.ini
index 474bdcb9..25c3e4a 100644
--- a/third_party/blink/web_tests/external/wpt/cookies/samesite/form-post-blank-reload.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/cookies/samesite/form-post-blank-reload.https.html.ini
@@ -1,3 +1,5 @@
 [form-post-blank-reload.https.html]
+  expected:
+    if product == "chrome": ERROR
   [Reloaded cross-site top-level form POSTs are strictly same-site]
     expected: FAIL
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-cascade/all-prop-revert-layer-noop.html.ini b/third_party/blink/web_tests/external/wpt/css/css-cascade/all-prop-revert-layer-noop.html.ini
deleted file mode 100644
index 2d36107..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-cascade/all-prop-revert-layer-noop.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[all-prop-revert-layer-noop.html]
-  expected:
-    if (os == "linux") and (product == "content_shell") and (flag_specific == ""): TIMEOUT
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 076a237..e92a5bb1 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,2 +1,4 @@
 [nested-query-containers.html]
-  expected: CRASH
+  expected:
+    if os == "win": [TIMEOUT, CRASH]
+    CRASH
diff --git a/third_party/blink/web_tests/external/wpt/css/css-content/content-none-option.html.ini b/third_party/blink/web_tests/external/wpt/css/css-content/content-none-option.html.ini
index 01e09de3..4a2bf32 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-content/content-none-option.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-content/content-none-option.html.ini
@@ -1,2 +1,4 @@
 [content-none-option.html]
-  expected: FAIL
+  expected:
+    if (os == "linux") and (product == "content_shell") and (flag_specific == ""): [FAIL, CRASH]
+    FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-007v.html.ini b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-007v.html.ini
index af286b78..a76df17 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-007v.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-007v.html.ini
@@ -9,32 +9,32 @@
 
   [.flexbox > img 9]
     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 1]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
 
   [.flexbox > img 12]
     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 11]
     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
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/scrollbars.html.ini b/third_party/blink/web_tests/external/wpt/css/css-flexbox/scrollbars.html.ini
index 61aafeb..63fe9f1 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-flexbox/scrollbars.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/scrollbars.html.ini
@@ -1,3 +1,4 @@
 [scrollbars.html]
   expected:
+    if (flag_specific == "") and (os == "win"): [PASS, CRASH]
     if flag_specific == "disable-layout-ng": FAIL
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 9451204..46ebc05b 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,4 +1,3 @@
 [Initial-letter-breaking-rtl.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-breaking-vlr.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/Initial-letter-breaking-vlr.html.ini
index eb19349..0a5f5745 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/Initial-letter-breaking-vlr.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/Initial-letter-breaking-vlr.html.ini
@@ -1,4 +1,3 @@
 [Initial-letter-breaking-vlr.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-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-over-ruby-tall.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-drop-over-ruby-tall.html.ini
index 7ba52f0..c971ae3 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-drop-over-ruby-tall.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-drop-over-ruby-tall.html.ini
@@ -1,4 +1,3 @@
 [initial-letter-block-position-drop-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-margins-rtl.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-margins-rtl.html.ini
index 59e19d6..4954d8f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-margins-rtl.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-margins-rtl.html.ini
@@ -1,4 +1,3 @@
 [initial-letter-block-position-margins-rtl.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-raise-under-ruby-tall.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-raise-under-ruby-tall.html.ini
index 9de6f52..60f3521d2 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-raise-under-ruby-tall.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-raise-under-ruby-tall.html.ini
@@ -1,3 +1,4 @@
 [initial-letter-block-position-raise-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-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 160941f..984123ce 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,4 +1,3 @@
 [initial-letter-drop-initial-vlr.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-drop-initial.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-drop-initial.html.ini
index bda49d3..497ccbc 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-drop-initial.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-drop-initial.html.ini
@@ -1,4 +1,3 @@
 [initial-letter-drop-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-float-001-rtl.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-001-rtl.html.ini
index 339ba097..d350ddf 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-001-rtl.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-001-rtl.html.ini
@@ -1,4 +1,3 @@
 [initial-letter-float-001-rtl.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-float-001-vrl.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-001-vrl.html.ini
index a18c546..ff51dd5 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-001-vrl.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-001-vrl.html.ini
@@ -1,3 +1,4 @@
 [initial-letter-float-001-vrl.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-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-indentation-rtl.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-indentation-rtl.html.ini
index 495a53a6..9cd2cdc 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-indentation-rtl.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-indentation-rtl.html.ini
@@ -1,3 +1,4 @@
 [initial-letter-indentation-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-raise-initial-rtl.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-raise-initial-rtl.html.ini
index 679ba2c..51860775 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-raise-initial-rtl.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-raise-initial-rtl.html.ini
@@ -1,4 +1,4 @@
 [initial-letter-raise-initial-rtl.html]
   expected:
-    if (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
-    if product == "chrome": 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-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-sunk-initial-vlr.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-sunk-initial-vlr.html.ini
index 63edb9d..82403e6 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-sunk-initial-vlr.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-sunk-initial-vlr.html.ini
@@ -1,3 +1,4 @@
 [initial-letter-sunk-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-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 77a501b5..145423c1 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,3 +1,4 @@
 [initial-letter-sunk-initial-vrl.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.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-sunk-initial.html.ini
index e605fe8..2a59287 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-sunk-initial.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-sunk-initial.html.ini
@@ -1,4 +1,3 @@
 [initial-letter-sunk-initial.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-with-first-line.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-with-first-line.html.ini
index 56e94a867..7f69acb 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-with-first-line.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-with-first-line.html.ini
@@ -1,4 +1,3 @@
 [initial-letter-with-first-line.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-multicol/getclientrects-000.html.ini b/third_party/blink/web_tests/external/wpt/css/css-multicol/getclientrects-000.html.ini
index daa4f64c9..78f81bd 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-multicol/getclientrects-000.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-multicol/getclientrects-000.html.ini
@@ -1,3 +1,24 @@
 [getclientrects-000.html]
-  expected:
-    if os == "win": [OK, TIMEOUT]
+  [vertical-lr ltr]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [vertical-rl rtl]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [vertical-lr rtl]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [horizontal-tb ltr]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [vertical-rl ltr]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [horizontal-tb rtl]
+    expected:
+      if product == "chrome": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-overflow/scrollable-overflow-input-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-overflow/scrollable-overflow-input-001.html.ini
index 6351a3d..0fd1d59 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-overflow/scrollable-overflow-input-001.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-overflow/scrollable-overflow-input-001.html.ini
@@ -1,3 +1,4 @@
 [scrollable-overflow-input-001.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-paint-api/paint-function-this-value.https.html.ini b/third_party/blink/web_tests/external/wpt/css/css-paint-api/paint-function-this-value.https.html.ini
new file mode 100644
index 0000000..28735b17
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-paint-api/paint-function-this-value.https.html.ini
@@ -0,0 +1,3 @@
+[paint-function-this-value.https.html]
+  expected:
+    if os == "win": [PASS, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-paint-api/parse-input-arguments-018.https.html.ini b/third_party/blink/web_tests/external/wpt/css/css-paint-api/parse-input-arguments-018.https.html.ini
index 50b52c17..9905f9f8 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-paint-api/parse-input-arguments-018.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-paint-api/parse-input-arguments-018.https.html.ini
@@ -1,4 +1,2 @@
 [parse-input-arguments-018.https.html]
-  expected:
-    if (os == "linux") and (product == "chrome"): CRASH
-    if os == "win": CRASH
+  expected: CRASH
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
deleted file mode 100644
index 654ce46..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-ruby/ruby-text-combine-upright-001b.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[ruby-text-combine-upright-001b.html]
-  expected:
-    if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/bidi/bidi-lines-001.html b/third_party/blink/web_tests/external/wpt/css/css-text/bidi/bidi-lines-001.html
new file mode 100644
index 0000000..c49d572
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/bidi/bidi-lines-001.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text Test: unicode-bidi: plaintext and paragraphs with strong directionality</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-details">
+<link rel="match" href="reference/bidi-lines-001-ref.html">
+<meta name=assert content="with unicode-bidi: plaintext, lines from bidi paragraphs with strong directionality use that direction">
+<style>
+div {
+    font-size: 2em;
+    width: 10em;
+    white-space: pre;
+    text-align: start;
+    unicode-bidi: plaintext;
+    border: solid; padding: 0 0.5ch;
+}
+
+</style>
+
+<p>This test passes if all instances of “français” are left aligned, and all instances of “فارسی” are right aligned within the box below.
+
+<div>français
+فارسی
+français
+فارسی
+français
+فارسی</div>
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/bidi/bidi-lines-002.html b/third_party/blink/web_tests/external/wpt/css/css-text/bidi/bidi-lines-002.html
new file mode 100644
index 0000000..5a90387a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/bidi/bidi-lines-002.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text Test: unicode-bidi: plaintext and neutral paragraphs</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-details">
+<link rel="match" href="reference/bidi-lines-002-ref.html">
+<meta name=assert content="with unicode-bidi: plaintext, bidi paragraphs only containing weak / neutral characters take their directionality from the previous paragraph if any, or the containing block otherwise.">
+<style>
+div {
+    direction: rtl;
+    unicode-bidi: plaintext;
+    text-align: start;
+    font-size: 2em;
+    width: 10em;
+    border: solid; padding: 0 0.5ch;
+}
+.l { color: blue; }
+.r { color: orange; }
+</style>
+
+<p>This test passes if within the box below, the two blue “!” are on the left, and the three orange ones are on the right.
+
+<div>
+    <span class=r>!</span><br>
+    <span class=l>!</span> Hello<br>
+    <span class=l>!</span><br>
+    <span class=r>!</span> سلام<br>
+    <span class=r>!</span><br>
+</div>
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/bidi/bidi-lines-002.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/bidi/bidi-lines-002.html.ini
new file mode 100644
index 0000000..6a5b59f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/bidi/bidi-lines-002.html.ini
@@ -0,0 +1,2 @@
+[bidi-lines-002.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/bidi/reference/bidi-lines-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text/bidi/reference/bidi-lines-001-ref.html
new file mode 100644
index 0000000..ab13fef
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/bidi/reference/bidi-lines-001-ref.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text Test: unicode-bidi: plaintext and paragraphs with strong directionality</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<style>
+section {
+    text-align: start;
+    font-size: 2em;
+    border: solid;
+    padding: 0 0.5ch;
+    width: 10em;
+}
+</style>
+
+<p>This test passes if all instances of “français” are left aligned, and all instances of “فارسی” are right aligned within the box below.
+
+<section>
+    <div dir=ltr>français</div>
+    <div dir=rtl>فارسی</div>
+    <div dir=ltr>français</div>
+    <div dir=rtl>فارسی</div>
+    <div dir=ltr>français</div>
+    <div dir=rtl>فارسی</div>
+</section>
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/bidi/reference/bidi-lines-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text/bidi/reference/bidi-lines-002-ref.html
new file mode 100644
index 0000000..af162f01
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/bidi/reference/bidi-lines-002-ref.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text Test: unicode-bidi: plaintext and neutral paragraphs</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<style>
+section {
+    text-align: start;
+    font-size: 2em;
+    border: solid;
+    padding: 0 0.5ch;
+    width: 10em;
+}
+.l { color: blue; }
+.r { color: orange; }
+</style>
+
+<p>This test passes if within the box below, the two blue “!” are on the left, and the three orange ones are on the right.
+
+<section>
+<div dir=rtl><span class=r>!</span></div>
+<div dir=ltr><span class=l>!</span> Hello</div>
+<div dir=ltr><span class=l>!</span></div>
+<div dir=rtl><span class=r>!</span> سلام</div>
+<div dir=rtl><span class=r>!</span></div>
+</section>
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/line-breaking-023.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/line-breaking-023.html
new file mode 100644
index 0000000..b8e957dc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/line-breaking-023.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text Test: fallback line breaking (Javanese)</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-details">
+<link rel="mismatch" href="reference/line-breaking-023-ref.html">
+<meta name=assert content="In languages requiring lexical or orthographic analysis for line breaking, some form of fallback line breaking must occur even if the UA doesn't know how to perform it correctly. Overflowing is not allowed.">
+<style>
+div {
+    border-right: 6em solid;
+    width: 6em;
+}
+.test {
+    color: blue;
+}
+.ref {
+    white-space: pre;
+    color: orange;
+}
+section {
+    width: max-content;
+}
+</style>
+
+<p>This test passes if the <strong>blue text wraps</strong> into more that one line, making it <strong>different</strong> from the orange one.
+
+
+<section>
+<div class=test lang="jv-Java">꧋ꦱꦧꦼꦤ꧀ꦲꦸꦩꦠ꧀ꦩꦤꦸꦁꦱꦭꦲꦶꦂꦏꦤ꧀ꦛꦶꦲꦏ꧀ꦲꦏ꧀ꦏꦁꦥꦺꦴꦝꦺꦴꦭꦤ꧀ꦥꦶꦤꦱ꧀ꦛꦶꦭꦤ꧀ꦏꦤ꧀ꦛꦶꦏꦧꦺꦧꦱ꧀ꦱꦤ꧀ꦏꦧꦺꦧꦱ꧀ꦱꦤ꧀ꦲꦶꦁꦧꦏꦸꦤꦶꦁꦲꦁꦒꦼꦂꦲꦁꦒꦼꦂ</div>
+
+<div class=ref lang="jv-Java">꧋ꦱꦧꦼꦤ꧀ꦲꦸꦩꦠ꧀ꦩꦤꦸꦁꦱꦭꦲꦶꦂꦏꦤ꧀ꦛꦶꦲꦏ꧀ꦲꦏ꧀ꦏꦁꦥꦺꦴꦝꦺꦴꦭꦤ꧀ꦥꦶꦤꦱ꧀ꦛꦶꦭꦤ꧀ꦏꦤ꧀ꦛꦶꦏꦧꦺꦧꦱ꧀ꦱꦤ꧀ꦏꦧꦺꦧꦱ꧀ꦱꦤ꧀ꦲꦶꦁꦧꦏꦸꦤꦶꦁꦲꦁꦒꦼꦂꦲꦁꦒꦼꦂ</div>
+</section>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/line-breaking-023.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/line-breaking-023.html.ini
new file mode 100644
index 0000000..b72147da
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/line-breaking-023.html.ini
@@ -0,0 +1,2 @@
+[line-breaking-023.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/line-breaking-024.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/line-breaking-024.html
new file mode 100644
index 0000000..14b8c9b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/line-breaking-024.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text Test: fallback line breaking (Khmer)</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-details">
+<link rel="mismatch" href="reference/line-breaking-024-ref.html">
+<meta name=assert content="In languages requiring lexical or orthographic analysis for line breaking, some form of fallback line breaking must occur even if the UA doesn't know how to perform it correctly. Overflowing is not allowed.">
+<style>
+div {
+    border-right: 6em solid;
+    width: 6em;
+}
+.test {
+    color: blue;
+}
+.ref {
+    white-space: pre;
+    color: orange;
+}
+</style>
+
+<p>This test passes if the <strong>blue text wraps</strong> into more that one line, making it <strong>different</strong> from the orange one.
+
+
+<div class=test lang="km">ការទទួលស្គាល់សេចក្ដីថ្លៃថ្នូរជាប់ពីកំណើត</div>
+
+<div class=ref lang="km">ការទទួលស្គាល់សេចក្ដីថ្លៃថ្នូរជាប់ពីកំណើត</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/line-breaking-025.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/line-breaking-025.html
new file mode 100644
index 0000000..57c9ee4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/line-breaking-025.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text Test: fallback line breaking (Lao)</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-details">
+<link rel="mismatch" href="reference/line-breaking-025-ref.html">
+<meta name=assert content="In languages requiring lexical or orthographic analysis for line breaking, some form of fallback line breaking must occur even if the UA doesn't know how to perform it correctly. Overflowing is not allowed.">
+<style>
+div {
+    border-right: 6em solid;
+    width: 6em;
+}
+.test {
+    color: blue;
+}
+.ref {
+    white-space: pre;
+    color: orange;
+}
+</style>
+
+<p>This test passes if the <strong>blue text wraps</strong> into more that one line, making it <strong>different</strong> from the orange one.
+
+
+<div class=test lang="lo">ການຮັບຮູ້ກຽດຕິສັກອັນມີປະຈຳຢູ່ຕົວບຸກຄົນໃນວົງສະກຸນຂອງມະນຸດທຸກໆຄົນ</div>
+
+<div class=ref lang="lo">ການຮັບຮູ້ກຽດຕິສັກອັນມີປະຈຳຢູ່ຕົວບຸກຄົນໃນວົງສະກຸນຂອງມະນຸດທຸກໆຄົນ</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/line-breaking-026.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/line-breaking-026.html
new file mode 100644
index 0000000..fdabe9fa
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/line-breaking-026.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text Test: fallback line breaking (Thai)</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-details">
+<link rel="mismatch" href="reference/line-breaking-026-ref.html">
+<meta name=assert content="In languages requiring lexical or orthographic analysis for line breaking, some form of fallback line breaking must occur even if the UA doesn't know how to perform it correctly. Overflowing is not allowed.">
+<style>
+div {
+    border-right: 6em solid;
+    width: 6em;
+}
+.test {
+    color: blue;
+}
+.ref {
+    white-space: pre;
+    color: orange;
+}
+</style>
+
+<p>This test passes if the <strong>blue text wraps</strong> into more that one line, making it <strong>different</strong> from the orange one.
+
+
+<div class=test lang="th">มนุษย์ทั้งปวงเกิดมามีอิสระและเสมอภาคกันในศักดิ์ศรีและสิทธิ</div>
+
+<div class=ref lang="th">มนุษย์ทั้งปวงเกิดมามีอิสระและเสมอภาคกันในศักดิ์ศรีและสิทธิ</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/line-breaking-027.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/line-breaking-027.html
new file mode 100644
index 0000000..de6ee4c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/line-breaking-027.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text Test: fallback line breaking (Burmese)</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-details">
+<link rel="mismatch" href="reference/line-breaking-027-ref.html">
+<meta name=assert content="In languages requiring lexical or orthographic analysis for line breaking, some form of fallback line breaking must occur even if the UA doesn't know how to perform it correctly. Overflowing is not allowed.">
+<style>
+div {
+    border-right: 5em solid;
+    width: 7em;
+}
+.test {
+    color: blue;
+}
+.ref {
+    white-space: pre;
+    color: orange;
+}
+</style>
+
+<p>This test passes if the <strong>blue text wraps</strong> into more that one line, making it <strong>different</strong> from the orange one.
+
+
+<div class=test lang="my">အပြည်ပြည်ဆိုင်ရာလူ့အခွင့်ရေးကြေညာစာတမ်းကို</div>
+
+<div class=ref lang="my">အပြည်ပြည်ဆိုင်ရာလူ့အခွင့်ရေးကြေညာစာတမ်းကို</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/reference/line-breaking-023-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/reference/line-breaking-023-ref.html
new file mode 100644
index 0000000..ddf4974e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/reference/line-breaking-023-ref.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text Test: fallback line breaking (Javanese)</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<style>
+div {
+    border-right: 6em solid;
+    width: 6em;
+}
+.test {
+    color: blue;
+    white-space: pre;
+}
+.ref {
+    white-space: pre;
+    color: orange;
+}
+</style>
+
+<p>This test passes if the <strong>blue text wraps</strong> into more that one line, making it <strong>different</strong> from the orange one.
+
+
+<div class=test lang="jv-Java">꧋ꦱꦧꦼꦤ꧀ꦲꦸꦩꦠ꧀ꦩꦤꦸꦁꦱꦭꦲꦶꦂꦏꦤ꧀ꦛꦶꦲꦏ꧀ꦲꦏ꧀ꦏꦁꦥꦺꦴꦝꦺꦴꦭꦤ꧀ꦥꦶꦤꦱ꧀ꦛꦶꦭꦤ꧀ꦏꦤ꧀ꦛꦶꦏꦧꦺꦧꦱ꧀ꦱꦤ꧀ꦏꦧꦺꦧꦱ꧀ꦱꦤ꧀ꦲꦶꦁꦧꦏꦸꦤꦶꦁꦲꦁꦒꦼꦂꦲꦁꦒꦼꦂ</div>
+
+<div class=ref lang="jv-Java">꧋ꦱꦧꦼꦤ꧀ꦲꦸꦩꦠ꧀ꦩꦤꦸꦁꦱꦭꦲꦶꦂꦏꦤ꧀ꦛꦶꦲꦏ꧀ꦲꦏ꧀ꦏꦁꦥꦺꦴꦝꦺꦴꦭꦤ꧀ꦥꦶꦤꦱ꧀ꦛꦶꦭꦤ꧀ꦏꦤ꧀ꦛꦶꦏꦧꦺꦧꦱ꧀ꦱꦤ꧀ꦏꦧꦺꦧꦱ꧀ꦱꦤ꧀ꦲꦶꦁꦧꦏꦸꦤꦶꦁꦲꦁꦒꦼꦂꦲꦁꦒꦼꦂ</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/reference/line-breaking-024-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/reference/line-breaking-024-ref.html
new file mode 100644
index 0000000..f96d3e0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/reference/line-breaking-024-ref.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text Test: fallback line breaking (Khmer)</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<style>
+div {
+    border-right: 6em solid;
+    width: 6em;
+}
+.test {
+    white-space: pre;
+    color: blue;
+}
+.ref {
+    white-space: pre;
+    color: orange;
+}
+</style>
+
+<p>This test passes if the <strong>blue text wraps</strong> into more that one line, making it <strong>different</strong> from the orange one.
+
+
+<div class=test lang="km">ការទទួលស្គាល់សេចក្ដីថ្លៃថ្នូរជាប់ពីកំណើត</div>
+
+<div class=ref lang="km">ការទទួលស្គាល់សេចក្ដីថ្លៃថ្នូរជាប់ពីកំណើត</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/reference/line-breaking-025-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/reference/line-breaking-025-ref.html
new file mode 100644
index 0000000..27a0291
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/reference/line-breaking-025-ref.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text Test: fallback line breaking (Lao)</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<style>
+div {
+    border-right: 6em solid;
+    width: 6em;
+}
+.test {
+    white-space: pre;
+    color: blue;
+}
+.ref {
+    white-space: pre;
+    color: orange;
+}
+</style>
+
+<p>This test passes if the <strong>blue text wraps</strong> into more that one line, making it <strong>different</strong> from the orange one.
+
+<div class=test lang="lo">ການຮັບຮູ້ກຽດຕິສັກອັນມີປະຈຳຢູ່ຕົວບຸກຄົນໃນວົງສະກຸນຂອງມະນຸດທຸກໆຄົນ</div>
+
+<div class=ref lang="lo">ການຮັບຮູ້ກຽດຕິສັກອັນມີປະຈຳຢູ່ຕົວບຸກຄົນໃນວົງສະກຸນຂອງມະນຸດທຸກໆຄົນ</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/reference/line-breaking-026-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/reference/line-breaking-026-ref.html
new file mode 100644
index 0000000..7c1656ea
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/reference/line-breaking-026-ref.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text Test: fallback line breaking (Thai)</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<style>
+div {
+    border-right: 6em solid;
+    width: 6em;
+}
+.test {
+    white-space: pre;
+    color: blue;
+}
+.ref {
+    white-space: pre;
+    color: orange;
+}
+</style>
+
+<p>This test passes if the <strong>blue text wraps</strong> into more that one line, making it <strong>different</strong> from the orange one.
+
+
+<div class=test lang="th">มนุษย์ทั้งปวงเกิดมามีอิสระและเสมอภาคกันในศักดิ์ศรีและสิทธิ</div>
+
+<div class=ref lang="th">มนุษย์ทั้งปวงเกิดมามีอิสระและเสมอภาคกันในศักดิ์ศรีและสิทธิ</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/reference/line-breaking-027-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/reference/line-breaking-027-ref.html
new file mode 100644
index 0000000..fad3f46f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/reference/line-breaking-027-ref.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text Test: fallback line breaking (Burmese)</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<style>
+div {
+    border-right: 5em solid;
+    width: 7em;
+}
+.test {
+    white-space: pre;
+    color: blue;
+}
+.ref {
+    white-space: pre;
+    color: orange;
+}
+</style>
+
+<p>This test passes if the <strong>blue text wraps</strong> into more that one line, making it <strong>different</strong> from the orange one.
+
+
+<div class=test lang="my">အပြည်ပြည်ဆိုင်ရာလူ့အခွင့်ရေးကြေညာစာတမ်းကို</div>
+
+<div class=ref lang="my">အပြည်ပြည်ဆိုင်ရာလူ့အခွင့်ရေးကြေညာစာတမ်းကို</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-002.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-002.html.ini
deleted file mode 100644
index 712f0e1b..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-002.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[overflow-wrap-anywhere-inline-002.html]
-  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-002.html b/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-002.tentative.html
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-002.html
rename to third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-002.tentative.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-002.tentative.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-002.tentative.html.ini
new file mode 100644
index 0000000..9703942
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-002.tentative.html.ini
@@ -0,0 +1,2 @@
+[overflow-wrap-anywhere-inline-002.tentative.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-003.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-003.html.ini
deleted file mode 100644
index bde68ab..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-003.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[overflow-wrap-anywhere-inline-003.html]
-  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-003.html b/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-003.tentative.html
similarity index 93%
rename from third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-003.html
rename to third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-003.tentative.html
index 51129490..9ed035f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-003.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-003.tentative.html
@@ -7,7 +7,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-overflow-wrap-anywhere">
 <meta name="flags" content="Ahem">
 <link rel="match" href="reference/overflow-wrap-break-word-001-ref.html">
-<meta name="assert" content="'overflow-wrap: anywhere' allows to break after the first character of the inline-block it applies to">
+<meta name="assert" content="'overflow-wrap: anywhere' allows to break before the first character of the inline-block it applies to">
 <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
 div, span {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-003.tentative.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-003.tentative.html.ini
new file mode 100644
index 0000000..887c19b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-003.tentative.html.ini
@@ -0,0 +1,2 @@
+[overflow-wrap-anywhere-inline-003.tentative.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-004.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-004.html.ini
deleted file mode 100644
index 7b4883f..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-004.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[overflow-wrap-anywhere-inline-004.html]
-  expected:
-    if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-004.html b/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-004.tentative.html
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-004.html
rename to third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-004.tentative.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-004.tentative.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-004.tentative.html.ini
new file mode 100644
index 0000000..ae3e8946
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-004.tentative.html.ini
@@ -0,0 +1,3 @@
+[overflow-wrap-anywhere-inline-004.tentative.html]
+  expected:
+    if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/text-align/text-align-match-parent-05-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text/text-align/text-align-match-parent-05-ref.html
new file mode 100644
index 0000000..de42ee7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/text-align/text-align-match-parent-05-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<meta charset="utf-8">
+<title>CSS Text 3 tests: match parent on text-align-last</title>
+<link rel="author" title="Florian RIvoal" href="https://florian.rivoal.net">
+<style>
+section {
+    font-family: monospace;
+    width: 3ch;
+}
+</style>
+
+<p>Test passes if the two “2” are vertically aligned.
+<section>
+    <div>1 2<br>&nbsp; 2</div>
+</section>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/text-align/text-align-match-parent-05.html b/third_party/blink/web_tests/external/wpt/css/css-text/text-align/text-align-match-parent-05.html
new file mode 100644
index 0000000..390d98a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/text-align/text-align-match-parent-05.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<meta charset="utf-8">
+<title>CSS Text 3 tests: match parent on text-align-last</title>
+<link rel="author" title="Florian RIvoal" href="https://florian.rivoal.net">
+<link rel="help" href="http://www.w3.org/TR/css-text-3/#text-align-property">
+<meta name="assert" content="Check that setting text-align to match parent has the correct effect on text-align-last (even if text-align-all is overridden).">
+<link rel="match" href="text-align-match-parent-05-ref.html">
+<style>
+section {
+    font-family: monospace;
+    width: 3ch;
+}
+div {
+    text-align: match-parent;
+    text-align-all: left;
+}
+</style>
+
+<p>Test passes if the two “2” are vertically aligned.
+<section dir=rtl>
+  <div dir=ltr>1 2 2</div>
+</section>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/text-align/text-align-match-parent-05.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/text-align/text-align-match-parent-05.html.ini
new file mode 100644
index 0000000..5dbe4e3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/text-align/text-align-match-parent-05.html.ini
@@ -0,0 +1,2 @@
+[text-align-match-parent-05.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-004.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-004.html.ini
deleted file mode 100644
index 008c46fd..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-004.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[word-break-break-all-inline-004.html]
-  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-004.html b/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-004.tentative.html
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-004.html
rename to third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-004.tentative.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-004.tentative.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-004.tentative.html.ini
new file mode 100644
index 0000000..4f8a76e9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-004.tentative.html.ini
@@ -0,0 +1,2 @@
+[word-break-break-all-inline-004.tentative.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-007.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-007.html.ini
deleted file mode 100644
index 09ea3391..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-007.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[word-break-break-all-inline-007.html]
-  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-007.html b/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-007.tentative.html
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-007.html
rename to third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-007.tentative.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-007.tentative.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-007.tentative.html.ini
new file mode 100644
index 0000000..0aad3a1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-007.tentative.html.ini
@@ -0,0 +1,2 @@
+[word-break-break-all-inline-007.tentative.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-010.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-010.html.ini
deleted file mode 100644
index e3b2f4c4..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-010.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[word-break-break-all-inline-010.html]
-  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-010.html b/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-010.tentative.html
similarity index 93%
rename from third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-010.html
rename to third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-010.tentative.html
index 3c2df3c..36c9e47 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-010.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-010.tentative.html
@@ -8,7 +8,7 @@
 <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <meta name="flags" content="Ahem">
 <link rel="match" href="reference/word-break-break-all-010-ref.html">
-<meta name="assert" content="'word-break: break-all' allows to break after the first character of the inline-block it applies to">
+<meta name="assert" content="'word-break: break-all' allows to break before the first character of the inline-block it applies to">
 <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
 div, span {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-010.tentative.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-010.tentative.html.ini
new file mode 100644
index 0000000..9637227
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-inline-010.tentative.html.ini
@@ -0,0 +1,2 @@
+[word-break-break-all-inline-010.tentative.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-range-border-inline-end-width-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-range-border-inline-end-width-001.html.ini
new file mode 100644
index 0000000..f3bbc31
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-range-border-inline-end-width-001.html.ini
@@ -0,0 +1,3 @@
+[kind-of-widget-fallback-range-border-inline-end-width-001.html]
+  expected:
+    if (os == "linux") and (product == "content_shell") and (flag_specific == ""): [PASS, CRASH]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/line-break-ch-unit.html.ini b/third_party/blink/web_tests/external/wpt/css/css-values/line-break-ch-unit.html.ini
new file mode 100644
index 0000000..ec39a93
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/line-break-ch-unit.html.ini
@@ -0,0 +1,3 @@
+[line-break-ch-unit.html]
+  expected:
+    if flag_specific == "disable-layout-ng": [OK, CRASH]
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom-view/scroll-behavior-element.html.ini b/third_party/blink/web_tests/external/wpt/css/cssom-view/scroll-behavior-element.html.ini
index e90ab33..26477ab 100644
--- a/third_party/blink/web_tests/external/wpt/css/cssom-view/scroll-behavior-element.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/cssom-view/scroll-behavior-element.html.ini
@@ -1,3 +1,5 @@
 [scroll-behavior-element.html]
+  expected:
+    if flag_specific == "disable-layout-ng": [OK, CRASH]
   [Element with smooth scroll-behavior ; scrollIntoView() with instant behavior]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/has-complexity.html.ini b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/has-complexity.html.ini
index e68b883..abe15aea 100644
--- a/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/has-complexity.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/has-complexity.html.ini
@@ -1,2 +1,4 @@
 [has-complexity.html]
-  expected: TIMEOUT
+  expected:
+    if product == "chrome": OK
+    TIMEOUT
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 0e40cdcf..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,3 +1,3 @@
 [ElementInternals-target-element-is-held-strongly.html]
   expected:
-    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
+    if os == "win": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/dom/nodes/CharacterData-surrogates.html.ini b/third_party/blink/web_tests/external/wpt/dom/nodes/CharacterData-surrogates.html.ini
new file mode 100644
index 0000000..392efab
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/dom/nodes/CharacterData-surrogates.html.ini
@@ -0,0 +1,3 @@
+[CharacterData-surrogates.html]
+  expected:
+    if flag_specific == "disable-layout-ng": [OK, CRASH]
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
new file mode 100644
index 0000000..7158a50
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/dom/ranges/Range-mutations-dataChange.html.ini
@@ -0,0 +1,3 @@
+[Range-mutations-dataChange.html]
+  expected:
+    if flag_specific == "disable-site-isolation-trials": CRASH
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/dom/ranges/Range-mutations-deleteData.html.ini
similarity index 67%
rename from third_party/blink/web_tests/external/wpt/web-locks/query-ordering.tentative.https.html.ini
rename to third_party/blink/web_tests/external/wpt/dom/ranges/Range-mutations-deleteData.html.ini
index b63d722..8a4d2fe 100644
--- a/third_party/blink/web_tests/external/wpt/web-locks/query-ordering.tentative.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/dom/ranges/Range-mutations-deleteData.html.ini
@@ -1,3 +1,3 @@
-[query-ordering.tentative.https.html]
+[Range-mutations-deleteData.html]
   expected:
     if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
diff --git a/third_party/blink/web_tests/external/wpt/dom/ranges/Range-set.html.ini b/third_party/blink/web_tests/external/wpt/dom/ranges/Range-set.html.ini
index af8dc57..1ab4357 100644
--- a/third_party/blink/web_tests/external/wpt/dom/ranges/Range-set.html.ini
+++ b/third_party/blink/web_tests/external/wpt/dom/ranges/Range-set.html.ini
@@ -1,3 +1,3 @@
 [Range-set.html]
   expected:
-    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
diff --git a/third_party/blink/web_tests/external/wpt/editing/run/delete.html.ini b/third_party/blink/web_tests/external/wpt/editing/run/delete.html.ini
index fd05786d..920e030 100644
--- a/third_party/blink/web_tests/external/wpt/editing/run/delete.html.ini
+++ b/third_party/blink/web_tests/external/wpt/editing/run/delete.html.ini
@@ -1,6 +1,6 @@
 [delete.html?7001-last]
   expected:
-    if flag_specific == "disable-layout-ng": [OK, CRASH]
+    if flag_specific == "disable-layout-ng": CRASH
   [[["delete",""\]\] "<div style=white-space:pre-line>foo\\n\\n[\]bar</div>" compare innerHTML]
     expected: FAIL
 
@@ -10,14 +10,6 @@
   [[["delete",""\]\] "<div style=white-space:nowrap>foo\\nb[\]</div>" compare innerHTML]
     expected: FAIL
 
-  [[["delete",""\]\] "<div style=white-space:pre-line>foo\\n [\]bar</div>" compare innerHTML]
-    expected:
-      if flag_specific == "disable-layout-ng": FAIL
-
-  [[["delete",""\]\] "<div style=white-space:pre-line>foo \\n[\]bar</div>" compare innerHTML]
-    expected:
-      if flag_specific == "disable-layout-ng": FAIL
-
 
 [delete.html?3001-4000]
   [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=color:blue>foo<p style=color:rgba(0,0,255,1)>[\]bar" queryCommandState("stylewithcss") before]
diff --git a/third_party/blink/web_tests/external/wpt/editing/run/formatblock.html.ini b/third_party/blink/web_tests/external/wpt/editing/run/formatblock.html.ini
index 0f70caf..26b7118 100644
--- a/third_party/blink/web_tests/external/wpt/editing/run/formatblock.html.ini
+++ b/third_party/blink/web_tests/external/wpt/editing/run/formatblock.html.ini
@@ -685,6 +685,8 @@
 
 
 [formatblock.html?3001-4000]
+  expected:
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
   [[["defaultparagraphseparator","div"\],["formatblock","<h5>"\]\] "<p>[foobar\]</p>" queryCommandValue("formatblock") after]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/buffer-before-onload.html.ini b/third_party/blink/web_tests/external/wpt/element-timing/buffer-before-onload.html.ini
index c477624d..ce81da2 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/buffer-before-onload.html.ini
+++ b/third_party/blink/web_tests/external/wpt/element-timing/buffer-before-onload.html.ini
@@ -1,3 +1,3 @@
 [buffer-before-onload.html]
   expected:
-    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
+    if flag_specific == "disable-layout-ng": [OK, CRASH]
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 80e7f26..1def2aa 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,3 @@
 [image-src-change.html]
   expected:
-    if flag_specific == "disable-layout-ng": [OK, TIMEOUT]
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/shift_jis/sjis-encode-form-ms_kanji.html.ini b/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/shift_jis/sjis-encode-form-ms_kanji.html.ini
new file mode 100644
index 0000000..208a24a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/shift_jis/sjis-encode-form-ms_kanji.html.ini
@@ -0,0 +1,17 @@
+[sjis-encode-form-ms_kanji.html?6001-7000]
+
+[sjis-encode-form-ms_kanji.html?3001-4000]
+  expected:
+    if os == "win": [OK, CRASH]
+
+[sjis-encode-form-ms_kanji.html?4001-5000]
+
+[sjis-encode-form-ms_kanji.html?2001-3000]
+
+[sjis-encode-form-ms_kanji.html?5001-6000]
+
+[sjis-encode-form-ms_kanji.html?7001-last]
+
+[sjis-encode-form-ms_kanji.html?1001-2000]
+
+[sjis-encode-form-ms_kanji.html?1-1000]
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
deleted file mode 100644
index ef1c67e4..0000000
--- a/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-korean/euc-kr/euckr-decode-iso-ir-149.html.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-[euckr-decode-iso-ir-149.html?6001-7000]
-
-[euckr-decode-iso-ir-149.html?10001-11000]
-
-[euckr-decode-iso-ir-149.html?11001-12000]
-
-[euckr-decode-iso-ir-149.html?3001-4000]
-
-[euckr-decode-iso-ir-149.html?2001-3000]
-
-[euckr-decode-iso-ir-149.html?12001-13000]
-
-[euckr-decode-iso-ir-149.html?14001-15000]
-
-[euckr-decode-iso-ir-149.html?5001-6000]
-
-[euckr-decode-iso-ir-149.html?17001-last]
-
-[euckr-decode-iso-ir-149.html?13001-14000]
-
-[euckr-decode-iso-ir-149.html?16001-17000]
-
-[euckr-decode-iso-ir-149.html?7001-8000]
-
-[euckr-decode-iso-ir-149.html?15001-16000]
-
-[euckr-decode-iso-ir-149.html?1001-2000]
-
-[euckr-decode-iso-ir-149.html?1-1000]
-
-[euckr-decode-iso-ir-149.html?4001-5000]
-  expected:
-    if flag_specific == "disable-layout-ng": CRASH
-
-[euckr-decode-iso-ir-149.html?8001-9000]
-
-[euckr-decode-iso-ir-149.html?9001-10000]
diff --git a/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-korean/euc-kr/euckr-encode-form-iso-ir-149.html.ini b/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-korean/euc-kr/euckr-encode-form-iso-ir-149.html.ini
new file mode 100644
index 0000000..d3d1854
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-korean/euc-kr/euckr-encode-form-iso-ir-149.html.ini
@@ -0,0 +1,37 @@
+[euckr-encode-form-iso-ir-149.html?5001-6000]
+
+[euckr-encode-form-iso-ir-149.html?15001-16000]
+
+[euckr-encode-form-iso-ir-149.html?14001-15000]
+
+[euckr-encode-form-iso-ir-149.html?7001-8000]
+
+[euckr-encode-form-iso-ir-149.html?2001-3000]
+
+[euckr-encode-form-iso-ir-149.html?1-1000]
+  expected:
+    if os == "win": [OK, CRASH]
+
+[euckr-encode-form-iso-ir-149.html?3001-4000]
+
+[euckr-encode-form-iso-ir-149.html?1001-2000]
+
+[euckr-encode-form-iso-ir-149.html?13001-14000]
+
+[euckr-encode-form-iso-ir-149.html?8001-9000]
+
+[euckr-encode-form-iso-ir-149.html?12001-13000]
+
+[euckr-encode-form-iso-ir-149.html?17001-last]
+
+[euckr-encode-form-iso-ir-149.html?10001-11000]
+
+[euckr-encode-form-iso-ir-149.html?11001-12000]
+
+[euckr-encode-form-iso-ir-149.html?9001-10000]
+
+[euckr-encode-form-iso-ir-149.html?4001-5000]
+
+[euckr-encode-form-iso-ir-149.html?6001-7000]
+
+[euckr-encode-form-iso-ir-149.html?16001-17000]
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 280d1d2..450e960b 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,4 +1,126 @@
 [unsupported-labels.window.html]
   expected:
-    if product == "chrome": [ERROR, TIMEOUT]
+    if product == "chrome": [OK, TIMEOUT]
     TIMEOUT
+  [_autodetect_all is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-vps is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [_autodetect is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [_autodetect_kr is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-devanagari is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-gujarati is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-iscii-as is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-symbol is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-iscii-be is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-iscii-ta is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-korean is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-iscii-te is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-chinesesimp is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-iscii-ma is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-arabic is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-icelandic is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-croatian is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-hebrew is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-dingbats is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-greek is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-romanian is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-turkish is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-centraleurroman is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-ce is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-iscii-de is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-iscii-t is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-gurmukhi is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-japanese is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-vt100 is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-thai is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-iscii-ka is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-ia5-norwegian is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-ia5-swedish is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-chinesetrad is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-farsi is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-iscii-pa is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-tibetan is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-mac-roman-latin1 is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-nextstep is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-iscii-gu is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
+
+  [x-iscii-or is not supported by the Encoding Standard]
+    expected: [PASS, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/cors/cors-cookies.any.js.ini b/third_party/blink/web_tests/external/wpt/fetch/api/cors/cors-cookies.any.js.ini
index 869920dd..2ccb092 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/api/cors/cors-cookies.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/fetch/api/cors/cors-cookies.any.js.ini
@@ -1,15 +1,26 @@
 [cors-cookies.any.html]
   [Include mode: 1 cookie]
     expected:
-      if product == "chrome": [PASS, FAIL]
+      if product == "chrome": FAIL
 
   [Include mode: remote cookies are not sent with local request]
     expected:
+      if product == "chrome": FAIL
+
+  [Include mode: local cookies are not sent with remote request]
+    expected:
+      if product == "chrome": FAIL
+
+
+[cors-cookies.any.worker.html]
+  [Include mode: remote cookies are not sent with local request]
+    expected:
       if product == "chrome": [PASS, FAIL]
 
   [Include mode: local cookies are not sent with remote request]
     expected:
       if product == "chrome": [PASS, FAIL]
 
-
-[cors-cookies.any.worker.html]
+  [Include mode: 1 cookie]
+    expected:
+      if product == "chrome": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/generated/element-input-image.https.sub.html.ini b/third_party/blink/web_tests/external/wpt/fetch/metadata/generated/element-input-image.https.sub.html.ini
index 09e396b..8a66759e 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/generated/element-input-image.https.sub.html.ini
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/generated/element-input-image.https.sub.html.ini
@@ -1,5 +1,5 @@
 [element-input-image.https.sub.html]
   expected:
-    if os == "win": [OK, TIMEOUT]
+    if os == "win": TIMEOUT
   [sec-fetch-site - HTTPS downgrade-upgrade, no attributes]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/generated/element-meta-refresh.https.optional.sub.html.ini b/third_party/blink/web_tests/external/wpt/fetch/metadata/generated/element-meta-refresh.https.optional.sub.html.ini
index 29e1d97..fa73b796 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/generated/element-meta-refresh.https.optional.sub.html.ini
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/generated/element-meta-refresh.https.optional.sub.html.ini
@@ -1,3 +1,4 @@
 [element-meta-refresh.https.optional.sub.html]
   expected:
-    if (flag_specific == "") and (os == "win"): [OK, TIMEOUT]
+    if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [OK, TIMEOUT]
+    if os == "win": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/generated/window-history.https.sub.html.ini b/third_party/blink/web_tests/external/wpt/fetch/metadata/generated/window-history.https.sub.html.ini
index 961d7a60..157b4da 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/generated/window-history.https.sub.html.ini
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/generated/window-history.https.sub.html.ini
@@ -1,3 +1,3 @@
 [window-history.https.sub.html]
   expected:
-    if os == "win": [OK, TIMEOUT]
+    if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [OK, TIMEOUT]
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 d42f9a1..099c12ff 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,12 +1,11 @@
 [service-worker-background-fetch.https.window.html]
   [local to local: success.]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [private to local: success.]
     expected:
-      if (product == "content_shell") and (flag_specific == "") and (os == "linux"): [PASS, FAIL]
+      if (product == "content_shell") and (flag_specific == "disable-layout-ng"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [private to private: success.]
@@ -15,7 +14,7 @@
 
   [public to local: success.]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
+      if (product == "content_shell") and (flag_specific == "") and (os == "linux"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [public to private: success.]
@@ -24,7 +23,7 @@
 
   [public to public: success.]
     expected:
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
 
   [treat-as-public to local: success.]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/fetch/stale-while-revalidate/stale-script.html.ini b/third_party/blink/web_tests/external/wpt/fetch/stale-while-revalidate/stale-script.html.ini
deleted file mode 100644
index fd8a13f..0000000
--- a/third_party/blink/web_tests/external/wpt/fetch/stale-while-revalidate/stale-script.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[stale-script.html]
-  [Cache returns stale resource]
-    expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
-      if (flag_specific == "") and (os == "linux") and (product == "chrome"): [PASS, FAIL]
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-focus-with-different-site-intermediate-frame.html.ini b/third_party/blink/web_tests/external/wpt/focus/iframe-focus-with-different-site-intermediate-frame.html.ini
index 5019503..a4e9ffe 100644
--- a/third_party/blink/web_tests/external/wpt/focus/iframe-focus-with-different-site-intermediate-frame.html.ini
+++ b/third_party/blink/web_tests/external/wpt/focus/iframe-focus-with-different-site-intermediate-frame.html.ini
@@ -1,5 +1,3 @@
 [iframe-focus-with-different-site-intermediate-frame.html]
-  expected:
-    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
   [Check result]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/hr-time/clamped-time-origin-isolated.https.html.ini b/third_party/blink/web_tests/external/wpt/hr-time/clamped-time-origin-isolated.https.html.ini
index 2e88cea..f365b22 100644
--- a/third_party/blink/web_tests/external/wpt/hr-time/clamped-time-origin-isolated.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/hr-time/clamped-time-origin-isolated.https.html.ini
@@ -1,6 +1,3 @@
 [clamped-time-origin-isolated.https.html]
   expected:
-    if (flag_specific == "") and (product == "chrome"): [OK, TIMEOUT]
-  [timeOrigins are clamped.]
-    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/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 c71a104..5ff214215 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
@@ -3,8 +3,6 @@
     if product == "chrome": [OK, ERROR]
 
 [embedding.tentative.https.window.html?13-last]
-  expected:
-    if product == "chrome": [OK, ERROR]
 
 [embedding.tentative.https.window.html?3-4]
   expected:
@@ -27,12 +25,16 @@
 [embedding.tentative.https.window.html?1-1]
 
 [embedding.tentative.https.window.html?6-6]
+  expected:
+    if product == "chrome": [OK, ERROR]
 
 [embedding.tentative.https.window.html?7-7]
   expected:
     if product == "chrome": [OK, ERROR]
 
 [embedding.tentative.https.window.html?10-10]
+  expected:
+    if product == "chrome": [OK, ERROR]
 
 [embedding.tentative.https.window.html?2-2]
 
@@ -43,5 +45,7 @@
 [embedding.tentative.https.window.html?8-8]
 
 [embedding.tentative.https.window.html?3-3]
+  expected:
+    if product == "chrome": [OK, ERROR]
 
 [embedding.tentative.https.window.html?9-9]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin.html.ini
index 56ade698..0de7a3d 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin.html.ini
@@ -1,5 +1,3 @@
 [browsing_context_name_cross_origin.html]
-  expected:
-    if product == "chrome": ERROR
   [Restoring window.name on cross-origin history traversal]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash-twice.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash-twice.html.ini
index dfb3afc2..5827e20 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash-twice.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash-twice.html.ini
@@ -1,4 +1,4 @@
 [before-load-hash-twice.html]
   [when changing hash twice, before load]
     expected:
-      if (product == "content_shell") and (flag_specific == "") and (os == "linux"): [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash.html.ini
index 2fb53e83..02af6ff 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash.html.ini
@@ -1,4 +1,4 @@
 [before-load-hash.html]
   [when changing hash, before load]
     expected:
-      if flag_specific == "disable-site-isolation-trials": FAIL
+      if product == "chrome": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-traversal-cross-document-traversal.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-traversal-cross-document-traversal.html.ini
index be737b4..15c9ca23f 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-traversal-cross-document-traversal.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-traversal-cross-document-traversal.html.ini
@@ -4,4 +4,4 @@
 
   [cross-document traversals in opposite directions: the result is going nowhere]
     expected:
-      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/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 1b9a2f4..7040e50 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,7 +1,6 @@
 [same-document-traversal-cross-document-traversal.html]
   expected:
-    if (flag_specific == "") and (os == "win"): [OK, TIMEOUT]
-    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/browsing-the-web/unloading-documents/004.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/unloading-documents/004.html.ini
index ed34d46..cd2ebe7 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/unloading-documents/004.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/unloading-documents/004.html.ini
@@ -1,5 +1,3 @@
 [004.html]
-  expected:
-    if product == "chrome": ERROR
   [document.open in beforeunload with button]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/unloading-documents/beforeunload-sticky-activation-popup.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/unloading-documents/beforeunload-sticky-activation-popup.html.ini
new file mode 100644
index 0000000..cd4970ad
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/unloading-documents/beforeunload-sticky-activation-popup.html.ini
@@ -0,0 +1,3 @@
+[beforeunload-sticky-activation-popup.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/history/the-history-interface/history_forward_1.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/history/the-history-interface/history_forward_1.html.ini
new file mode 100644
index 0000000..8915243
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/history/the-history-interface/history_forward_1.html.ini
@@ -0,0 +1,3 @@
+[history_forward_1.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
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 74dcce932..6cf1e4a 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,9 +1,10 @@
 [location-protocol-setter-non-broken.html]
   [Set HTTP URL frame location.protocol to data]
-    expected: FAIL
+    expected:
+      if os == "win": PASS
+      FAIL
 
   [Set data URL frame location.protocol to data]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): PASS
-      if flag_specific == "disable-layout-ng": PASS
-      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/cross-origin-objects/cross-origin-objects.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html.ini
index 7f618dd3..87914ec 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html.ini
@@ -1,6 +1,6 @@
 [cross-origin-objects.html]
   expected:
-    if (flag_specific == "") and (product == "chrome"): [OK, TIMEOUT]
+    if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [OK, TIMEOUT]
   [Only certain properties are accessible cross-origin (cross-origin)]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-no-port.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-port.sub.https.html.ini
index 5383b4d..5504eb1 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-no-port.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-port.sub.https.html.ini
@@ -1,10 +1,8 @@
 [parent-yes-child-no-port.sub.https.html]
   [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
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 1524e6e2..4df55d70 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,8 +1,10 @@
 [parent-yes-child-no-subdomain.sub.https.html]
   [setting document.domain must not give sync access]
     expected:
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [parent: originAgentCluster must equal true]
     expected:
-      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/1-iframe/parent-yes-child-yes-port.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-port.sub.https.html.ini
index 2c3782b..1fe7649 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-port.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-port.sub.https.html.ini
@@ -1,5 +1,4 @@
 [parent-yes-child-yes-port.sub.https.html]
   [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
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 e3a89c0f..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,8 +1,10 @@
 [parent-yes-child-yes-same.sub.https.html]
   [parent: originAgentCluster must equal true]
     expected:
-      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 == "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/1-iframe/parent-yes-child-yes-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-yes-subdomain.sub.https.html.ini
index 3f57474..181db94 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-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-yes-subdomain.sub.https.html.ini
@@ -1,5 +1,6 @@
 [parent-yes-child-yes-subdomain.sub.https.html]
+  expected:
+    if flag_specific == "disable-site-isolation-trials": CRASH
   [parent: originAgentCluster must equal true]
     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-no-child1-no-subdomain1-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-no-child1-no-subdomain1-child2-yes-subdomain2.sub.https.html.ini
index 9137709..d350ba9 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-no-child1-no-subdomain1-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-no-child1-no-subdomain1-child2-yes-subdomain2.sub.https.html.ini
@@ -1,22 +1,10 @@
 [parent-no-child1-no-subdomain1-child2-yes-subdomain2.sub.https.html]
   [Parent to child1: setting document.domain must give sync access]
     expected:
-      if (flag_specific == "") and (product == "chrome"): PASS
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
+      if product == "chrome": PASS
       FAIL
 
   [parent: originAgentCluster must equal false]
     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]
-
-  [child2 to child1: 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]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-no-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-no-child1-yes-subdomain-child2-no-subdomain.sub.https.html.ini
index 2a0462e..2ae4867 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-no-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-no-child1-yes-subdomain-child2-no-subdomain.sub.https.html.ini
@@ -1,16 +1,16 @@
 [parent-no-child1-yes-subdomain-child2-no-subdomain.sub.https.html]
   [Parent 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 to child2: 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
 
   [child1: originAgentCluster must equal true]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": 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-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 8bc5dd53..280b292 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,15 +13,12 @@
 
   [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: 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 == "disable-site-isolation-trials": [PASS, 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
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+
+  [parent: originAgentCluster must equal true]
+    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-no-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-no-subdomain-child2-yes-subdomain.sub.https.html.ini
index e77ac91..a21f71a 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-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-yes-subdomain.sub.https.html.ini
@@ -13,8 +13,8 @@
 
   [child2: originAgentCluster must equal false]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": 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-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 cc85d45..92198b4 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,8 +1,26 @@
 [parent-yes-child1-no-subdomain-child2-yes-subdomain2.sub.https.html]
   [Parent to child1: setting document.domain must not give sync access]
     expected:
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [parent: originAgentCluster must equal true]
     expected:
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      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
+
+  [child1 to child2: setting document.domain must not give sync access]
+    expected:
+      if flag_specific == "disable-site-isolation-trials": FAIL
+
+  [child2: originAgentCluster must equal true]
+    expected:
+      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
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-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 fd34c1f97..7542bf6 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,21 +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
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [child1: originAgentCluster must equal true]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [child2: originAgentCluster must equal true]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      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": [PASS, 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": [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-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-yes-subdomain-child2-yes-subdomain2.sub.https.html.ini
deleted file mode 100644
index 3d196f6..0000000
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomain2.sub.https.html.ini
+++ /dev/null
@@ -1,16 +0,0 @@
-[parent-yes-child1-yes-subdomain-child2-yes-subdomain2.sub.https.html]
-  [child1: 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]
-
-  [child2 to child1: 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]
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 e3b0508..cb8c40e 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,8 +1,14 @@
 [parent-yes-child1-yes-subdomain-child2-yes-subdomainport.sub.https.html]
   [parent: originAgentCluster must equal true]
     expected:
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
 
   [child1: originAgentCluster must equal true]
     expected:
+      if (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
       if os == "win": 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/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 41ce1a43..7e0e5a2 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,5 @@
 [document-domain.sub.https.html]
   [Setting document.domain must not change same-originness]
     expected:
-      if flag_specific == "disable-site-isolation-trials": 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 == "disable-site-isolation-trials": FAIL
+      if (product == "content_shell") and (flag_specific == "") and (os == "linux"): FAIL
+      if product == "chrome": 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
index c8a2756..dd33a86 100644
--- 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
@@ -1,4 +1,5 @@
 [removed-iframe.sub.https.html]
   [Removing the iframe does not change originAgentCluster]
     expected:
+      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/getter-special-cases/sandboxed-same-origin-iframe-no.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-no.https.html.ini
index e890d00d..6739f44 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/sandboxed-same-origin-iframe-no.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-no.https.html.ini
@@ -1,6 +1,4 @@
 [sandboxed-same-origin-iframe-no.https.html]
   [originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (product == "chrome"): PASS
-      if flag_specific == "disable-site-isolation-trials": PASS
-      FAIL
+      if (flag_specific == "") and (product == "content_shell"): 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-port.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-port.sub.https.html.ini
index ec2a502..43e1bec 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-port.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-port.sub.https.html.ini
@@ -1,12 +1,15 @@
 [parent-no-1-no-same-2-yes-port.sub.https.html]
   [before parent: originAgentCluster must equal false]
     expected:
-      if os == "win": [PASS, FAIL]
+      if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [PASS, FAIL]
+      if os == "win": FAIL
 
   [before child: originAgentCluster must equal false]
     expected:
-      if os == "win": [PASS, FAIL]
+      if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [PASS, FAIL]
+      if os == "win": FAIL
 
   [after parent: originAgentCluster must equal false]
     expected:
-      if os == "win": [PASS, FAIL]
+      if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [PASS, 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-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 8cdf9fa..9ebe293 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,15 +1,18 @@
 [parent-no-1-no-same-2-yes-subdomain.sub.https.html]
   [before parent: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "win"): FAIL
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): FAIL
+      if (flag_specific == "") and (os == "win"): [PASS, FAIL]
       if flag_specific == "disable-layout-ng": FAIL
 
   [before child: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "win"): FAIL
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): FAIL
+      if (flag_specific == "") and (os == "win"): [PASS, FAIL]
       if flag_specific == "disable-layout-ng": FAIL
 
   [after parent: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "win"): FAIL
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): FAIL
+      if (flag_specific == "") and (os == "win"): [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-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 30dc9ce..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
@@ -13,8 +13,8 @@
 
   [before parent: originAgentCluster must equal false]
     expected:
-      if flag_specific == "disable-layout-ng": FAIL
+      if os == "win": FAIL
 
   [after parent: originAgentCluster must equal false]
     expected:
-      if flag_specific == "disable-layout-ng": 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-no-subdomain-2-yes-subdomain2.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-subdomain2.sub.https.html.ini
index 5d7dbc4..965bd25b 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-subdomain2.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-subdomain2.sub.https.html.ini
@@ -5,14 +5,10 @@
       if flag_specific == "disable-site-isolation-trials": PASS
       FAIL
 
-  [before child: originAgentCluster must equal false]
+  [After: parent to child: setting document.domain must not give sync access]
     expected:
-      if os == "win": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
-  [after parent: originAgentCluster must equal false]
+  [after child: originAgentCluster must equal true]
     expected:
-      if os == "win": [PASS, FAIL]
-
-  [before parent: originAgentCluster must equal false]
-    expected:
-      if os == "win": [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/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 29817d3c..cdecdf4 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
@@ -4,3 +4,19 @@
       if (flag_specific == "") and (product == "chrome"): PASS
       if flag_specific == "disable-site-isolation-trials": PASS
       FAIL
+
+  [after parent: originAgentCluster must equal false]
+    expected:
+      if flag_specific == "disable-layout-ng": FAIL
+
+  [before parent: originAgentCluster must equal false]
+    expected:
+      if flag_specific == "disable-layout-ng": FAIL
+
+  [Before: parent to child: setting document.domain must not give sync access]
+    expected:
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+
+  [before child: originAgentCluster must equal true]
+    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/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
new file mode 100644
index 0000000..44d462e
--- /dev/null
+++ 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
@@ -0,0 +1,16 @@
+[parent-no-1-yes-subdomain-2-no-subdomain.sub.https.html]
+  [before parent: originAgentCluster must equal false]
+    expected:
+      if flag_specific == "disable-layout-ng": FAIL
+
+  [before child: originAgentCluster must equal true]
+    expected:
+      if flag_specific == "disable-layout-ng": FAIL
+
+  [after parent: originAgentCluster must equal false]
+    expected:
+      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-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 e251116..7c6b0a8 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,16 +1,19 @@
 [parent-yes-1-no-same-2-no-subdomain.sub.https.html]
+  [before parent: originAgentCluster must equal true]
+    expected:
+      if (product == "content_shell") and (os == "win"): [PASS, FAIL]
+      if product == "chrome": FAIL
+
+  [After: parent to child: setting document.domain must not give sync access]
+    expected:
+      if product == "chrome": FAIL
+
   [after parent: originAgentCluster must equal true]
     expected:
-      if os == "win": FAIL
+      if (product == "content_shell") and (os == "win"): [PASS, FAIL]
+      if product == "chrome": FAIL
 
   [before child: originAgentCluster must equal true]
     expected:
-      if os == "win": FAIL
-
-  [before parent: originAgentCluster must equal true]
-    expected:
-      if os == "win": FAIL
-
-  [after child: originAgentCluster must equal false]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if (product == "content_shell") and (os == "win"): [PASS, FAIL]
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-port.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-port.sub.https.html.ini
index f7666cc..81caef44d 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-port.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-port.sub.https.html.ini
@@ -1,4 +1,4 @@
 [opener-no-openee-yes-port.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]
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
deleted file mode 100644
index 97daf51a..0000000
--- 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
+++ /dev/null
@@ -1,10 +0,0 @@
-[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-site-isolation-trials": [PASS, FAIL]
-
-  [openee: 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]
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 1368d4e..ae12aa8 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,7 +1,8 @@
 [opener-no-openee-yes-subdomain.sub.https.html]
   [opener: originAgentCluster must equal false]
     expected:
-      if os == "win": [PASS, FAIL]
+      if (flag_specific == "") and (os == "win"): [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
 
   [openee: originAgentCluster must equal true]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-no-same.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-no-same.sub.https.html.ini
index 8b96f964..053a0b7 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-no-same.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-no-same.sub.https.html.ini
@@ -1,10 +1,10 @@
 [opener-yes-openee-no-same.sub.https.html]
   [opener: 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
 
   [openee: 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/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 c3ea49453..89d6e4a 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,5 @@
 
   [openee: originAgentCluster must equal false]
     expected:
-      if flag_specific == "disable-site-isolation-trials": FAIL
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+      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/popups/opener-yes-openee-yes-same.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-yes-same.sub.https.html.ini
deleted file mode 100644
index b6a9865..0000000
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-yes-same.sub.https.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[opener-yes-openee-yes-same.sub.https.html]
-  [opener: originAgentCluster must equal true]
-    expected:
-      if (product == "content_shell") and (flag_specific == "") and (os == "linux"): [PASS, FAIL]
-      if product == "chrome": FAIL
-
-  [openee: originAgentCluster must equal true]
-    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/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 4a9a4e7..42f89ad 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
@@ -1,13 +1,8 @@
 [opener-yes-openee-yes-subdomain.sub.https.html]
   [openee: originAgentCluster must equal true]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
       if flag_specific == "disable-layout-ng": FAIL
 
   [opener: originAgentCluster must equal true]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
-
-  [setting document.domain must not give sync access]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": [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/removing-iframes.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/removing-iframes.sub.https.html.ini
index 830c1b5c..cb65787 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/removing-iframes.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/removing-iframes.sub.https.html.ini
@@ -13,16 +13,20 @@
 
   [Before: setting document.domain must not give sync access]
     expected:
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [parent: originAgentCluster must equal true]
     expected:
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [Parent to child2: setting document.domain must not give sync access]
     expected:
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [Parent to child3: setting document.domain must not give sync access]
     expected:
-      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/relaxing-the-same-origin-restriction/document_domain_access_details.sub.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_access_details.sub.html.ini
index f928d42..29f86924 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_access_details.sub.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_access_details.sub.html.ini
@@ -1,6 +1,4 @@
 [document_domain_access_details.sub.html]
-  expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
   [Access allowed if different-origin but both set document.domain to parent domain.]
     expected:
       if (flag_specific == "") and (product == "chrome"): PASS
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-is-popup-condition.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-is-popup-condition.html.ini
index e8fb2011d..55d79a7f 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-is-popup-condition.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-is-popup-condition.html.ini
@@ -1,9 +1,11 @@
 [open-features-is-popup-condition.html?position]
 
 [open-features-is-popup-condition.html?single-2]
+  expected:
+    if product == "chrome": ERROR
 
 [open-features-is-popup-condition.html?single-1]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": [TIMEOUT, ERROR]
 
 [open-features-is-popup-condition.html?combination]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-non-integer-width.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-non-integer-width.html.ini
new file mode 100644
index 0000000..1e059b0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-non-integer-width.html.ini
@@ -0,0 +1,3 @@
+[open-features-non-integer-width.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-tokenization-screenx-screeny.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-tokenization-screenx-screeny.html.ini
index b009c7a..a77ce927 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-tokenization-screenx-screeny.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-tokenization-screenx-screeny.html.ini
@@ -1,4 +1,6 @@
 [open-features-tokenization-screenx-screeny.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
   ["screeny==142" should set top position of opened window]
     expected:
       if product == "chrome": PASS
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
new file mode 100644
index 0000000..959e13b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/window-open-noopener.html.ini
@@ -0,0 +1,9 @@
+[window-open-noopener.html?_self]
+
+[window-open-noopener.html?indexed]
+  expected:
+    if product == "chrome": ERROR
+
+[window-open-noopener.html?_top]
+
+[window-open-noopener.html?_parent]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/window-open-windowfeatures-values.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/window-open-windowfeatures-values.html.ini
index d9e0e4f..ef909a9 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/window-open-windowfeatures-values.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/window-open-windowfeatures-values.html.ini
@@ -1,3 +1,3 @@
 [window-open-windowfeatures-values.html]
   expected:
-    if product == "chrome": [ERROR, TIMEOUT]
+    if product == "chrome": TIMEOUT
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
new file mode 100644
index 0000000..6231b72d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/windows/browsing-context-names/choose-_blank-002.html.ini
@@ -0,0 +1,3 @@
+[choose-_blank-002.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.animated.poster.html.ini b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.animated.poster.html.ini
new file mode 100644
index 0000000..55cf49a5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.animated.poster.html.ini
@@ -0,0 +1,3 @@
+[2d.drawImage.animated.poster.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 156fb44..04c2b50 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,11 +1,11 @@
 [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 == "") and (os == "linux"): [FAIL, PASS]
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS]
-      if product == "chrome": FAIL
+      if (os == "linux") and (flag_specific == "") and (product == "chrome"): FAIL
+      if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [PASS, FAIL]
 
   [Verify that drawImage uses the size of the frame as the intinsic size of a placeholder canvas.]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+      if (flag_specific == "") and (os == "win"): PASS
+      if flag_specific == "disable-layout-ng": PASS
       FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/credentialless/dedicated-worker.https.window.js.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/credentialless/dedicated-worker.https.window.js.ini
index 47f8c959..e304d0e0 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/credentialless/dedicated-worker.https.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/credentialless/dedicated-worker.https.window.js.ini
@@ -1,5 +1,3 @@
 [dedicated-worker.https.window.html]
-  expected:
-    if product == "chrome": ERROR
   [fetch cross-origin + credentialless worker]
     expected: FAIL
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 1ed2310..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": [OK, 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-navigation.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/reporting-navigation.https.html.ini
index 3031c79..360865ce 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/reporting-navigation.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/reporting-navigation.https.html.ini
@@ -3,6 +3,4 @@
     expected: FAIL
 
   [parent: |header(cross-origin-embedder-policy,require-corp), target: |header(cross-origin-resource-policy,cross-origin)|header(content-security-policy,frame-ancestors 'none'), with empty frame: true]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-failures.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-failures.https.html.ini
index a7b8041..46f1485 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-failures.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-failures.https.html.ini
@@ -1,11 +1,9 @@
 [header-parsing-failures.https.html?9-12]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
 
 [header-parsing-failures.https.html?12-last]
 
 [header-parsing-failures.https.html?5-8]
 
 [header-parsing-failures.https.html?1-4]
-  expected:
-    if product == "chrome": ERROR
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
new file mode 100644
index 0000000..352e7aa
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-non-ascii.https.html.ini
@@ -0,0 +1,3 @@
+[header-parsing-non-ascii.https.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-repeated.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-repeated.https.html.ini
deleted file mode 100644
index 0ff03121..0000000
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-repeated.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[header-parsing-repeated.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-origin.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-origin.https.html.ini
index 6095039..0dbd28d2 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-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-origin-unsafe-allow-outgoing-with-same-origin.https.html.ini
@@ -1,3 +1,3 @@
 [popup-same-origin-unsafe-allow-outgoing-with-same-origin.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/historical/popup-same-site-with-same-site.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html.ini
deleted file mode 100644
index 69a79d9..0000000
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[popup-same-site-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/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-same-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-to-same-origin.https.html.ini
index c6cd6b7..514b6a3 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-to-same-origin.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-to-same-origin.https.html.ini
@@ -7,6 +7,8 @@
     if product == "chrome": ERROR
 
 [iframe-popup-same-origin-to-same-origin.https.html?9-last]
+  expected:
+    if product == "chrome": [ERROR, OK]
 
 [iframe-popup-same-origin-to-same-origin.https.html?7-8]
   expected:
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-unsafe-none-to-unsafe-none.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-unsafe-none-to-unsafe-none.https.html.ini
index 09c7ceb..3deb888f 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-unsafe-none-to-unsafe-none.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-unsafe-none-to-unsafe-none.https.html.ini
@@ -7,11 +7,11 @@
     if product == "chrome": ERROR
 
 [iframe-popup-unsafe-none-to-unsafe-none.https.html?5-6]
-
-[iframe-popup-unsafe-none-to-unsafe-none.https.html?9-last]
   expected:
     if product == "chrome": ERROR
 
+[iframe-popup-unsafe-none-to-unsafe-none.https.html?9-last]
+
 [iframe-popup-unsafe-none-to-unsafe-none.https.html?1-2]
   expected:
     if product == "chrome": ERROR
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 5882879..7ffc85b1 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
@@ -1,29 +1,29 @@
 [javascript-url.https.html?1-2]
+  expected:
+    if product == "chrome": ERROR
 
 [javascript-url.https.html?3-4]
+  expected:
+    if product == "chrome": ERROR
 
 [javascript-url.https.html?11-12]
   expected:
     if product == "chrome": ERROR
 
 [javascript-url.https.html?13-14]
-  expected:
-    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": [OK, ERROR, CRASH]
+    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/popup-meta-http-equiv.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-meta-http-equiv.https.html.ini
new file mode 100644
index 0000000..4dcab80a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-meta-http-equiv.https.html.ini
@@ -0,0 +1,3 @@
+[popup-meta-http-equiv.https.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
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 47017b4..99d5850 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,11 +1,13 @@
 [popup-redirect-cache.https.html?2-3]
 
 [popup-redirect-cache.https.html?0-1]
-
-[popup-redirect-cache.https.html?6-7]
   expected:
     if product == "chrome": [OK, ERROR]
 
+[popup-redirect-cache.https.html?6-7]
+
 [popup-redirect-cache.https.html?4-5]
 
 [popup-redirect-cache.https.html?8-last]
+  expected:
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html.ini
index ddd028e..78395f06 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html.ini
@@ -1,3 +1,3 @@
 [popup-same-origin-allow-popups-with-cross-origin.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/popup-same-origin-allow-popups-with-same-site.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html.ini
deleted file mode 100644
index d64378f..0000000
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[popup-same-origin-allow-popups-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/popup-same-origin-with-same-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html.ini
index 817cd70..f1d91d7 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html.ini
@@ -1,3 +1,3 @@
 [popup-same-origin-with-same-origin.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/popup-with-structured-header.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-with-structured-header.https.html.ini
index b824bdd4..6da6ff1 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-with-structured-header.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-with-structured-header.https.html.ini
@@ -1,3 +1,3 @@
 [popup-with-structured-header.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_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-openee_coop-ro_cross-origin.https.html.ini
index 9857e85d4..c525d52 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_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-openee_coop-ro_cross-origin.https.html.ini
@@ -1,10 +1,3 @@
 [access-from-coop-page-to-openee_coop-ro_cross-origin.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
-  [access-from-coop-page-to-openee, cross-origin]
-    expected:
-      if product == "chrome": FAIL
-
-  [access-from-coop-page-to-openee, cross-origin + redirect]
-    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 f5dc7e3..020e7cc3 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,9 @@
 [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 (os == "linux") and (product == "chrome"): FAIL
+      if product == "chrome": FAIL
 
   [access-from-coop-page-to-opener, cross-origin]
     expected:
-      if (os == "linux") and (product == "chrome"): FAIL
+      if (product == "content_shell") and (os == "win"): [PASS, FAIL]
+      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.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.https.html.ini
index bf827e7..eeab671e 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.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.https.html.ini
@@ -1,10 +1,10 @@
 [access-to-coop-page-from-openee_coop-ro.https.html]
   expected:
     if product == "chrome": [OK, ERROR]
-  [access-to-coop-page-from-openee, same-origin + redirect]
+  [access-to-coop-page-from-openee, same-origin]
     expected:
       if product == "chrome": FAIL
 
-  [access-to-coop-page-from-openee, same-origin]
+  [access-to-coop-page-from-openee, same-origin + redirect]
     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-opener_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-opener_coop-ro.https.html.ini
index 126bb78..11bfb9c 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-opener_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-opener_coop-ro.https.html.ini
@@ -1,3 +1,10 @@
 [access-to-coop-page-from-opener_coop-ro.https.html]
   expected:
-    if product == "chrome": ERROR
+    if product == "chrome": [OK, ERROR]
+  [access-to-coop-page-from-opener, same-origin + redirect]
+    expected:
+      if product == "chrome": FAIL
+
+  [access-to-coop-page-from-opener, same-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-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-to-coop-page-from-opener_coop-ro_cross-origin.https.html.ini
index 851d459..098e5d0 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-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-to-coop-page-from-opener_coop-ro_cross-origin.https.html.ini
@@ -1,4 +1,6 @@
 [access-to-coop-page-from-opener_coop-ro_cross-origin.https.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
   [access-to-coop-page-from-opener, cross-origin + redirect]
     expected:
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-blur.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-blur.https.html.ini
index e53b282f9..f9427b9 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-blur.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-blur.https.html.ini
@@ -1,4 +1,6 @@
 [property-blur.https.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
   [same-origin > w => w.blur()]
     expected:
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-frames.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-frames.https.html.ini
index 01f4fcd..fe1896e 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-frames.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-frames.https.html.ini
@@ -1,3 +1,4 @@
 [property-frames.https.html]
   expected:
+    if (product == "content_shell") and (os == "win"): [OK, TIMEOUT]
     if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-length.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-length.https.html.ini
index c054f77..3435757a 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-length.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-length.https.html.ini
@@ -1,8 +1,3 @@
 [property-length.https.html]
-  [cross-origin > w => w.length]
-    expected:
-      if product == "chrome": FAIL
-
-  [same-origin > w => w.length]
-    expected:
-      if product == "chrome": FAIL
+  expected:
+    if product == "chrome": ERROR
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 e016cf9..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,3 +1,10 @@
 [property-location-set.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-named-getter.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-named-getter.https.html.ini
deleted file mode 100644
index d654a715..0000000
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-named-getter.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[property-named-getter.https.html]
-  expected:
-    if product == "chrome": [OK, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-opener-set.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-opener-set.https.html.ini
deleted file mode 100644
index 5111ef2..0000000
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-opener-set.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[property-opener-set.https.html]
-  expected:
-    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-top.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-top.https.html.ini
index e3a7586a..c79fa35 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-top.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-top.https.html.ini
@@ -1,3 +1,10 @@
 [property-top.https.html]
   expected:
-    if product == "chrome": ERROR
+    if product == "chrome": [OK, ERROR]
+  [cross-origin > w => w.top]
+    expected:
+      if product == "chrome": FAIL
+
+  [same-origin > w => w.top]
+    expected:
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-window.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-window.https.html.ini
index 6f3f34ce..799db67 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-window.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-window.https.html.ini
@@ -1,6 +1,6 @@
 [property-window.https.html]
   expected:
-    if product == "chrome": [ERROR, OK]
+    if product == "chrome": [OK, ERROR]
   [same-origin > w => w.window]
     expected:
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/report-to-both_coop-ro.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/report-to-both_coop-ro.https.html.ini
index 46d3e245..d4653ba 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/report-to-both_coop-ro.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/report-to-both_coop-ro.https.html.ini
@@ -1,3 +1,10 @@
 [report-to-both_coop-ro.https.html]
   expected:
-    if product == "chrome": ERROR
+    if product == "chrome": [OK, ERROR]
+  [Access from openee]
+    expected:
+      if product == "chrome": FAIL
+
+  [Access from opener]
+    expected:
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/document-reporting/report-only-four-reports.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/document-reporting/report-only-four-reports.https.html.ini
index c7e7616..a8b9622 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/document-reporting/report-only-four-reports.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/document-reporting/report-only-four-reports.https.html.ini
@@ -1,4 +1,6 @@
 [report-only-four-reports.https.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
   [coop document reporting test A test with both COOP and COOP report only setup using Reporting-Endpoints header to CROSS_ORIGIN with same-origin-allow-popups; report-to="coop-popup-report-endpoint", require-corp, same-origin; report-to="coop-popup-report-only-endpoint", require-corp]
     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 46d3e245..d4653ba 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,3 +1,10 @@
 [report-to-both_coop-ro.https.html]
   expected:
-    if product == "chrome": ERROR
+    if product == "chrome": [OK, ERROR]
+  [Access from openee]
+    expected:
+      if product == "chrome": FAIL
+
+  [Access from opener]
+    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 68909ce..c95c9d42 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,4 +1,6 @@
 [reporting-redirect-with-unsafe-none.https.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
   [Same origin openee redirected to same-origin with unsafe-none]
     expected:
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/navigation-reporting/reporting-redirect-with-same-origin-allow-popups.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/navigation-reporting/reporting-redirect-with-same-origin-allow-popups.https.html.ini
index 6f1d038e..8030187 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/navigation-reporting/reporting-redirect-with-same-origin-allow-popups.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/navigation-reporting/reporting-redirect-with-same-origin-allow-popups.https.html.ini
@@ -1,6 +1,4 @@
 [reporting-redirect-with-same-origin-allow-popups.https.html]
-  expected:
-    if product == "chrome": [OK, ERROR]
   [Cross origin openee redirected to same-origin with same-origin-allow-popups]
     expected:
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/resource-popup.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/resource-popup.https.html.ini
index 950ed5a35..f030a18 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/resource-popup.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/resource-popup.https.html.ini
@@ -1,3 +1,3 @@
 [resource-popup.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/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 1764d44..5c47e17f 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
@@ -4,9 +4,11 @@
 
 [iframe-popup-to-so.https.html?5-6]
   expected:
-    if product == "chrome": ERROR
+    if product == "chrome": [OK, ERROR]
 
 [iframe-popup-to-so.https.html?3-4]
+  expected:
+    if product == "chrome": ERROR
 
 [iframe-popup-to-so.https.html?7-8]
   expected:
@@ -14,4 +16,4 @@
 
 [iframe-popup-to-so.https.html?9-last]
   expected:
-    if product == "chrome": ERROR
+    if product == "chrome": [OK, 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 9311679..f8661d5 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
@@ -15,5 +15,3 @@
     if product == "chrome": ERROR
 
 [iframe-popup-to-soap.https.html?9-last]
-  expected:
-    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-un.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.ini
index 9afd7b3f..8fa475c 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.ini
@@ -1,6 +1,4 @@
 [iframe-popup-to-un.https.html?3-4]
-  expected:
-    if product == "chrome": ERROR
   [COOP: restrict-properties to popup COOP: unsafe-none via an iframe, with cross origin iframe, same origin popup with window_open]
     expected: FAIL
 
@@ -19,8 +17,6 @@
 
 
 [iframe-popup-to-un.https.html?9-last]
-  expected:
-    if product == "chrome": [ERROR, OK]
   [COOP: restrict-properties to popup COOP: unsafe-none 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 75e0479..d4cfb80 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,4 +1,6 @@
 [popup-soap.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-u.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-u.https.html.ini
index d559eb64..e594813 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-u.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-u.https.html.ini
@@ -1,6 +1,4 @@
 [popup-u.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 8db4429..245d44f 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,6 +1,4 @@
 [popup-un.https.html]
-  expected:
-    if product == "chrome": [ERROR, OK]
   [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 87ed375..4bbf824 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,3 +1,15 @@
 [document-cookie.html]
   [document.cookie 2]
     expected: FAIL
+
+  [document.cookie 1]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [document has no cookie]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [document.cookie]
+    expected:
+      if product == "chrome": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/script-inserted-script.html.ini b/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/script-inserted-script.html.ini
new file mode 100644
index 0000000..e11044c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/script-inserted-script.html.ini
@@ -0,0 +1,4 @@
+[script-inserted-script.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/rendering/pixel-length-attributes.html.ini b/third_party/blink/web_tests/external/wpt/html/rendering/pixel-length-attributes.html.ini
index 7843cbb4..dcfec0f 100644
--- a/third_party/blink/web_tests/external/wpt/html/rendering/pixel-length-attributes.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/rendering/pixel-length-attributes.html.ini
@@ -1,6 +1,6 @@
 [pixel-length-attributes.html]
   expected:
-    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
+    if flag_specific == "disable-layout-ng": [OK, TIMEOUT]
   [<iframe marginwidth="+-200"> mapping to marginLeft]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embedded-js.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embedded-js.html.ini
index 0f8ef6d..70caf77 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embedded-js.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embedded-js.html.ini
@@ -1,4 +1,6 @@
 [embedded-js.html]
+  expected:
+    if os == "win": [OK, TIMEOUT]
   [Page with <embed type=application/javascript src=/resources/test-only-api.js>]
     expected:
       if product == "chrome": PRECONDITION_FAILED
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-audio-constructor.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-audio-constructor.html.ini
index 0fb6a830..dcd72bec 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-audio-constructor.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-audio-constructor.html.ini
@@ -1,5 +1,5 @@
 [resource-selection-invoke-audio-constructor.html]
   [invoking resource selection with new Audio(src)]
     expected:
-      if flag_specific == "disable-site-isolation-trials": PASS
+      if flag_specific == "disable-site-isolation-trials": [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-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 7af7fef..90dedab 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,5 +1,5 @@
 [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-site-isolation-trials": 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-remove-from-document-networkState.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-remove-from-document-networkState.html.ini
index 4eac01d..c3ac9d72 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-remove-from-document-networkState.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-remove-from-document-networkState.html.ini
@@ -1,5 +1,5 @@
 [resource-selection-invoke-remove-from-document-networkState.html]
   [NOT invoking resource selection with implicit pause() when networkState is not NETWORK_EMPTY]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if product == "chrome": 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-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 c0581652..87b5d61 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,3 +1,5 @@
 [resource-selection-invoke-set-src.html]
   [invoking load by setting src]
-    expected: FAIL
+    expected:
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): PASS
+      FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/readyState_during_playing.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/readyState_during_playing.html.ini
new file mode 100644
index 0000000..8d6295b2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/readyState_during_playing.html.ini
@@ -0,0 +1,3 @@
+[readyState_during_playing.html]
+  expected:
+    if os == "win": [OK, TIMEOUT]
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
deleted file mode 100644
index 1fce059..0000000
--- 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
+++ /dev/null
@@ -1,3 +0,0 @@
-[track-cue-rendering-after-controls-removed.html]
-  expected:
-    if os == "win": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-canvas-element/toBlob-cross-realm-callback-report-exception.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-canvas-element/toBlob-cross-realm-callback-report-exception.html.ini
index 57d599e0..d445bb82 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-canvas-element/toBlob-cross-realm-callback-report-exception.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-canvas-element/toBlob-cross-realm-callback-report-exception.html.ini
@@ -1,4 +1,4 @@
 [toBlob-cross-realm-callback-report-exception.html]
   [toBlob() reports the exception from its callback in the callback's global object]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if (flag_specific == "") and (os == "win"): [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-special-cases.tentative.sub.window.js.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-special-cases.tentative.sub.window.js.ini
index b84cd7f..7d22c448 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-special-cases.tentative.sub.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-special-cases.tentative.sub.window.js.ini
@@ -1,4 +1,5 @@
 [sandbox-top-navigation-child-special-cases.tentative.sub.window.html]
   expected:
-    if (flag_specific == "") and (os == "linux") and (product == "chrome"): ERROR
-    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
+    if (product == "content_shell") and (flag_specific == "") and (os == "win"): [OK, TIMEOUT]
+    if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [OK, TIMEOUT]
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child.tentative.sub.window.js.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child.tentative.sub.window.js.ini
index ce6897a..4d916ea 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child.tentative.sub.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child.tentative.sub.window.js.ini
@@ -1,4 +1,4 @@
 [sandbox-top-navigation-child.tentative.sub.window.html]
   expected:
-    if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [OK, TIMEOUT]
-    if product == "chrome": ERROR
+    if (flag_specific == "") and (product == "chrome"): ERROR
+    if flag_specific == "disable-site-isolation-trials": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-escalate-privileges.tentative.sub.window.js.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-escalate-privileges.tentative.sub.window.js.ini
index 565a419..2ad9ba9 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-escalate-privileges.tentative.sub.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-escalate-privileges.tentative.sub.window.js.ini
@@ -1,5 +1,3 @@
 [sandbox-top-navigation-escalate-privileges.tentative.sub.window.html]
   expected:
-    if (flag_specific == "") and (os == "linux") and (product == "chrome"): ERROR
-    if flag_specific == "disable-layout-ng": [OK, TIMEOUT]
-    if flag_specific == "disable-site-isolation-trials": TIMEOUT
+    if (flag_specific == "") and (product == "chrome"): ERROR
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 f6d097fe..0f880d1 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,3 @@
 [sandbox-top-navigation-grandchild.tentative.sub.window.html]
   expected:
-    if (flag_specific == "") and (product == "chrome"): ERROR
-    if flag_specific == "disable-site-isolation-trials": TIMEOUT
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/available-images.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/available-images.html.ini
index 8ab4fbf..df23c0b 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/available-images.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/available-images.html.ini
@@ -1,3 +1,3 @@
 [available-images.html]
   expected:
-    if flag_specific == "disable-site-isolation-trials": [PASS, TIMEOUT]
+    if flag_specific == "disable-layout-ng": [PASS, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-base-url-2.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-base-url-2.html.ini
index 7db569e5..2e3fbd9 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-base-url-2.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-base-url-2.html.ini
@@ -1,3 +1,5 @@
 [image-loading-lazy-base-url-2.html]
+  expected:
+    if product == "chrome": ERROR
   [When a loading=lazy image is loaded, it loads relative to the document's base URL computed at parse-time.]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-base-url.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-base-url.html.ini
index 5aa4bedf..031fb3b 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-base-url.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-base-url.html.ini
@@ -1,3 +1,5 @@
 [image-loading-lazy-base-url.html]
+  expected:
+    if product == "chrome": ERROR
   [When a loading=lazy image is loaded, it loads relative to the document's base URL computed at parse-time.]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-video-element/resize-during-playback.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-video-element/resize-during-playback.html.ini
index ec7d98f7..ce1e80b1 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-video-element/resize-during-playback.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-video-element/resize-during-playback.html.ini
@@ -4,4 +4,4 @@
 
   [webm video]
     expected:
-      if product == "chrome": [PASS, FAIL]
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-0/multipart-formdata.window.js.ini b/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-0/multipart-formdata.window.js.ini
index 2ba07ce5..ee2b086 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-0/multipart-formdata.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-0/multipart-formdata.window.js.ini
@@ -1,3 +1,3 @@
 [multipart-formdata.window.html]
   expected:
-    if (product == "content_shell") and (flag_specific == "disable-layout-ng"): [OK, TIMEOUT]
+    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-0/urlencoded2.window.js.ini b/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-0/urlencoded2.window.js.ini
index a6aff0f..499050f 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-0/urlencoded2.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-0/urlencoded2.window.js.ini
@@ -1,113 +1,8 @@
 [urlencoded2.window.html]
   expected:
-    if (os == "linux") and (flag_specific == "") and (product == "chrome"): [OK, TIMEOUT]
-    if (os == "linux") and (flag_specific == "disable-layout-ng"): [OK, TIMEOUT]
+    if os == "win": [OK, TIMEOUT]
   [application/x-www-form-urlencoded: \\r\\n in filename (normal form)]
     expected: [PASS, NOTRUN]
 
   [application/x-www-form-urlencoded: \\r in filename (formdata event)]
     expected: [PASS, TIMEOUT]
-
-  [application/x-www-form-urlencoded: backslash in filename (normal form)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: backslash in value (formdata event)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: non-ASCII in name and value (normal form)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: double quote in filename (formdata event)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: character not in encoding in filename (formdata event)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: backslash in name (formdata event)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: single quote in name (normal form)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: backslash in value (normal form)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: non-ASCII in filename (normal form)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: non-ASCII in filename (formdata event)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: single quote in value (normal form)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: character not in encoding in filename (normal form)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: double quote in name (normal form)]
-    expected:
-      if product == "chrome": [PASS, TIMEOUT]
-
-  [application/x-www-form-urlencoded: double quote in name (formdata event)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: characters not in encoding in name and value (normal form)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: single quote in name (formdata event)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: characters not in encoding in name and value (formdata event)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: backslash in name (normal form)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: single quote in filename (formdata event)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: double quote in value (normal form)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: single quote in filename (normal form)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: backslash in filename (formdata event)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: non-ASCII in name and value (formdata event)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: double quote in filename (normal form)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: double quote in value (formdata event)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [application/x-www-form-urlencoded: single quote in value (formdata event)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-target/rel-form-target.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-target/rel-form-target.html.ini
index d3d7ac9..0de06be7 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-target/rel-form-target.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-target/rel-form-target.html.ini
@@ -1,3 +1,3 @@
 [rel-form-target.html]
   expected:
-    if os == "win": [OK, TIMEOUT]
+    if os == "win": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-target/rel-input-target.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-target/rel-input-target.html.ini
new file mode 100644
index 0000000..7e74e3a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-target/rel-input-target.html.ini
@@ -0,0 +1,3 @@
+[rel-input-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 12a4ba6..2ea1f960 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,4 +1,5 @@
 [selectmenu-form-state-restore.tentative.html]
   expected:
-    if (flag_specific == "") and (os == "linux") and (product == "chrome"): ERROR
-    if (flag_specific == "") and (os == "win"): ERROR
+    if (flag_specific == "") and (product == "chrome"): OK
+    if flag_specific == "disable-site-isolation-trials": 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 eb34930..cff26e3 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,8 +1,10 @@
 [activation-behavior.window.html]
   [<area> that is not connected should not be followed]
-    expected: FAIL
+    expected:
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): PASS
+      FAIL
 
   [<a> that is not connected should be followed]
     expected:
-      if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [PASS, FAIL]
-      if (os == "linux") and (flag_specific == "disable-layout-ng"): [PASS, FAIL]
+      if (flag_specific == "") and (product == "content_shell") and (os == "win"): [PASS, FAIL]
+      if (flag_specific == "") and (product == "content_shell") and (os == "linux"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini
index caa321a..2059836 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini
@@ -1,3 +1,3 @@
 [htmlanchorelement_noopener.html]
   expected:
-    if product == "chrome": [OK, ERROR]
+    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 6f363c1..2e5bbac 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,3 +14,6 @@
 
   [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
deleted file mode 100644
index b275aa4..0000000
--- a/third_party/blink/web_tests/external/wpt/infrastructure/server/webtransport-h3.https.sub.any.js.ini
+++ /dev/null
@@ -1,18 +0,0 @@
-[webtransport-h3.https.sub.any.sharedworker.html]
-  [WebTransport server should be running and should handle a bidirectional stream]
-    expected:
-      if os == "win": FAIL
-
-
-[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.serviceworker.html]
-
-[webtransport-h3.https.sub.any.worker.html]
-  [WebTransport server should be running and should handle a bidirectional stream]
-    expected:
-      if os == "win": FAIL
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 3f2847a..4554c60 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,16 +1,15 @@
 [cross-origin-iframe.sub.html]
   [topDocument.scrollingElement.scrollTop = 200]
     expected:
-      if (flag_specific == "") and (os == "win"): [PASS, FAIL]
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
-      FAIL
-
-  [iframeDocument.scrollingElement.scrollTop = 250]
-    expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): FAIL
-      if (flag_specific == "") and (os == "win"): [PASS, FAIL]
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if (flag_specific == "") and (product == "content_shell") and (os == "win"): [PASS, FAIL]
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [topDocument.scrollingElement.scrollTop = 100]
     expected:
+      if (flag_specific == "") and (os == "win"): [FAIL, PASS]
       if flag_specific == "disable-layout-ng": [PASS, FAIL]
+
+  [iframeDocument.scrollingElement.scrollTop = 250]
+    expected:
+      if os == "win": [PASS, 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/intersection-observer/zero-area-element-hidden.html.ini
similarity index 67%
copy from third_party/blink/web_tests/external/wpt/web-locks/query-ordering.tentative.https.html.ini
copy to third_party/blink/web_tests/external/wpt/intersection-observer/zero-area-element-hidden.html.ini
index b63d722..f8b3d01 100644
--- a/third_party/blink/web_tests/external/wpt/web-locks/query-ordering.tentative.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/zero-area-element-hidden.html.ini
@@ -1,3 +1,3 @@
-[query-ordering.tentative.https.html]
+[zero-area-element-hidden.html]
   expected:
     if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
diff --git a/third_party/blink/web_tests/external/wpt/largest-contentful-paint/animated/observe-cross-origin-tao-animated-image.tentative.html.ini b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/animated/observe-cross-origin-tao-animated-image.tentative.html.ini
new file mode 100644
index 0000000..bd26a29
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/animated/observe-cross-origin-tao-animated-image.tentative.html.ini
@@ -0,0 +1,3 @@
+[observe-cross-origin-tao-animated-image.tentative.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 1566fff..08be1a5d7 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,6 +1,6 @@
 [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 == "") and (os == "linux") and (product == "chrome"): PASS
-      if (flag_specific == "") and (os == "win"): PASS
+      if (os == "linux") and (flag_specific == "") and (product == "content_shell"): PASS
+      if os == "win": PASS
       FAIL
diff --git a/third_party/blink/web_tests/external/wpt/largest-contentful-paint/non-tao-image-load-after-fcp.tentative.html.ini b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/non-tao-image-load-after-fcp.tentative.html.ini
new file mode 100644
index 0000000..dd3f62db9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/non-tao-image-load-after-fcp.tentative.html.ini
@@ -0,0 +1,4 @@
+[non-tao-image-load-after-fcp.tentative.html]
+  [Non-Tao Image Load and Render After FCP.]
+    expected:
+      if product == "chrome": [FAIL, PASS]
diff --git a/third_party/blink/web_tests/external/wpt/lifecycle/freeze.html.ini b/third_party/blink/web_tests/external/wpt/lifecycle/freeze.html.ini
index f92b7044..cbfe5c1 100644
--- a/third_party/blink/web_tests/external/wpt/lifecycle/freeze.html.ini
+++ b/third_party/blink/web_tests/external/wpt/lifecycle/freeze.html.ini
@@ -1,4 +1,5 @@
 [freeze.html]
   [Test freeze callback.]
     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/loading/early-hints/arbitrary-header-in-early-hints.h2.window.js.ini b/third_party/blink/web_tests/external/wpt/loading/early-hints/arbitrary-header-in-early-hints.h2.window.js.ini
index c1099dd7..c898b7e 100644
--- a/third_party/blink/web_tests/external/wpt/loading/early-hints/arbitrary-header-in-early-hints.h2.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/loading/early-hints/arbitrary-header-in-early-hints.h2.window.js.ini
@@ -1,4 +1,4 @@
 [arbitrary-header-in-early-hints.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-disallowed.h2.window.js.ini b/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-absent-final-disallowed.h2.window.js.ini
index 54ac630c..61174bf 100644
--- a/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-absent-final-disallowed.h2.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-absent-final-disallowed.h2.window.js.ini
@@ -1,4 +1,4 @@
 [csp-early-hints-absent-final-disallowed.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-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 989e58b..c53530f1 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,4 +1,4 @@
 [csp-early-hints-allowed-final-absent.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-disallowed-final-allowed.h2.window.js.ini b/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-disallowed-final-allowed.h2.window.js.ini
index e935dbe..142c582b 100644
--- a/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-disallowed-final-allowed.h2.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-disallowed-final-allowed.h2.window.js.ini
@@ -1,4 +1,4 @@
 [csp-early-hints-disallowed-final-allowed.h2.window.html]
   expected:
-    if product == "chrome": OK
+    if product == "chrome": [ERROR, OK]
     ERROR
diff --git a/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-disallowed-final-disallowed.h2.window.js.ini b/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-disallowed-final-disallowed.h2.window.js.ini
index 3e11622..2aa08d2c 100644
--- a/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-disallowed-final-disallowed.h2.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/loading/early-hints/csp-early-hints-disallowed-final-disallowed.h2.window.js.ini
@@ -1,4 +1,4 @@
 [csp-early-hints-disallowed-final-disallowed.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/modulepreload-in-early-hints.h2.window.js.ini b/third_party/blink/web_tests/external/wpt/loading/early-hints/modulepreload-in-early-hints.h2.window.js.ini
index 8ec782d..09b074d 100644
--- a/third_party/blink/web_tests/external/wpt/loading/early-hints/modulepreload-in-early-hints.h2.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/loading/early-hints/modulepreload-in-early-hints.h2.window.js.ini
@@ -1,2 +1,4 @@
 [modulepreload-in-early-hints.h2.window.html]
-  expected: ERROR
+  expected:
+    if product == "chrome": OK
+    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 2124955e..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": [OK, ERROR]
+    if product == "chrome": OK
     ERROR
diff --git a/third_party/blink/web_tests/external/wpt/loading/early-hints/redirect-cross-origin-between-early-hints.h2.window.js.ini b/third_party/blink/web_tests/external/wpt/loading/early-hints/redirect-cross-origin-between-early-hints.h2.window.js.ini
index 0ae370b..3a2c386 100644
--- a/third_party/blink/web_tests/external/wpt/loading/early-hints/redirect-cross-origin-between-early-hints.h2.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/loading/early-hints/redirect-cross-origin-between-early-hints.h2.window.js.ini
@@ -1,4 +1,4 @@
 [redirect-cross-origin-between-early-hints.h2.window.html]
   expected:
-    if product == "chrome": [ERROR, OK]
+    if product == "chrome": OK
     ERROR
diff --git a/third_party/blink/web_tests/external/wpt/longtask-timing/longtask-in-sibling-iframe-crossorigin.html.ini b/third_party/blink/web_tests/external/wpt/longtask-timing/longtask-in-sibling-iframe-crossorigin.html.ini
index 29ede04c..b2e386a 100644
--- a/third_party/blink/web_tests/external/wpt/longtask-timing/longtask-in-sibling-iframe-crossorigin.html.ini
+++ b/third_party/blink/web_tests/external/wpt/longtask-timing/longtask-in-sibling-iframe-crossorigin.html.ini
@@ -1,4 +1,5 @@
 [longtask-in-sibling-iframe-crossorigin.html]
   [Performance longtask entries from cross-origin iframe are observable in its sibling.]
     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-layout-ng": FAIL
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 422903cf..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": [FAIL, PASS]
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/operators/operator-dictionary-arabic-002.html.ini b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/operators/operator-dictionary-arabic-002.html.ini
deleted file mode 100644
index f0fa72f4..0000000
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/operators/operator-dictionary-arabic-002.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[operator-dictionary-arabic-002.html]
-  expected:
-    if product == "chrome": 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 e23991a4..123d6b7 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,8 @@
 [mediasource-duration.html]
   expected:
-    if (flag_specific == "") and (os == "linux") and (product == "chrome"): OK
-    if (flag_specific == "") and (os == "win"): OK
-    ERROR
+    if (flag_specific == "") and (product == "chrome"): [OK, ERROR]
+    if flag_specific == "disable-site-isolation-trials": ERROR
+    if flag_specific == "disable-layout-ng": [OK, ERROR]
+  [Test endOfStream completes previous seek to truncated duration]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/media-source/mediasource-endofstream.html.ini b/third_party/blink/web_tests/external/wpt/media-source/mediasource-endofstream.html.ini
index eb2f72d..7f2facc 100644
--- a/third_party/blink/web_tests/external/wpt/media-source/mediasource-endofstream.html.ini
+++ b/third_party/blink/web_tests/external/wpt/media-source/mediasource-endofstream.html.ini
@@ -1,3 +1,10 @@
 [mediasource-endofstream.html]
+  expected:
+    if (flag_specific == "") and (product == "chrome"): [OK, TIMEOUT]
+    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
   [MediaSource.endOfStream(): duration truncated to 0 when there are no buffered coded frames]
     expected: FAIL
+
+  [MediaSource.endOfStream(): media element notified that it now has all of the media data]
+    expected:
+      if product == "chrome": [PASS, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaStreamTrack-getSettings.https.html.ini b/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaStreamTrack-getSettings.https.html.ini
index b7ae868..a2f005ca 100644
--- a/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaStreamTrack-getSettings.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaStreamTrack-getSettings.https.html.ini
@@ -1,3 +1,4 @@
 [MediaStreamTrack-getSettings.https.html]
+  expected: [OK, CRASH]
   [facingMode is reported by getSettings() for getUserMedia() video tracks]
     expected: [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/native-io/detach_iframe_during_open.https.window.js.ini b/third_party/blink/web_tests/external/wpt/native-io/detach_iframe_during_open.https.window.js.ini
deleted file mode 100644
index 428d15b..0000000
--- a/third_party/blink/web_tests/external/wpt/native-io/detach_iframe_during_open.https.window.js.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[detach_iframe_during_open.https.window.html]
-  expected:
-    if (os == "linux") and (flag_specific == "") and (product == "content_shell"): CRASH
-    if os == "win": TIMEOUT
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..4aa58b5 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-site-isolation-trials": [OK, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/scroll-behavior/after-transition-intercept-handler-modifies.html.ini b/third_party/blink/web_tests/external/wpt/navigation-api/scroll-behavior/after-transition-intercept-handler-modifies.html.ini
index 9d0f5ff4..b7b9b42 100644
--- a/third_party/blink/web_tests/external/wpt/navigation-api/scroll-behavior/after-transition-intercept-handler-modifies.html.ini
+++ b/third_party/blink/web_tests/external/wpt/navigation-api/scroll-behavior/after-transition-intercept-handler-modifies.html.ini
@@ -1,5 +1,4 @@
 [after-transition-intercept-handler-modifies.html]
   [scroll: state should be saved before intercept handlers run]
     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/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..3052bb3 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,5 @@
 [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]
+      if flag_specific == "disable-site-isolation-trials": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/paint-timing/fcp-only/fcp-invisible-scale-transition.html.ini b/third_party/blink/web_tests/external/wpt/paint-timing/fcp-only/fcp-invisible-scale-transition.html.ini
index 72799d7..1b20a79 100644
--- a/third_party/blink/web_tests/external/wpt/paint-timing/fcp-only/fcp-invisible-scale-transition.html.ini
+++ b/third_party/blink/web_tests/external/wpt/paint-timing/fcp-only/fcp-invisible-scale-transition.html.ini
@@ -1,3 +1,5 @@
 [fcp-invisible-scale-transition.html]
   [First contentful paint fires when revealed during transition.]
-    expected: FAIL
+    expected:
+      if 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 fb4467f..2b9693a3 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,14 +1,3 @@
 [pending_beacon-sendondiscard.tentative.https.window.html]
   expected:
     if product == "chrome": ERROR
-  [A discarded document does not send an already sent beacon.]
-    expected:
-      if (flag_specific == "") and (os == "win"): FAIL
-      if flag_specific == "disable-layout-ng": [FAIL, PASS]
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
-
-  [A discarded document sends all its beacons of which backgroundTimeouts are\n    not default.]
-    expected:
-      if (flag_specific == "") and (os == "win"): PASS
-      if (flag_specific == "") and (os == "linux"): FAIL
-      [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/pending-beacon/pending_get_beacon-cors.tentative.https.window.js.ini b/third_party/blink/web_tests/external/wpt/pending-beacon/pending_get_beacon-cors.tentative.https.window.js.ini
deleted file mode 100644
index 5c1d3827..0000000
--- a/third_party/blink/web_tests/external/wpt/pending-beacon/pending_get_beacon-cors.tentative.https.window.js.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[pending_get_beacon-cors.tentative.https.window.html]
-  [PendingGetBeacon: same-origin]
-    expected:
-      if product == "chrome": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/pending-beacon/pending_get_beacon-send.tentative.https.window.js.ini b/third_party/blink/web_tests/external/wpt/pending-beacon/pending_get_beacon-send.tentative.https.window.js.ini
new file mode 100644
index 0000000..1b93fe1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/pending-beacon/pending_get_beacon-send.tentative.https.window.js.ini
@@ -0,0 +1,8 @@
+[pending_get_beacon-send.tentative.https.window.html]
+  [PendingGetBeacon is sent to the updated URL]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
+  [PendingGetBeacon is sent to the last updated URL]
+    expected:
+      if product == "chrome": [PASS, 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
new file mode 100644
index 0000000..bec5019
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/pending-beacon/pending_post_beacon-cors.tentative.https.window.js.ini
@@ -0,0 +1,6 @@
+[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]
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
deleted file mode 100644
index ca3117f6..0000000
--- a/third_party/blink/web_tests/external/wpt/pending-beacon/pending_post_beacon-sendwithdata.tentative.https.window.js.ini
+++ /dev/null
@@ -1,72 +0,0 @@
-[pending_post_beacon-sendwithdata.tentative.https.window.html]
-  [PendingPostBeacon(String): Sent empty String, and server got no data.]
-    expected:
-      if product == "chrome": FAIL
-
-  [PendingPostBeacon(ArrayBuffer): Sent empty ArrayBuffer, and server got no data.]
-    expected:
-      if product == "chrome": FAIL
-
-  [PendingPostBeacon(FormData): Sent empty FormData, and server got no data.]
-    expected:
-      if product == "chrome": FAIL
-
-  [PendingPostBeacon(URLSearchParams): Sent empty URLSearchParams, and server got no data.]
-    expected:
-      if product == "chrome": FAIL
-
-  [PendingPostBeacon(Blob): Sent empty Blob, and server got no data.]
-    expected:
-      if product == "chrome": FAIL
-
-  [PendingPostBeacon(File): Sent empty File, and server got no data.]
-    expected:
-      if product == "chrome": FAIL
-
-  [PendingPostBeacon(String): Encoded and sent in POST request.]
-    expected:
-      if product == "chrome": FAIL
-
-  [PendingPostBeacon(ArrayBuffer): Encoded and sent in POST request.]
-    expected:
-      if product == "chrome": FAIL
-
-  [PendingPostBeacon(FormData): Encoded and sent in POST request.]
-    expected:
-      if product == "chrome": FAIL
-
-  [PendingPostBeacon(URLSearchParams): Encoded and sent in POST request.]
-    expected:
-      if product == "chrome": FAIL
-
-  [PendingPostBeacon(Blob): Encoded and sent in POST request.]
-    expected:
-      if product == "chrome": FAIL
-
-  [PendingPostBeacon(File): Encoded and sent in POST request.]
-    expected:
-      if product == "chrome": FAIL
-
-  [PendingPostBeacon(String): Sent out big data.]
-    expected:
-      if product == "chrome": FAIL
-
-  [PendingPostBeacon(ArrayBuffer): Sent out big data.]
-    expected:
-      if product == "chrome": FAIL
-
-  [PendingPostBeacon(FormData): Sent out big data.]
-    expected:
-      if product == "chrome": FAIL
-
-  [PendingPostBeacon(URLSearchParams): Sent out big data.]
-    expected:
-      if product == "chrome": FAIL
-
-  [PendingPostBeacon(Blob): Sent out big data.]
-    expected:
-      if product == "chrome": FAIL
-
-  [PendingPostBeacon(File): Sent out big data.]
-    expected:
-      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/performance-timeline/navigation-id-reset.tentative.html.ini b/third_party/blink/web_tests/external/wpt/performance-timeline/navigation-id-reset.tentative.html.ini
index 5e2d5da..ec4c7246 100644
--- a/third_party/blink/web_tests/external/wpt/performance-timeline/navigation-id-reset.tentative.html.ini
+++ b/third_party/blink/web_tests/external/wpt/performance-timeline/navigation-id-reset.tentative.html.ini
@@ -1,6 +1,6 @@
 [navigation-id-reset.tentative.html]
   expected:
-    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
+    if (flag_specific == "") and (os == "win"): [OK, TIMEOUT]
   [Navigation Id should be reset to 1 after reload.]
     expected:
       if product == "chrome": 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 2f630507..a12a4b0 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,6 +1,6 @@
 [performance-navigation-timing-same-origin-bfcache.tentative.window.html]
   [RemoteContextHelper navigation using BFCache]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): PASS
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
-      FAIL
+      if (flag_specific == "") and (product == "content_shell") and (os == "win"): [PASS, FAIL]
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-layout-ng": 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..6360a03d
--- /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": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/geolocation-report-only.https.html.ini b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/geolocation-report-only.https.html.ini
index 74bda712..eb3d0b7 100644
--- a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/geolocation-report-only.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/geolocation-report-only.https.html.ini
@@ -1,3 +1,7 @@
 [geolocation-report-only.https.html]
+  expected:
+    if product == "chrome": [OK, TIMEOUT]
   [Geolocation report only mode]
-    expected: FAIL
+    expected:
+      if product == "chrome": [FAIL, TIMEOUT]
+      FAIL
diff --git a/third_party/blink/web_tests/external/wpt/requestidlecallback/callback-exception.html.ini b/third_party/blink/web_tests/external/wpt/requestidlecallback/callback-exception.html.ini
new file mode 100644
index 0000000..bac37b0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/requestidlecallback/callback-exception.html.ini
@@ -0,0 +1,3 @@
+[callback-exception.html]
+  expected:
+    if os == "win": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/requestidlecallback/callback-iframe.html.ini b/third_party/blink/web_tests/external/wpt/requestidlecallback/callback-iframe.html.ini
index 2c234a5..516c694 100644
--- a/third_party/blink/web_tests/external/wpt/requestidlecallback/callback-iframe.html.ini
+++ b/third_party/blink/web_tests/external/wpt/requestidlecallback/callback-iframe.html.ini
@@ -1,3 +1,3 @@
 [callback-iframe.html]
   expected:
-    if flag_specific == "disable-layout-ng": [OK, TIMEOUT]
+    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/requestidlecallback/callback-invoked.html.ini b/third_party/blink/web_tests/external/wpt/requestidlecallback/callback-invoked.html.ini
deleted file mode 100644
index 53f024d2..0000000
--- a/third_party/blink/web_tests/external/wpt/requestidlecallback/callback-invoked.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[callback-invoked.html]
-  expected:
-    if (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [OK, TIMEOUT]
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 e3970f54..765815f 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 == "win": [OK, TIMEOUT]
+    if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-timeout-dynamic.html.ini b/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-timeout-dynamic.html.ini
index 3bfcd65..727f92b 100644
--- a/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-timeout-dynamic.html.ini
+++ b/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-timeout-dynamic.html.ini
@@ -1,5 +1,5 @@
 [deadline-max-timeout-dynamic.html]
   expected:
-    if os == "win": [OK, TIMEOUT]
+    if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [OK, TIMEOUT]
   [Check that the deadline is changed if there is a new timeout from within requestIdleCallback.]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/content-type-parsing.html.ini b/third_party/blink/web_tests/external/wpt/resource-timing/content-type-parsing.html.ini
index bfcae10..80eee616 100644
--- a/third_party/blink/web_tests/external/wpt/resource-timing/content-type-parsing.html.ini
+++ b/third_party/blink/web_tests/external/wpt/resource-timing/content-type-parsing.html.ini
@@ -165,8 +165,8 @@
 
   [content-type 2 : text/html,text/plain]
     expected:
-      if os == "win": [PASS, FAIL]
+      if os == "win": FAIL
 
   [content-type 3 : text/plain;charset=gbk,text/html]
     expected:
-      if os == "win": [PASS, FAIL]
+      if os == "win": FAIL
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 3ca68dd..58d4c10 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 cross-site iframe navigations are not observable by the parent, even after history navigations by the parent]
+  [Test that crossorigin iframe navigations are not observable by the parent, even after history navigations by the parent]
     expected:
       if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, 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 5051a99..1d9ea2f 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,3 @@
 [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 os == "win": PASS
-      FAIL
+    expected: 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 3a7934e..54e65d4 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,272 +1,649 @@
 [response-status-code.html]
-  expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): TIMEOUT
-    if flag_specific == "disable-site-isolation-trials": TIMEOUT
-    [OK, TIMEOUT]
-  [This test validates the response status of resources. 256]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 250]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
+  expected: TIMEOUT
   [This test validates the response status of resources. 299]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 251]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
 
   [This test validates the response status of resources. 289]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 241]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
 
   [This test validates the response status of resources. 296]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 235]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 234]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 238]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
 
   [This test validates the response status of resources. 292]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
 
   [This test validates the response status of resources. 291]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 243]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
 
   [This test validates the response status of resources. 297]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
 
   [This test validates the response status of resources. 293]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
 
   [This test validates the response status of resources. 276]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 257]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: [NOTRUN, PASS]
 
   [This test validates the response status of resources. 283]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
 
   [This test validates the response status of resources. 273]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 252]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: [PASS, NOTRUN]
 
   [This test validates the response status of resources. 282]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
 
   [This test validates the response status of resources. 288]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
 
   [This test validates the response status of resources. 290]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 260]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
 
   [This test validates the response status of resources. 271]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: [PASS, NOTRUN]
 
   [This test validates the response status of resources. 275]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 258]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    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. 248]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 266]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
 
   [This test validates the response status of resources. 287]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 244]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
 
   [This test validates the response status of resources. 268]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: [PASS, NOTRUN]
 
   [This test validates the response status of resources. 298]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 259]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 237]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 255]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 264]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
 
   [This test validates the response status of resources. 267]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 240]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 263]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 236]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: [NOTRUN, PASS]
 
   [This test validates the response status of resources. 294]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 247]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
 
   [This test validates the response status of resources. 272]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    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. 239]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 249]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
 
   [This test validates the response status of resources. 285]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
 
   [This test validates the response status of resources. 278]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 265]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: [NOTRUN, PASS]
 
   [This test validates the response status of resources. 274]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: [NOTRUN, TIMEOUT]
 
   [This test validates the response status of resources. 280]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
 
   [This test validates the response status of resources. 295]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
 
   [This test validates the response status of resources. 277]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 254]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 242]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 233]
-    expected:
-      if product == "chrome": [PASS, TIMEOUT]
-
-  [This test validates the response status of resources. 261]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 262]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: [NOTRUN, PASS]
 
   [This test validates the response status of resources. 270]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 253]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: [PASS, NOTRUN]
 
   [This test validates the response status of resources. 279]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: [NOTRUN, TIMEOUT]
 
   [This test validates the response status of resources. 269]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 245]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [This test validates the response status of resources. 246]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: [PASS, NOTRUN]
 
   [This test validates the response status of resources. 284]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
+    expected: NOTRUN
+
+  [This test validates the response status of resources. 125]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 243]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 130]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 116]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 266]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 126]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 215]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 138]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 220]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 221]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 180]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 110]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 173]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 112]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 213]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 262]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 111]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 192]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 174]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 230]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 93]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 85]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 197]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 201]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 103]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 109]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 210]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 95]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 133]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 200]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 228]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 158]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 190]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 240]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 118]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 260]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 227]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 177]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 143]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 127]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 147]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 203]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 171]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 114]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 225]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 209]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 255]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 263]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 251]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 252]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 164]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 239]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 235]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 155]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 119]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 222]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 123]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 176]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 199]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 256]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 156]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 163]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 207]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 193]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 132]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 144]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 257]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 181]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 245]
+    expected: [NOTRUN, PASS, TIMEOUT]
+
+  [This test validates the response status of resources. 205]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 142]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 151]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 159]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 102]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 107]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 149]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 172]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 113]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 194]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 234]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 170]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 161]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 217]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 219]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 91]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 154]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 140]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 175]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 129]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 246]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 231]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 248]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 242]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 153]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 224]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 106]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 90]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 244]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 162]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 128]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 168]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 157]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 99]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 120]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 165]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 136]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 250]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 92]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 122]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 184]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 115]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 145]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 202]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 204]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 206]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 104]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 146]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 241]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 216]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 212]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 198]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 117]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 94]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 101]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 264]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 185]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 211]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 226]
+    expected: [PASS, TIMEOUT, NOTRUN]
+
+  [This test validates the response status of resources. 135]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 141]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 87]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 137]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 189]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 253]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 233]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 214]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 261]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 196]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 89]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 259]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 237]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 124]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 105]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 178]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 258]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 131]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 134]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 166]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 186]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 247]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 97]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 100]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 179]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 182]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 139]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 183]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 167]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 195]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 249]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 265]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 108]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 208]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 238]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 148]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 98]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 88]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 254]
+    expected: [NOTRUN, PASS]
+
+  [This test validates the response status of resources. 160]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 187]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 188]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 223]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 232]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 236]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 152]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 229]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 84]
+    expected: [PASS, TIMEOUT]
+
+  [This test validates the response status of resources. 218]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 150]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 121]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 169]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 86]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 96]
+    expected: [PASS, NOTRUN]
+
+  [This test validates the response status of resources. 191]
+    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 34572225..37c1e59 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
@@ -2,10 +2,6 @@
   [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": FAIL
-
 
 [cache-add.https.any.sharedworker.html]
   [Cache.addAll called with the same Request object specified twice]
@@ -27,4 +23,4 @@
 
   [Cache.addAll should succeed when entries differ by vary header]
     expected:
-      if product == "chrome": [PASS, FAIL]
+      if product == "chrome": 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
deleted file mode 100644
index 25e308c6b..0000000
--- a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/client-navigate.https.html.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[client-navigate.https.html]
-  [Frame location should not be accessible after redirect]
-    expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
-
-  [Frame location should not be accessible after cross-origin navigation]
-    expected:
-      if flag_specific == "disable-layout-ng": [FAIL, PASS]
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/getregistrations.https.html.ini b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/getregistrations.https.html.ini
index 3eb206f..112c741 100644
--- a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/getregistrations.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/getregistrations.https.html.ini
@@ -1,12 +1,12 @@
 [getregistrations.https.html]
   [Register then Unregister then getRegistrations]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [Register then Unregister with controlled frame then getRegistrations]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [getRegistrations promise resolves only with same origin registrations.]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": 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 5f5d44e..4507f10 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,8 +1,4 @@
 [unregister-immediately-during-extendable-events.https.html]
-  expected:
-    if flag_specific == "disable-site-isolation-trials": OK
-    TIMEOUT
+  expected: TIMEOUT
   [Clear-Site-Data must fail pending subresource fetch events.]
-    expected:
-      if product == "chrome": TIMEOUT
-      FAIL
+    expected: 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 2ee7179..a85027a5 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,3 +1,3 @@
 [csp-script-src-self.html]
   expected:
-    if os == "win": [OK, ERROR]
+    if os == "win": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/iframe-added-post-activation.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/iframe-added-post-activation.html.ini
index 4c72df7..6b9bf4fd 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/iframe-added-post-activation.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/iframe-added-post-activation.html.ini
@@ -1,6 +1,5 @@
 [iframe-added-post-activation.html]
   expected:
-    if (product == "content_shell") and (os == "win"): [OK, ERROR]
     if product == "chrome": TIMEOUT
   [iframe added after activation has false document.prerendering]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/indexeddb.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/indexeddb.html.ini
index 3dd4ff1..d339397 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/indexeddb.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/indexeddb.html.ini
@@ -1,7 +1,7 @@
 [indexeddb.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 page should be able to access Indexed DataBase]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/media-autoplay.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/media-autoplay.html.ini
index dcad099..dbcd037 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/media-autoplay.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/media-autoplay.html.ini
@@ -3,8 +3,7 @@
   disabled:
     if os == "mac": was skipped in 'TestExpectations'
   expected:
-    if (os == "linux") and (product == "chrome"): TIMEOUT
-    if os == "win": TIMEOUT
+    if product == "chrome": TIMEOUT
   [media autoplay should defer playaback]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/navigator-plugins.tentative.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/navigator-plugins.tentative.html.ini
index 6d40224..a9fa26cb 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/navigator-plugins.tentative.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/navigator-plugins.tentative.html.ini
@@ -1,5 +1,6 @@
 [navigator-plugins.tentative.html]
   expected:
+    if (product == "content_shell") and (os == "win"): [OK, TIMEOUT]
     if product == "chrome": TIMEOUT
   [prerendering page should be able to access the navigator.plugins]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/referrer-policy-from-rules.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/referrer-policy-from-rules.html.ini
index c96a9be..9df55d5d 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/referrer-policy-from-rules.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/referrer-policy-from-rules.html.ini
@@ -1,6 +1,6 @@
 [referrer-policy-from-rules.html?2-last]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
 
 [referrer-policy-from-rules.html?1-1]
   expected: 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
index 040882e..66670c7 100644
--- 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
@@ -5,9 +5,9 @@
 [response-code-non-successful.html?code=402]
 
 [response-code-non-successful.html?code=205]
-  expected:
-    if product == "chrome": [OK, ERROR]
 
 [response-code-non-successful.html?code=204]
+  expected:
+    if product == "chrome": [OK, ERROR]
 
 [response-code-non-successful.html?code=500]
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 4a3d841..5e8e3e4b 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,10 +1,14 @@
 [response-code-successful.html?code=203]
+  expected:
+    if product == "chrome": [OK, ERROR]
   [Responses with code 203 should be activated]
     expected:
       if product == "chrome": FAIL
 
 
 [response-code-successful.html?code=200]
+  expected:
+    if product == "chrome": [OK, ERROR]
   [Responses with code 200 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 4c890c0c2..9362fa3 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,6 +1,5 @@
 [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 a6597b5..ba53aa9 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,5 +1,6 @@
 [restriction-encrypted-media-unsupported-config.https.html]
   expected:
+    if (product == "content_shell") and (os == "win"): [OK, 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:
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-local-file-system-access.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-local-file-system-access.https.html.ini
index c84576d..ab826f5 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-local-file-system-access.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-local-file-system-access.https.html.ini
@@ -1,8 +1,7 @@
 [restriction-local-file-system-access.https.html]
   expected:
-    if (flag_specific == "") and (product == "content_shell") and (os == "win"): [OK, TIMEOUT]
-    if (flag_specific == "") and (product == "content_shell") and (os == "linux"): [OK, TIMEOUT]
-    if (flag_specific == "") and (product == "chrome"): TIMEOUT
+    if (flag_specific == "") and (os == "linux") and (product == "chrome"): TIMEOUT
+    if (flag_specific == "") and (os == "win"): TIMEOUT
   [prerendering pages should not be able to access the local file system via the File System Access API]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-media-camera.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-media-camera.https.html.ini
index 5910236..f2b8f0c 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-media-camera.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-media-camera.https.html.ini
@@ -1,5 +1,6 @@
 [restriction-media-camera.https.html]
   expected:
+    if (product == "content_shell") and (os == "win"): [OK, ERROR]
     if product == "chrome": TIMEOUT
   [the access to the camera of the user media 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-message-boxes.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-message-boxes.html.ini
index 8bd9788..aeb2a55 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,6 +1,5 @@
 [restriction-message-boxes.html]
   expected:
-    if (product == "content_shell") and (os == "win"): [OK, ERROR]
     if product == "chrome": TIMEOUT
   [alert() does not display the modal and returns immediately]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-prompt-by-before-unload.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-prompt-by-before-unload.html.ini
index 9071c15b..465f205d3 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-prompt-by-before-unload.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-prompt-by-before-unload.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, TIMEOUT]
     if product == "chrome": TIMEOUT
   [Prerendering cannot invoke the prompt by the beforeunload event.]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-request-picture-in-picture.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-request-picture-in-picture.html.ini
index 32004d9..9bfa95ff 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-request-picture-in-picture.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-request-picture-in-picture.html.ini
@@ -1,6 +1,5 @@
 [restriction-request-picture-in-picture.html]
   expected:
-    if (product == "content_shell") and (os == "win"): [OK, TIMEOUT]
     if product == "chrome": TIMEOUT
   [prerendering page cannot invokeHTMLVideoElement.requestPictureInPicture]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-screen-capture.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-screen-capture.https.html.ini
index eae5030b..d5fb1f0 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-screen-capture.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-screen-capture.https.html.ini
@@ -1,6 +1,5 @@
 [restriction-screen-capture.https.html]
   expected:
-    if (product == "content_shell") and (os == "win"): [OK, ERROR]
     if product == "chrome": TIMEOUT
   [The access to the Screen Capture 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-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 fb6c6b0..f0afa05 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,5 +1,6 @@
 [restriction-service-worker-update.https.html]
   expected:
+    if (product == "content_shell") and (os == "win"): [OK, ERROR]
     if product == "chrome": TIMEOUT
   [ServiceWorkerRegistration.update() should be deferred in a prerendered page]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-speech-synthesis.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-speech-synthesis.html.ini
index c8b329d..ad1ad4c 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-speech-synthesis.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-speech-synthesis.html.ini
@@ -1,7 +1,6 @@
 [restriction-speech-synthesis.html]
   expected:
-    if (os == "linux") and (product == "chrome"): TIMEOUT
-    if os == "win": ERROR
+    if product == "chrome": TIMEOUT
   [speechSynthesis.speak(utterance) 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-nfc.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-nfc.https.html.ini
index 7b6623c..2a03aca 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-nfc.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-nfc.https.html.ini
@@ -1,7 +1,6 @@
 [restriction-web-nfc.https.html]
   expected:
-    if (os == "linux") and (product == "chrome"): TIMEOUT
-    if os == "win": ERROR
+    if product == "chrome": TIMEOUT
   [The access to the Web NFC API should be deferred until the prerendered\n    page is activated]
     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 ea71fd8..6942089 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,5 +1,6 @@
 [restriction-web-xr-inline-session.https.html]
   expected:
+    if (product == "content_shell") and (os == "win"): [OK, ERROR]
     if product == "chrome": TIMEOUT
   [The access to the WebXR inline session 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-window-open.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-window-open.html.ini
index 4be1f7a..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 (product == "content_shell") and (os == "win"): [OK, ERROR]
-    if product == "chrome": TIMEOUT
+    if (os == "linux") and (product == "chrome"): TIMEOUT
+    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/session-history-navigation.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/session-history-navigation.https.html.ini
index 415a3a1..e918764 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,5 +1,6 @@
 [session-history-navigation.https.html]
   expected:
+    if (product == "content_shell") and (os == "win"): [OK, TIMEOUT]
     if product == "chrome": TIMEOUT
   [Synthetic anchor click navigates independently with replacement in a prerender]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/state-and-event.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/state-and-event.html.ini
index 1024f52..aa4211fe 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/state-and-event.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/state-and-event.html.ini
@@ -1,6 +1,5 @@
 [state-and-event.html]
   expected:
-    if (product == "content_shell") and (os == "win"): [OK, ERROR]
     if product == "chrome": TIMEOUT
   [Test document.prerendering and its change event.]
     expected:
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 39d9146..1ea18b66 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
@@ -1,7 +1,6 @@
 [windowclient-navigate.https.html]
   expected:
-    if (os == "linux") and (product == "chrome"): TIMEOUT
+    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/speculation-rules/prerender/workers.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/workers.html.ini
index a986d42..bea4222 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/workers.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/workers.html.ini
@@ -1,7 +1,6 @@
 [workers.html]
   expected:
-    if (os == "linux") and (product == "chrome"): TIMEOUT
-    if os == "win": TIMEOUT
+    if product == "chrome": TIMEOUT
   [Dedicated workers should be loaded in suspended state until activated]
     expected:
       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 d95804a..322ad21 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,4 +1,6 @@
 [partitioned-estimate-usage-details-caches.tentative.https.sub.html]
   expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
-    if flag_specific == "disable-layout-ng": [OK, TIMEOUT]
+    if product == "chrome": [OK, TIMEOUT]
+  [Partitioned estimate() usage details for caches test.]
+    expected:
+      if product == "chrome": [PASS, 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 4dc4860..d60c2c9 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,9 +963,9 @@
 
 [a-element-xhtml.xhtml?include=file]
   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 == "win"): TIMEOUT
+    if flag_specific == "disable-site-isolation-trials": CRASH
+    if flag_specific == "disable-layout-ng": [OK, CRASH]
   [Parsing: <file://example%/> against <about:blank>]
     expected: FAIL
 
@@ -1942,15 +1942,14 @@
 
 [a-element-xhtml.xhtml?include=mailto]
   expected:
-    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): CRASH
+    if (flag_specific == "") and (os == "win"): TIMEOUT
   [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]
-    if (flag_specific == "") and (os == "win"): TIMEOUT
-    if flag_specific == "disable-layout-ng": CRASH
+    if flag_specific == "disable-layout-ng": [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 b89c7d8..a2b12dc 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
@@ -1072,8 +1072,6 @@
 
 
 [a-element.html?include=file]
-  expected:
-    if flag_specific == "highdpi": [OK, CRASH]
   [Parsing: <file://example%/> against <about:blank>]
     expected: FAIL
 
@@ -1322,7 +1320,7 @@
 
 [a-element.html?include=mailto]
   expected:
-    if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [OK, CRASH]
+    if flag_specific == "disable-layout-ng": [OK, CRASH]
   [Parsing: <mailto:/../> against <about:blank>]
     expected: FAIL
 
@@ -2149,6 +2147,7 @@
 
 [a-element.html?include=javascript]
   expected:
-    if os == "win": [OK, TIMEOUT]
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
+    if flag_specific == "highdpi": [OK, CRASH]
   [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 8d725a2a..ac1e11a 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,4 @@
 [failure.html]
-  expected:
-    if (product == "content_shell") and (flag_specific == "disable-layout-ng"): [OK, CRASH]
-    if product == "chrome": TIMEOUT
   [Location's href: file://example:1/ should throw]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/url/idlharness-shadowrealm.window.js.ini b/third_party/blink/web_tests/external/wpt/url/idlharness-shadowrealm.window.js.ini
index 1fb49415..0c7e328 100644
--- a/third_party/blink/web_tests/external/wpt/url/idlharness-shadowrealm.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/url/idlharness-shadowrealm.window.js.ini
@@ -1,4 +1,4 @@
 [idlharness-shadowrealm.window.html]
   expected:
-    if flag_specific == "disable-site-isolation-trials": [ERROR, CRASH]
+    if flag_specific == "disable-site-isolation-trials": CRASH
     ERROR
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
index 36d5702..1091bffa 100644
--- 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
@@ -1,3 +1,3 @@
 [percent-encoding.window.html]
   expected:
-    if flag_specific == "disable-site-isolation-trials": CRASH
+    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
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 bfb782f..f1a9b16 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,6 @@
 [toascii.window.html]
   expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
+    if flag_specific == "disable-site-isolation-trials": [OK, 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 96cdbb9f..d90657a 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
@@ -586,8 +586,7 @@
 
 [url-setters-a-area.window.html?include=file]
   expected:
-    if (flag_specific == "") and (os == "win"): [OK, TIMEOUT]
-    if flag_specific == "disable-site-isolation-trials": CRASH
+    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
   [<a>: Setting <file://localhost/>.protocol = 'http' Can’t switch from file URL with no host]
     expected: FAIL
 
@@ -1152,9 +1151,6 @@
 
 
 [url-setters-a-area.window.html?include=javascript]
-  expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
-    if flag_specific == "disable-layout-ng": [OK, CRASH]
   [<a>: Setting <javascript://x/>.username = 'wario']
     expected: FAIL
 
@@ -1175,6 +1171,9 @@
 
 
 [url-setters-a-area.window.html?include=mailto]
+  expected:
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
+    if flag_specific == "disable-layout-ng": [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/urlsearchparams-get.any.js.ini b/third_party/blink/web_tests/external/wpt/url/urlsearchparams-get.any.js.ini
index 9c74fd4f..e0afce6 100644
--- a/third_party/blink/web_tests/external/wpt/url/urlsearchparams-get.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/url/urlsearchparams-get.any.js.ini
@@ -1,5 +1,5 @@
 [urlsearchparams-get.any.worker.html]
-  expected:
-    if flag_specific == "disable-layout-ng": [OK, CRASH]
 
 [urlsearchparams-get.any.html]
+  expected:
+    if flag_specific == "disable-layout-ng": [OK, CRASH]
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..5874c97 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,5 @@
 
 [urlsearchparams-stringifier.any.html]
   expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
+    if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [OK, CRASH]
+    if os == "win": [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback.html.ini b/third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback.html.ini
deleted file mode 100644
index 5fa8925..0000000
--- a/third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[request-video-frame-callback.html]
-  expected:
-    if product == "chrome": [OK, CRASH]
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/animation-model/combining-effects/applying-interpolated-transform.html.ini b/third_party/blink/web_tests/external/wpt/web-animations/animation-model/combining-effects/applying-interpolated-transform.html.ini
new file mode 100644
index 0000000..97eea3e2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/web-animations/animation-model/combining-effects/applying-interpolated-transform.html.ini
@@ -0,0 +1,3 @@
+[applying-interpolated-transform.html]
+  expected:
+    if os == "win": [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/finished.html.ini b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/finished.html.ini
index 41cae1f..852bf244 100644
--- a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/finished.html.ini
+++ b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/finished.html.ini
@@ -1,4 +1,5 @@
 [finished.html]
   [Test finished promise changes for animation duration changes]
     expected:
+      if (flag_specific == "") and (product == "chrome"): [PASS, FAIL]
       if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/KeyframeEffect/getKeyframes.html.ini b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/KeyframeEffect/getKeyframes.html.ini
new file mode 100644
index 0000000..d644a16
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/KeyframeEffect/getKeyframes.html.ini
@@ -0,0 +1,3 @@
+[getKeyframes.html]
+  expected:
+    if flag_specific == "disable-layout-ng": [OK, CRASH]
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 a8fc04d..675b3f1 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,6 +1,5 @@
 [sibling-iframe-timeline.html]
   [animation tied to another frame's timeline runs properly]
     expected:
-      if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [PASS, FAIL]
-      if (os == "linux") and (flag_specific == "disable-layout-ng"): [FAIL, PASS]
-      if os == "win": FAIL
+      if (flag_specific == "") and (os == "win"): FAIL
+      if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/web-bundle/subresource-loading/reuse-web-bundle-resource.https.tentative.html.ini b/third_party/blink/web_tests/external/wpt/web-bundle/subresource-loading/reuse-web-bundle-resource.https.tentative.html.ini
index 91c2d2d..ffa17e9 100644
--- a/third_party/blink/web_tests/external/wpt/web-bundle/subresource-loading/reuse-web-bundle-resource.https.tentative.html.ini
+++ b/third_party/blink/web_tests/external/wpt/web-bundle/subresource-loading/reuse-web-bundle-resource.https.tentative.html.ini
@@ -1,8 +1,4 @@
 [reuse-web-bundle-resource.https.tentative.html]
-  [Should not reuse webbundle resources if a credentials mode is different (same-origin vs omit)]
-    expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
-
-  [Should not reuse webbundle resources if a credential mode is different (same-origin vs include]
+  ['remove(), then append()' should reuse webbundle resources]
     expected:
       if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/web-locks/bfcache/held.tentative.https.html.ini b/third_party/blink/web_tests/external/wpt/web-locks/bfcache/held.tentative.https.html.ini
new file mode 100644
index 0000000..2e75f6a53
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/web-locks/bfcache/held.tentative.https.html.ini
@@ -0,0 +1,3 @@
+[held.tentative.https.html]
+  expected:
+    if flag_specific == "highdpi": [OK, CRASH]
diff --git a/third_party/blink/web_tests/external/wpt/web-locks/bfcache/sharedworker-multiple.tentative.https.html.ini b/third_party/blink/web_tests/external/wpt/web-locks/bfcache/sharedworker-multiple.tentative.https.html.ini
deleted file mode 100644
index d8bf264..0000000
--- a/third_party/blink/web_tests/external/wpt/web-locks/bfcache/sharedworker-multiple.tentative.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[sharedworker-multiple.tentative.https.html]
-  expected:
-    if os == "win": [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audioworklet-interface/suspended-context-messageport.https.html.ini b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audioworklet-interface/suspended-context-messageport.https.html.ini
index 2a7592e..fc818e51 100644
--- a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audioworklet-interface/suspended-context-messageport.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audioworklet-interface/suspended-context-messageport.https.html.ini
@@ -1,3 +1,5 @@
 [suspended-context-messageport.https.html]
   [realtime suspended]
-    expected: FAIL
+    expected:
+      if flag_specific == "disable-layout-ng": PASS
+      FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html.ini b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html.ini
deleted file mode 100644
index 54e187f..0000000
--- a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[mediaElementAudioSourceToScriptProcessorTest.html]
-  [All data processed correctly]
-    expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): FAIL
-      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
index fd51247..49c2787 100644
--- 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
@@ -1,3 +1,3 @@
 [workers.html]
   expected:
-    if flag_specific == "disable-site-isolation-trials": TIMEOUT
+    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
deleted file mode 100644
index 38e85428..0000000
--- a/third_party/blink/web_tests/external/wpt/webmessaging/message-channels/worker-post-after-close.any.js.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[worker-post-after-close.any.html]
-
-[worker-post-after-close.any.worker.html]
-  expected:
-    if os == "win": [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/webmessaging/postMessage_Date.sub.htm.ini b/third_party/blink/web_tests/external/wpt/webmessaging/postMessage_Date.sub.htm.ini
index dd186255..2ab22ee 100644
--- a/third_party/blink/web_tests/external/wpt/webmessaging/postMessage_Date.sub.htm.ini
+++ b/third_party/blink/web_tests/external/wpt/webmessaging/postMessage_Date.sub.htm.ini
@@ -1,3 +1,3 @@
 [postMessage_Date.sub.htm]
   expected:
-    if os == "win": TIMEOUT
+    if os == "win": [OK, TIMEOUT]
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
new file mode 100644
index 0000000..b35e66e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webmessaging/without-ports/020.html.ini
@@ -0,0 +1,4 @@
+[020.html]
+  [cross-origin test]
+    expected:
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/webmessaging/without-ports/021.html.ini b/third_party/blink/web_tests/external/wpt/webmessaging/without-ports/021.html.ini
deleted file mode 100644
index fd4aad1..0000000
--- a/third_party/blink/web_tests/external/wpt/webmessaging/without-ports/021.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[021.html]
-  [cross-origin test]
-    expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/webxr/getInputPose_handedness.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/getInputPose_handedness.https.html.ini
index d8248cc..7b98d3a5 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/getInputPose_handedness.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/getInputPose_handedness.https.html.ini
@@ -1,4 +1,6 @@
 [getInputPose_handedness.https.html]
+  expected:
+    if flag_specific == "disable-layout-ng": [OK, CRASH]
   [XRInputSources properly communicate their handedness - webgl]
     expected:
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html.ini
index 13ee403..fd22b34a 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html.ini
@@ -2,3 +2,7 @@
   [XRFrame getViewerPose updates on the next frame for non-immersive sessions - webgl]
     expected:
       if product == "chrome": FAIL
+
+  [XRFrame getViewerPose updates on the next frame for non-immersive sessions - webgl2]
+    expected:
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestReferenceSpace_features.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestReferenceSpace_features.https.html.ini
index 05ff8fb..2e02a8c 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestReferenceSpace_features.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestReferenceSpace_features.https.html.ini
@@ -1,10 +1,6 @@
 [xrSession_requestReferenceSpace_features.https.html]
   expected:
-    if product == "chrome": [OK, TIMEOUT]
+    if (product == "content_shell") and (flag_specific == "") and (os == "linux"): [OK, TIMEOUT]
   [Non-immersive session supports viewer space by default - webgl]
     expected:
       if product == "chrome": FAIL
-
-  [Immersive session rejects local-floor space if not requested - webgl2]
-    expected:
-      if product == "chrome": [PASS, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html.ini
index f3f6f18..5011c0d 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html.ini
@@ -3,6 +3,10 @@
     expected:
       if product == "chrome": FAIL
 
+  ['floor-level' XRStationaryReferenceSpace updates properly when the transform changes for non-immersive sessions - webgl2]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
   ['floor-level' XRStationaryReferenceSpace updates properly when the transform changes for non-immersive sessions - webgl]
     expected:
-      if product == "chrome": [FAIL, PASS]
+      if product == "chrome": [PASS, FAIL]
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..282999e 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,3 @@
 [dedicated-worker-from-blob-url.window.html]
   expected:
-    if (flag_specific == "") and (os == "win"): [OK, TIMEOUT]
     if flag_specific == "disable-layout-ng": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/workers/dedicated-worker-in-data-url-context.window.js.ini b/third_party/blink/web_tests/external/wpt/workers/dedicated-worker-in-data-url-context.window.js.ini
index 491bbc07..0521a49 100644
--- a/third_party/blink/web_tests/external/wpt/workers/dedicated-worker-in-data-url-context.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/workers/dedicated-worker-in-data-url-context.window.js.ini
@@ -1,6 +1,6 @@
 [dedicated-worker-in-data-url-context.window.html]
   expected:
-    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
+    if flag_specific == "disable-site-isolation-trials": TIMEOUT
   [Create a dedicated worker in a data url frame]
     expected: FAIL
 
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
index 3a0f10f..fd33d33 100644
--- 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
@@ -1,3 +1,3 @@
 [redirect.html]
   expected:
-    if os == "win": TIMEOUT
+    if os == "win": [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/workers/interfaces/WorkerUtils/importScripts/report-error-same-origin.sub.any.js.ini b/third_party/blink/web_tests/external/wpt/workers/interfaces/WorkerUtils/importScripts/report-error-same-origin.sub.any.js.ini
deleted file mode 100644
index fc2db876..0000000
--- a/third_party/blink/web_tests/external/wpt/workers/interfaces/WorkerUtils/importScripts/report-error-same-origin.sub.any.js.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[report-error-same-origin.sub.any.sharedworker.html]
-
-[report-error-same-origin.sub.any.worker.html]
-  expected:
-    if flag_specific == "disable-site-isolation-trials": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/workers/modules/dedicated-worker-import-meta.html.ini b/third_party/blink/web_tests/external/wpt/workers/modules/dedicated-worker-import-meta.html.ini
index 1457ee30..f19304d 100644
--- a/third_party/blink/web_tests/external/wpt/workers/modules/dedicated-worker-import-meta.html.ini
+++ b/third_party/blink/web_tests/external/wpt/workers/modules/dedicated-worker-import-meta.html.ini
@@ -1,3 +1,5 @@
 [dedicated-worker-import-meta.html]
+  expected:
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
   [Test import.meta.url on the imported module script with a fragment.]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/workers/semantics/reporting-errors/001.html.ini b/third_party/blink/web_tests/external/wpt/workers/semantics/reporting-errors/001.html.ini
deleted file mode 100644
index 6dd41a7..0000000
--- a/third_party/blink/web_tests/external/wpt/workers/semantics/reporting-errors/001.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[001.html]
-  expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/workers/semantics/run-a-worker/003.html.ini b/third_party/blink/web_tests/external/wpt/workers/semantics/run-a-worker/003.html.ini
deleted file mode 100644
index d7839083..0000000
--- a/third_party/blink/web_tests/external/wpt/workers/semantics/run-a-worker/003.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[003.html]
-  expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/workers/shared-worker-from-blob-url.window.js.ini b/third_party/blink/web_tests/external/wpt/workers/shared-worker-from-blob-url.window.js.ini
index c0b9f73d..1b1b538 100644
--- a/third_party/blink/web_tests/external/wpt/workers/shared-worker-from-blob-url.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/workers/shared-worker-from-blob-url.window.js.ini
@@ -1,3 +1,3 @@
 [shared-worker-from-blob-url.window.html]
   expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
+    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
diff --git a/third_party/blink/web_tests/external/wpt/workers/shared-worker-in-data-url-context.window.js.ini b/third_party/blink/web_tests/external/wpt/workers/shared-worker-in-data-url-context.window.js.ini
index e0d2ea3d..5f4813ff 100644
--- a/third_party/blink/web_tests/external/wpt/workers/shared-worker-in-data-url-context.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/workers/shared-worker-in-data-url-context.window.js.ini
@@ -1,4 +1,6 @@
 [shared-worker-in-data-url-context.window.html]
+  expected:
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
   [Create a shared worker in a data url frame]
     expected: FAIL
 
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-space.html.ini b/third_party/blink/web_tests/wpt_internal/forms/file/file-input-webkitdirectory-key-space.html.ini
index 6e4add39..41ad029 100644
--- a/third_party/blink/web_tests/wpt_internal/forms/file/file-input-webkitdirectory-key-space.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/forms/file/file-input-webkitdirectory-key-space.html.ini
@@ -1,6 +1,6 @@
 [file-input-webkitdirectory-key-space.html]
   expected:
-    if flag_specific == "disable-layout-ng": [OK, TIMEOUT]
+    if flag_specific == "disable-layout-ng": TIMEOUT
   [pressing Space on a focused 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/in-order-script-scheduling/selective-in-order/async-script.sub.html.ini b/third_party/blink/web_tests/wpt_internal/in-order-script-scheduling/selective-in-order/async-script.sub.html.ini
index 74e9198..c439e28b 100644
--- a/third_party/blink/web_tests/wpt_internal/in-order-script-scheduling/selective-in-order/async-script.sub.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/in-order-script-scheduling/selective-in-order/async-script.sub.html.ini
@@ -1,4 +1,5 @@
 [async-script.sub.html]
 
 [async-script.sub.html?reload]
-  expected: [OK, ERROR]
+  expected:
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/wpt_internal/storage/quota/partitioned-webkitPersistentStorage-quota-usage-details.tentative.sub.html.ini b/third_party/blink/web_tests/wpt_internal/storage/quota/partitioned-webkitPersistentStorage-quota-usage-details.tentative.sub.html.ini
new file mode 100644
index 0000000..54cbe44
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/storage/quota/partitioned-webkitPersistentStorage-quota-usage-details.tentative.sub.html.ini
@@ -0,0 +1,4 @@
+[partitioned-webkitPersistentStorage-quota-usage-details.tentative.sub.html]
+  [Partitioned webkitPersistentStorage quota and usage details test.]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/wpt_internal/storage/quota/partitioned-webkitStorageInfo-temporary-quota-usage-details.tentative.sub.html.ini b/third_party/blink/web_tests/wpt_internal/storage/quota/partitioned-webkitStorageInfo-temporary-quota-usage-details.tentative.sub.html.ini
new file mode 100644
index 0000000..828a16c
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/storage/quota/partitioned-webkitStorageInfo-temporary-quota-usage-details.tentative.sub.html.ini
@@ -0,0 +1,4 @@
+[partitioned-webkitStorageInfo-temporary-quota-usage-details.tentative.sub.html]
+  [Partitioned webkitStorageInfo temporary quota request and usage details test.]
+    expected:
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, 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..19cf3a6
--- /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": ERROR
diff --git a/third_party/closure_compiler/externs/file_manager_private.js b/third_party/closure_compiler/externs/file_manager_private.js
index a9a118b..e5474051 100644
--- a/third_party/closure_compiler/externs/file_manager_private.js
+++ b/third_party/closure_compiler/externs/file_manager_private.js
@@ -579,6 +579,7 @@
 
 /**
  * @typedef {{
+ *   rootDir: (DirectoryEntry|undefined),
  *   query: string,
  *   types: !chrome.fileManagerPrivate.SearchType,
  *   maxResults: number
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium
index 2956576..f2f0880 100644
--- a/third_party/nearby/README.chromium
+++ b/third_party/nearby/README.chromium
@@ -1,7 +1,7 @@
 Name: Nearby Connections Library
 Short Name: Nearby
 URL: https://github.com/google/nearby
-Version: f772614a464fea9351f61437e71a310b2fa651cb
+Version: 1f2095a9be808cf41af83424c10de0afe4b85446
 License: Apache 2.0
 License File: LICENSE
 Security Critical: yes
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 9b4c3d3b..c2862b0 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -23946,7 +23946,7 @@
   <int value="11" label="Disable download EXTRA_DISABLE_DOWNLOAD_BUTTON"/>
   <int value="12" label="Disable star EXTRA_DISABLE_STAR_BUTTON"/>
   <int value="13" label="Exit animation EXTRA_EXIT_ANIMATION_BUNDLE"/>
-  <int value="14" label="GSA experiment ids EXPERIMENT_IDS"/>
+  <int value="14" label="AGA experiment ids EXPERIMENT_IDS"/>
   <int value="15" label="Incognito EXTRA_OPEN_NEW_INCOGNITO_TAB"/>
   <int value="16" label="Initial height EXTRA_INITIAL_ACTIVITY_HEIGHT_PX"/>
   <int value="17" label="Media EXTRA_ENABLE_EMBEDDED_MEDIA_EXPERIENCE"/>
@@ -23975,6 +23975,7 @@
   <int value="40" label="TWA origins EXTRA_ADDITIONAL_TRUSTED_ORIGINS"/>
   <int value="41" label="Url bar hiding EXTRA_ENABLE_URLBAR_HIDING"/>
   <int value="42" label="Translate specified EXTRA_AUTO_TRANSLATE_LANGUAGE"/>
+  <int value="43" label="Experiment override EXTRA_AGA_EXPERIMENT_ENABLE"/>
 </enum>
 
 <enum name="CustomTabsParallelRequestStatusOnStart">
@@ -35500,6 +35501,8 @@
   <int value="1744" label="AUTOFILLPRIVATE_GETIBANLIST"/>
   <int value="1745" label="ENTERPRISE_PLATFORMKEYS_CHALLENGEKEY"/>
   <int value="1746" label="PDFVIEWERPRIVATE_ISALLOWEDLOCALFILEACCESS"/>
+  <int value="1747" label="DECLARATIVENETREQUEST_UPDATESTATICRULES"/>
+  <int value="1748" label="FILEMANAGERPRIVATEINTERNAL_SEARCHFILES"/>
 </enum>
 
 <enum name="ExtensionIconState">
diff --git a/tools/metrics/histograms/metadata/webapps/histograms.xml b/tools/metrics/histograms/metadata/webapps/histograms.xml
index 752dfc2..ce1515a 100644
--- a/tools/metrics/histograms/metadata/webapps/histograms.xml
+++ b/tools/metrics/histograms/metadata/webapps/histograms.xml
@@ -1078,6 +1078,20 @@
   <summary>Records the result of shortcut creation for PWA.</summary>
 </histogram>
 
+<histogram name="WebApp.Shortcuts.Delete.Result" enum="BooleanSuccess"
+    expires_after="2023-12-16">
+  <owner>dmurph@google.com</owner>
+  <owner>desktop-pwas-team@google.com</owner>
+  <summary>
+    The result of deleting shortcuts for an installed PWA. Shortcuts are usually
+    the icon in the operating system signifying the app or extension as an OS
+    entity (e.g. on Mac, it's the .app file). Deleting shortcuts occurs when an
+    app is uninstalled, which can be triggered by the user uninstalling the app,
+    or by other 'app management' sources uninstalling an app (e.g. organization
+    policy).
+  </summary>
+</histogram>
+
 <histogram name="WebApp.Shortcuts.Update.Result" enum="BooleanSuccess"
     expires_after="2023-12-16">
   <owner>camdenking@google.com</owner>
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index 28a52bd..1c30669 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -409,4 +409,5 @@
  <item id="network_diagnostics_routines" added_in_milestone="110" content_hash_code="0007b237" os_list="chromeos" file_path="chrome/browser/ash/net/network_diagnostics/http_request_manager.cc" />
  <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" />
 </annotations>
diff --git a/tools/traffic_annotation/summary/grouping.xml b/tools/traffic_annotation/summary/grouping.xml
index 99892c3..3d6edca 100644
--- a/tools/traffic_annotation/summary/grouping.xml
+++ b/tools/traffic_annotation/summary/grouping.xml
@@ -276,6 +276,7 @@
       <annotation id="network_diagnostics_routines"/>
       <annotation id="trial_group_lookup"/>
       <annotation id="wallpaper_drivefs_delegate"/>
+      <annotation id="chromeos_emoji_picker_categories_fetcher"/>
     </sender>
   </group>
   <group name="Admin Features" hidden="true">
diff --git a/tools/typescript/definitions/pdf_viewer_private.d.ts b/tools/typescript/definitions/pdf_viewer_private.d.ts
new file mode 100644
index 0000000..4bb1aaa
--- /dev/null
+++ b/tools/typescript/definitions/pdf_viewer_private.d.ts
@@ -0,0 +1,14 @@
+// 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.
+
+/** @fileoverview Definitions for chrome.pdfViewerPrivate API. */
+// TODO(crbug.com/1203307): Auto-generate this file.
+
+declare namespace chrome {
+  export namespace pdfViewerPrivate {
+
+    export function isAllowedLocalFileAccess(
+        url: string, callback: (isAllowed: boolean) => void): void;
+  }
+}