diff --git a/.vpython3 b/.vpython3
index c0c46416..8872e87 100644
--- a/.vpython3
+++ b/.vpython3
@@ -29,9 +29,7 @@
 # allows us to ensure that vpython specs stay mac-arm64-friendly
 verify_pep425_tag: [
     {python: "cp38", abi: "cp38", platform: "manylinux1_x86_64"},
-# TODO(https://crbug.com/1363689): Re-enable once the linux_arm64 versions of
-# these wheels are available.
-#   {python: "cp38", abi: "cp38", platform: "linux_arm64"},
+    {python: "cp38", abi: "cp38", platform: "linux_arm64"},
 
     {python: "cp38", abi: "cp38", platform: "macosx_10_10_intel"},
     {python: "cp38", abi: "cp38", platform: "macosx_11_0_arm64"},
diff --git a/DEPS b/DEPS
index c3a0c05..1564873 100644
--- a/DEPS
+++ b/DEPS
@@ -308,7 +308,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': '5d137e703e9259d539d34e9456408c1fd4ae57eb',
+  'skia_revision': '105debc5df603531791519aa23e5d648ae6f7fed',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -335,7 +335,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:9.20221001.0.1',
+  'fuchsia_version': 'version:9.20221002.2.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.
@@ -387,7 +387,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': 'e558072b02badb1c9e24191fdbd39787a1f5cd87',
+  'devtools_frontend_revision': 'd77df7d3f2e7c3811ed3d716a78c7bd31410c34e',
   # 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.
@@ -423,7 +423,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': 'a1f400b90963e8ab5045b8c607801b88c3cacab6',
+  'dawn_revision': '4ad7f01ff5048d52ad4fd33399b92340466862dc',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -487,7 +487,7 @@
 
   # If you change this, also update the libc++ revision in
   # //buildtools/deps_revisions.gni.
-  'libcxx_revision':       '591c99193d353c17b694d1692db75630082525b9',
+  'libcxx_revision':       '2e919977e0030ce61bd19c40cefe31b995f1e2d4',
 
   # GN CIPD package version.
   'gn_version': 'git_revision:cc28efe62ef0c2fb32455f414a29c4a55bb7fbc4',
@@ -903,7 +903,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/linux-amd64',
-          'version': 'TrOlwyuIGtXoc_JjjGLFM_g-Sg-lCczvJY_CHzFXvYsC',
+          'version': 'aOXbIjhkHtP0v98CZ_-jaGUKoJpjvIODC6Mfwc14JVIC',
         },
       ],
       'dep_type': 'cipd',
@@ -914,7 +914,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/mac-amd64',
-          'version': 'Sw6NweweqwVELlS7DLFKy9l4kgUDWskISicfvRBL3nMC',
+          'version': '9P0pdn6O-sG3fU6ydx6zTzG7t1WwcN0DtRUzoO33ksoC',
         },
       ],
       'dep_type': 'cipd',
@@ -925,7 +925,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/windows-amd64',
-          'version': 'mAPWFbhzrRBqj8yFVkfE6-DuQ2Mec7LVN8k7XovC8q4C',
+          'version': 'BO12YTQLhz7qpvvfjuEeeeDqFfPt-OCfjctEg5nSxsUC',
         },
       ],
       'dep_type': 'cipd',
@@ -1226,7 +1226,7 @@
 
   # For Linux and Chromium OS.
   'src/third_party/cros_system_api': {
-      'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '78ce7dfa03dd90c0b83b48488bb2090808249f20',
+      'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + 'a37ecce4aa23ec39abdbb14e32ac16ede5671613',
       'condition': 'checkout_linux',
   },
 
@@ -1242,7 +1242,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' + '@' + 'f909dfafc1c6d0c5e07fae2db51d48d58dd3f442',
+      'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + 'eca4441df825d0be52d768c22d2b38e204551582',
     'condition': 'checkout_src_internal',
   },
 
@@ -1524,7 +1524,7 @@
     Var('chromium_git') + '/webm/libwebp.git' + '@' +  '7366f7f394af26de814296152c50e673ed0a832f',
 
   'src/third_party/libyuv':
-    Var('chromium_git') + '/libyuv/libyuv.git' + '@' + 'f9fda6e7d819c07a684ba6bc97cbf0e257bbcb37',
+    Var('chromium_git') + '/libyuv/libyuv.git' + '@' + '00950840d1c9bcbb3eb6ebc5aac5793e71166c8b',
 
   'src/third_party/lighttpd': {
       'url': Var('chromium_git') + '/chromium/deps/lighttpd.git' + '@' + Var('lighttpd_revision'),
@@ -1839,7 +1839,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'e84b11b1d90efe59e94bb24d1f1276071f50481e',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'fcc3d9aea48ea64a19dda1067561776a4e4ce1eb',
+    Var('webrtc_git') + '/src.git' + '@' + '84b557c5dbbe9a6af9e125eae7ce0964abc7281a',
 
   # 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.
@@ -1909,7 +1909,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@76d14c0a517fe1024359a52be1b632050fee03ae',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@4feb9f978e4febcb6c9f183ff488b454196a5e9b',
     'condition': 'checkout_src_internal',
   },
 
@@ -1939,7 +1939,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'QqEUH8K2SauoRtFsuobvFCzlXrdFxVjQKjdRxYxskSUC',
+        'version': 'R7ImTQ8zpdnSjE1rRqfsejLS4zCtc0vV5NIX_mVORbEC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -1950,7 +1950,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'T1FNIsmeyrCC1ImZfz-tYKtDdSqj8JXO9dZOcUp1mtIC',
+        'version': 'kQ8_pzixEf98ocfU5ZJaYJ1Ee1f4nQ6GVlyQ1HJnVAIC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -1961,7 +1961,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/projector_app/app',
-        'version': '9XDOup61F7HlzcT7mAOVzKY1Az1hfFrC65S2MMayEYEC',
+        'version': 'EFjOc3n1PBVrF7eD4gK8dYVSTQ5D5_f-JQWng7FqyDMC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 666d60f..fa8f3c2 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -1158,6 +1158,17 @@
         _THIRD_PARTY_EXCEPT_BLINK,
       ],
     ),
+    BanRule(
+      r'base::Feature k',
+      (
+          'Please use BASE_DECLARE_FEATURE() or BASE_FEATURE() instead of ',
+          'directly declaring/defining features.'
+      ),
+      True,
+      [
+        _THIRD_PARTY_EXCEPT_BLINK,
+      ],
+    ),
 )
 
 _BANNED_MOJOM_PATTERNS : Sequence[BanRule] = (
diff --git a/android_webview/common/aw_features.cc b/android_webview/common/aw_features.cc
index de8c7c4..40d160ef 100644
--- a/android_webview/common/aw_features.cc
+++ b/android_webview/common/aw_features.cc
@@ -143,8 +143,9 @@
              base::FEATURE_DISABLED_BY_DEFAULT);
 
 // This persists client hints between top-level navigations.
-const base::Feature kWebViewClientHintsControllerDelegate{
-    "WebViewClientHintsControllerDelegate", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kWebViewClientHintsControllerDelegate,
+             "WebViewClientHintsControllerDelegate",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 }  // namespace features
 }  // namespace android_webview
diff --git a/android_webview/lib/aw_main_delegate.cc b/android_webview/lib/aw_main_delegate.cc
index 6594437..7de11d3 100644
--- a/android_webview/lib/aw_main_delegate.cc
+++ b/android_webview/lib/aw_main_delegate.cc
@@ -293,8 +293,7 @@
 
     features.DisableIfNotSet(::features::kInstalledApp);
 
-    features.EnableIfNotSet(
-        metrics::UnsentLogStoreMetrics::kRecordLastUnsentLogMetadataMetrics);
+    features.EnableIfNotSet(metrics::kRecordLastUnsentLogMetadataMetrics);
 
     features.DisableIfNotSet(::features::kPeriodicBackgroundSync);
 
diff --git a/ash/capture_mode/capture_mode_session.cc b/ash/capture_mode/capture_mode_session.cc
index 71d7aa5..dca4ec5 100644
--- a/ash/capture_mode/capture_mode_session.cc
+++ b/ash/capture_mode/capture_mode_session.cc
@@ -688,6 +688,7 @@
   aura::Env::GetInstance()->RemovePreTargetHandler(this);
   display_observer_.reset();
   user_nudge_controller_.reset();
+  capture_window_observer_.reset();
   TabletModeController::Get()->RemoveObserver(this);
   if (input_capture_window_) {
     input_capture_window_->RemoveObserver(this);
@@ -711,6 +712,13 @@
   UpdateFloatingPanelBoundsIfNeeded();
 
   if (!is_stopping_to_start_video_recording_) {
+    // Kill the camera preview when the capture mode session ends without
+    // starting any recording. Note that we need to kill the camera preview
+    // before aborting the projector session to avoid repareting the camera
+    // preview widget which will lead to crash.
+    if (!controller_->is_recording_in_progress())
+      controller_->camera_controller()->SetShouldShowPreview(false);
+
     // Stopping the session for any reason other than starting video recording
     // means a cancellation to an ongoing projector session (if any).
     if (is_in_projector_mode_) {
@@ -723,11 +731,6 @@
       // projector-initiated capture mode session.
       controller_->camera_controller()->MaybeRevertAutoCameraSelection();
     }
-
-    // Kill the camera preview when the capture mode session ends without
-    // starting any recording.
-    if (!controller_->is_recording_in_progress())
-      controller_->camera_controller()->SetShouldShowPreview(false);
   }
 
   Shell::Get()->RemoveShellObserver(this);
diff --git a/ash/capture_mode/capture_mode_test_api.cc b/ash/capture_mode/capture_mode_test_api.cc
index d2c2a44..955afeb 100644
--- a/ash/capture_mode/capture_mode_test_api.cc
+++ b/ash/capture_mode/capture_mode_test_api.cc
@@ -49,6 +49,10 @@
   controller_->Start(CaptureModeEntryType::kQuickSettings);
 }
 
+void CaptureModeTestApi::SetCaptureModeSource(CaptureModeSource source) {
+  controller_->SetSource(source);
+}
+
 bool CaptureModeTestApi::IsSessionActive() const {
   return controller_->IsActive();
 }
@@ -198,6 +202,10 @@
       .on_video_frame_rendered_for_test_ = std::move(callback);
 }
 
+views::Widget* CaptureModeTestApi::GetCameraPreviewWidget() {
+  return controller_->camera_controller()->camera_preview_widget();
+}
+
 void CaptureModeTestApi::SetType(bool for_video) {
   controller_->SetType(for_video ? CaptureModeType::kVideo
                                  : CaptureModeType::kImage);
diff --git a/ash/components/arc/BUILD.gn b/ash/components/arc/BUILD.gn
index 84ab965..413c147 100644
--- a/ash/components/arc/BUILD.gn
+++ b/ash/components/arc/BUILD.gn
@@ -124,7 +124,6 @@
     "//chromeos/ash/components/audio",
     "//chromeos/ash/components/dbus",
     "//chromeos/ash/components/dbus/arc",
-    "//chromeos/ash/components/dbus/arc:arc_proto",
     "//chromeos/ash/components/dbus/concierge",
     "//chromeos/ash/components/dbus/concierge:concierge_proto",
     "//chromeos/ash/components/dbus/cryptohome",
diff --git a/ash/components/arc/session/arc_container_client_adapter.cc b/ash/components/arc/session/arc_container_client_adapter.cc
index d3c45dc9..d910e23 100644
--- a/ash/components/arc/session/arc_container_client_adapter.cc
+++ b/ash/components/arc/session/arc_container_client_adapter.cc
@@ -14,7 +14,7 @@
 #include "base/notreached.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chromeos/ash/components/cryptohome/cryptohome_parameters.h"
-#include "chromeos/ash/components/dbus/arc/arc.pb.h"
+#include "chromeos/ash/components/dbus/login_manager/arc.pb.h"
 #include "chromeos/ash/components/dbus/session_manager/session_manager_client.h"
 #include "chromeos/dbus/common/dbus_method_call_status.h"
 
@@ -22,59 +22,72 @@
 namespace {
 
 // Converts PackageCacheMode into login_manager's.
-UpgradeArcContainerRequest_PackageCacheMode ToLoginManagerPackageCacheMode(
-    UpgradeParams::PackageCacheMode mode) {
+login_manager::UpgradeArcContainerRequest_PackageCacheMode
+ToLoginManagerPackageCacheMode(UpgradeParams::PackageCacheMode mode) {
   switch (mode) {
     case UpgradeParams::PackageCacheMode::DEFAULT:
-      return UpgradeArcContainerRequest_PackageCacheMode_DEFAULT;
+      return login_manager::UpgradeArcContainerRequest_PackageCacheMode_DEFAULT;
     case UpgradeParams::PackageCacheMode::COPY_ON_INIT:
-      return UpgradeArcContainerRequest_PackageCacheMode_COPY_ON_INIT;
+      return login_manager::
+          UpgradeArcContainerRequest_PackageCacheMode_COPY_ON_INIT;
     case UpgradeParams::PackageCacheMode::SKIP_SETUP_COPY_ON_INIT:
-      return UpgradeArcContainerRequest_PackageCacheMode_SKIP_SETUP_COPY_ON_INIT;
+      return login_manager::
+          UpgradeArcContainerRequest_PackageCacheMode_SKIP_SETUP_COPY_ON_INIT;
   }
 }
 
 // Converts ArcManagementTransition into login_manager's.
-UpgradeArcContainerRequest_ManagementTransition
+login_manager::UpgradeArcContainerRequest_ManagementTransition
 ToLoginManagerManagementTransition(ArcManagementTransition transition) {
   switch (transition) {
     case ArcManagementTransition::NO_TRANSITION:
-      return UpgradeArcContainerRequest_ManagementTransition_NONE;
+      return login_manager::
+          UpgradeArcContainerRequest_ManagementTransition_NONE;
     case ArcManagementTransition::CHILD_TO_REGULAR:
-      return UpgradeArcContainerRequest_ManagementTransition_CHILD_TO_REGULAR;
+      return login_manager::
+          UpgradeArcContainerRequest_ManagementTransition_CHILD_TO_REGULAR;
     case ArcManagementTransition::REGULAR_TO_CHILD:
-      return UpgradeArcContainerRequest_ManagementTransition_REGULAR_TO_CHILD;
+      return login_manager::
+          UpgradeArcContainerRequest_ManagementTransition_REGULAR_TO_CHILD;
     case ArcManagementTransition::UNMANAGED_TO_MANAGED:
-      return UpgradeArcContainerRequest_ManagementTransition_UNMANAGED_TO_MANAGED;
+      return login_manager::
+          UpgradeArcContainerRequest_ManagementTransition_UNMANAGED_TO_MANAGED;
   }
 }
 
 // Converts PlayStoreAutoUpdate into login_manager's.
-StartArcMiniInstanceRequest_PlayStoreAutoUpdate
+login_manager::StartArcMiniContainerRequest_PlayStoreAutoUpdate
 ToLoginManagerPlayStoreAutoUpdate(StartParams::PlayStoreAutoUpdate update) {
   switch (update) {
     case StartParams::PlayStoreAutoUpdate::AUTO_UPDATE_DEFAULT:
-      return StartArcMiniInstanceRequest_PlayStoreAutoUpdate_AUTO_UPDATE_DEFAULT;
+      return login_manager::
+          StartArcMiniContainerRequest_PlayStoreAutoUpdate_AUTO_UPDATE_DEFAULT;
     case StartParams::PlayStoreAutoUpdate::AUTO_UPDATE_ON:
-      return StartArcMiniInstanceRequest_PlayStoreAutoUpdate_AUTO_UPDATE_ON;
+      return login_manager::
+          StartArcMiniContainerRequest_PlayStoreAutoUpdate_AUTO_UPDATE_ON;
     case StartParams::PlayStoreAutoUpdate::AUTO_UPDATE_OFF:
-      return StartArcMiniInstanceRequest_PlayStoreAutoUpdate_AUTO_UPDATE_OFF;
+      return login_manager::
+          StartArcMiniContainerRequest_PlayStoreAutoUpdate_AUTO_UPDATE_OFF;
   }
 }
 
 // Converts DalvikMemoryProfile into login_manager's.
-StartArcMiniInstanceRequest_DalvikMemoryProfile
+login_manager::StartArcMiniContainerRequest_DalvikMemoryProfile
 ToLoginManagerDalvikMemoryProfile(
     StartParams::DalvikMemoryProfile dalvik_memory_profile) {
   switch (dalvik_memory_profile) {
     case StartParams::DalvikMemoryProfile::DEFAULT:
-      return StartArcMiniInstanceRequest_DalvikMemoryProfile_MEMORY_PROFILE_DEFAULT;
+      return login_manager::
+          StartArcMiniContainerRequest_DalvikMemoryProfile_MEMORY_PROFILE_DEFAULT;
     case StartParams::DalvikMemoryProfile::M4G:
-      return StartArcMiniInstanceRequest_DalvikMemoryProfile_MEMORY_PROFILE_4G;
+      return login_manager::
+          StartArcMiniContainerRequest_DalvikMemoryProfile_MEMORY_PROFILE_4G;
     case StartParams::DalvikMemoryProfile::M8G:
-      return StartArcMiniInstanceRequest_DalvikMemoryProfile_MEMORY_PROFILE_8G;
+      return login_manager::
+          StartArcMiniContainerRequest_DalvikMemoryProfile_MEMORY_PROFILE_8G;
     case StartParams::DalvikMemoryProfile::M16G:
-      return StartArcMiniInstanceRequest_DalvikMemoryProfile_MEMORY_PROFILE_16G;
+      return login_manager::
+          StartArcMiniContainerRequest_DalvikMemoryProfile_MEMORY_PROFILE_16G;
   }
 }
 
@@ -97,9 +110,9 @@
       ash::SessionManagerClient::Get()->RemoveObserver(this);
   }
 
-  StartArcMiniInstanceRequest ConvertStartParamsToStartArcMiniInstanceRequest(
-      StartParams params) {
-    StartArcMiniInstanceRequest request;
+  login_manager::StartArcMiniContainerRequest
+  ConvertStartParamsToStartArcMiniContainerRequest(StartParams params) {
+    login_manager::StartArcMiniContainerRequest request;
     request.set_native_bridge_experiment(params.native_bridge_experiment);
     request.set_lcd_density(params.lcd_density);
     request.set_arc_file_picker_experiment(params.arc_file_picker_experiment);
@@ -136,14 +149,14 @@
     }
 
     auto request =
-        ConvertStartParamsToStartArcMiniInstanceRequest(std::move(params));
+        ConvertStartParamsToStartArcMiniContainerRequest(std::move(params));
     ash::SessionManagerClient::Get()->StartArcMiniContainer(
         request, std::move(callback));
   }
 
-  UpgradeArcContainerRequest ConvertUpgradeParamsToUpgradeArcContainerRequest(
-      UpgradeParams params) {
-    UpgradeArcContainerRequest request;
+  login_manager::UpgradeArcContainerRequest
+  ConvertUpgradeParamsToUpgradeArcContainerRequest(UpgradeParams params) {
+    login_manager::UpgradeArcContainerRequest request;
     request.set_account_id(params.account_id);
     request.set_is_account_managed(params.is_account_managed);
     request.set_is_managed_adb_sideloading_allowed(
diff --git a/ash/components/arc/session/arc_container_client_adapter_unittest.cc b/ash/components/arc/session/arc_container_client_adapter_unittest.cc
index a05a1468..afbddd39 100644
--- a/ash/components/arc/session/arc_container_client_adapter_unittest.cc
+++ b/ash/components/arc/session/arc_container_client_adapter_unittest.cc
@@ -221,18 +221,22 @@
   // Requested profile.
   StartParams::DalvikMemoryProfile profile;
   // Expected value passed to DBus.
-  StartArcMiniInstanceRequest_DalvikMemoryProfile expectation;
+  login_manager::StartArcMiniContainerRequest_DalvikMemoryProfile expectation;
 };
 
 constexpr DalvikMemoryProfileTestParam kDalvikMemoryProfileTestCases[] = {
     {StartParams::DalvikMemoryProfile::DEFAULT,
-     StartArcMiniInstanceRequest_DalvikMemoryProfile_MEMORY_PROFILE_DEFAULT},
+     login_manager::
+         StartArcMiniContainerRequest_DalvikMemoryProfile_MEMORY_PROFILE_DEFAULT},
     {StartParams::DalvikMemoryProfile::M4G,
-     StartArcMiniInstanceRequest_DalvikMemoryProfile_MEMORY_PROFILE_4G},
+     login_manager::
+         StartArcMiniContainerRequest_DalvikMemoryProfile_MEMORY_PROFILE_4G},
     {StartParams::DalvikMemoryProfile::M8G,
-     StartArcMiniInstanceRequest_DalvikMemoryProfile_MEMORY_PROFILE_8G},
+     login_manager::
+         StartArcMiniContainerRequest_DalvikMemoryProfile_MEMORY_PROFILE_8G},
     {StartParams::DalvikMemoryProfile::M16G,
-     StartArcMiniInstanceRequest_DalvikMemoryProfile_MEMORY_PROFILE_16G}};
+     login_manager::
+         StartArcMiniContainerRequest_DalvikMemoryProfile_MEMORY_PROFILE_16G}};
 
 class ArcContainerClientAdapterDalvikMemoryProfileTest
     : public ArcContainerClientAdapterTest,
diff --git a/ash/public/cpp/capture_mode/capture_mode_test_api.h b/ash/public/cpp/capture_mode/capture_mode_test_api.h
index a3733a8..95a4d3c 100644
--- a/ash/public/cpp/capture_mode/capture_mode_test_api.h
+++ b/ash/public/cpp/capture_mode/capture_mode_test_api.h
@@ -6,6 +6,7 @@
 #define ASH_PUBLIC_CPP_CAPTURE_MODE_CAPTURE_MODE_TEST_API_H_
 
 #include "ash/ash_export.h"
+#include "ash/capture_mode/capture_mode_types.h"
 #include "base/callback_forward.h"
 #include "base/files/file_path.h"
 #include "base/memory/scoped_refptr.h"
@@ -22,6 +23,10 @@
 class VideoFrame;
 }  // namespace media
 
+namespace views {
+class Widget;
+}  // namespace views
+
 namespace ash {
 
 class CaptureModeController;
@@ -37,13 +42,16 @@
   ~CaptureModeTestApi() = default;
 
   // APIs to start capture mode from the three possible sources (fullscreen,
-  // window, or region). If |for_video| is true, a video will be recorded from
+  // window, or region). If `for_video` is true, a video will be recorded from
   // the chosen source once capture begins, otherwise an image will be
   // captured.
   void StartForFullscreen(bool for_video);
   void StartForWindow(bool for_video);
   void StartForRegion(bool for_video);
 
+  // API to set the capture mode source with given `source`.
+  void SetCaptureModeSource(CaptureModeSource source);
+
   // Returns true if a capture mode session is currently active.
   bool IsSessionActive() const;
 
@@ -142,6 +150,9 @@
       base::OnceCallback<void(scoped_refptr<media::VideoFrame>)>;
   void SetOnCameraVideoFrameRendered(CameraVideoFrameCallback callback);
 
+  // Returns the camera preview widget if exists and nullptr otherwise.
+  views::Widget* GetCameraPreviewWidget();
+
  private:
   // Sets the capture mode type to a video capture if |for_video| is true, or
   // image capture otherwise.
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb
index 57ade91..6f9c64a 100644
--- a/ash/strings/ash_strings_da.xtb
+++ b/ash/strings/ash_strings_da.xtb
@@ -165,6 +165,7 @@
 <translation id="1838895407229022812">Nattelys er slået fra.</translation>
 <translation id="1862380676329487333">Opdater, og log ud</translation>
 <translation id="1864454756846565995">USB-C-enhed (port bagpå)</translation>
+<translation id="1869497990620230175">Genvej til foretrukne filer</translation>
 <translation id="1879018240766558464">Inkognitovinduer understøttes ikke i øjeblikket. Andre apps gemmes.</translation>
 <translation id="1882814835921407042">Intet mobilnetværk</translation>
 <translation id="1882897271359938046">Spejler mod <ph name="DISPLAY_NAME" /></translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb
index bdec2e1..55ee203 100644
--- a/ash/strings/ash_strings_eu.xtb
+++ b/ash/strings/ash_strings_eu.xtb
@@ -74,7 +74,7 @@
 <translation id="1293556467332435079">Fitxategiak</translation>
 <translation id="1294929383540927798">Aldatu pantaila blokeatuaren jakinarazpen-ezarpenak</translation>
 <translation id="1301069673413256657">GSM</translation>
-<translation id="1302880136325416935">Erakutsi Bluetooth-aren ezarpenak. <ph name="STATE_TEXT" /></translation>
+<translation id="1302880136325416935">Erakutsi Bluetootharen ezarpenak. <ph name="STATE_TEXT" /></translation>
 <translation id="1306549533752902673">GOMENDATUTAKO APLIKAZIOAK</translation>
 <translation id="1312604459020188865">Seinalearen indarra: <ph name="SIGNAL_STRENGTH" /></translation>
 <translation id="1316069254387866896">Erakutsi beti apala</translation>
@@ -119,7 +119,7 @@
 <translation id="1546930421365146760">Eskatu administratzaileari gailua konfiguratzeko Google-ren administrazio-kontsolan</translation>
 <translation id="1550523713251050646">Aukera gehiago ikusteko, egin klik hemen</translation>
 <translation id="1555130319947370107">Urdina</translation>
-<translation id="1570871743947603115">Gaitu/Desgaitu Bluetooth-a. <ph name="STATE_TEXT" /></translation>
+<translation id="1570871743947603115">Gaitu/Desgaitu Bluetootha. <ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">Atzitu saio honetan egin dituzun jarduera guztiak</translation>
 <translation id="1610778689852195798">"Desegin"</translation>
 <translation id="1611993646327628135">Aktibatuta</translation>
@@ -226,7 +226,7 @@
 <translation id="225680501294068881">Gailuak bilatzen…</translation>
 <translation id="2257486738914982088">Arazo bat izan da <ph name="FILENAME" /> deskargatzean</translation>
 <translation id="2258734398699965611">Iradokitako fitxategiak</translation>
-<translation id="2268130516524549846">Bluetooth-a desgaituta dago</translation>
+<translation id="2268130516524549846">Bluetootha desgaituta dago</translation>
 <translation id="2268813581635650749">Amaitu guztien saioa</translation>
 <translation id="2269016722240250274">Aplikazio bat mikrofonoa erabiltzen ari da</translation>
 <translation id="2277103315734023688">Aurreratu</translation>
@@ -368,7 +368,7 @@
 <translation id="309749186376891736">Mugitu kurtsorea</translation>
 <translation id="3100274880412651815">Baztertu edukia kapturatzeko modua</translation>
 <translation id="3105917916468784889">Atera pantaila-argazkia</translation>
-<translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth-a)</translation>
+<translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetootha)</translation>
 <translation id="3120421559657122717">Gailua itzali nahi duzu?</translation>
 <translation id="3126069444801937830">Eguneratzeko, berrabiarazi</translation>
 <translation id="3139382871451988441">Desaktibatu kamera atzitzeko baimena.</translation>
@@ -433,7 +433,7 @@
 <translation id="3485319357743610354"><ph name="SECURITY_STATUS" />. <ph name="CONNECTION_STATUS" />. Seinalearen indarra: <ph name="SIGNAL_STRENGTH" />.</translation>
 <translation id="348799646910989694">Apala automatikoki ezkutatuko da</translation>
 <translation id="3505066820268455558">Bateria kargatzen</translation>
-<translation id="3509391053705095206">Ezin da aurkitu telefonoa. Ziurtatu telefonoaren Bluetooth-a aktibatuta dagoela.</translation>
+<translation id="3509391053705095206">Ezin da aurkitu telefonoa. Ziurtatu telefonoaren Bluetootha aktibatuta dagoela.</translation>
 <translation id="3510164367642747937">Nabarmendu saguaren kurtsorea</translation>
 <translation id="3513798432020909783"><ph name="MANAGER_EMAIL" /> kontuaren bidez kudeatzen da kontu hau</translation>
 <translation id="352245152354538528">{0,plural, =1{Eguneratu gailua minutu bat barru}other{Eguneratu gailua # minutu barru}}</translation>
@@ -455,7 +455,7 @@
 <translation id="3600061223661453002">Desaktibatu</translation>
 <translation id="3604801046548457007"><ph name="DESK_TITILE" /> lan-eremua sortu da</translation>
 <translation id="3606978283550408104">Braille-pantaila konektatu da.</translation>
-<translation id="3615926715408477684">Datu-konexioa aktibatzen baduzu, Bluetooth-a ere aktibatuko da</translation>
+<translation id="3615926715408477684">Datu-konexioa aktibatzen baduzu, Bluetootha ere aktibatuko da</translation>
 <translation id="3616883743181209306">Pantailaren goiko eskuineko izkinara eraman da menua.</translation>
 <translation id="3619536907358025872">Pantaila-kaptura eginbidearen ezarpenak</translation>
 <translation id="3621202678540785336">Idazketa</translation>
@@ -463,7 +463,7 @@
 <translation id="3626281679859535460">Distira</translation>
 <translation id="3630697955794050612">desaktibatuta</translation>
 <translation id="3631369015426612114">Onartu hauen jakinarazpenak</translation>
-<translation id="3633097874324966332">Ireki Bluetooth-aren ezarpenak gailua parekatzeko</translation>
+<translation id="3633097874324966332">Ireki Bluetootharen ezarpenak gailua parekatzeko</translation>
 <translation id="3638400994746983214">Aktibatu/Desaktibatu pribatutasun-pantaila. <ph name="STATE_TEXT" />.</translation>
 <translation id="3649505501900178324">Eguneratze bat dago egiteke</translation>
 <translation id="3659814201068740063"><ph name="TIME_LEFT" /> inguru geratzen dira (% <ph name="PERCENTAGE" />).
@@ -539,7 +539,7 @@
 <translation id="4114315158543974537">Aktibatu Phone Hub</translation>
 <translation id="4115378294792113321">Magenta</translation>
 <translation id="412298498316631026">leiho bat</translation>
-<translation id="4123259114412175274">Chromebook-a desblokeatzeko, ziurtatu telefonoaren Bluetooth-a aktibatuta dagoela</translation>
+<translation id="4123259114412175274">Chromebook-a desblokeatzeko, ziurtatu telefonoaren Bluetootha aktibatuta dagoela</translation>
 <translation id="4125970834901680537">Ezin dira zuzenean exekutatu aplikazioak tableta moduan. Saiatu berriro ordenagailu eramangarriaren modua erabilita.</translation>
 <translation id="4129129681837227511">Pantaila blokeatuan jakinarazpenak ikusteko, desblokeatu gailua eta aldatu ezarpena</translation>
 <translation id="4130035430755296270">Diseinu-aukera gehiago ikusteko, jarraitu gainetik pasatzen</translation>
@@ -685,7 +685,7 @@
 <translation id="4881695831933465202">Ireki</translation>
 <translation id="4889868803215848840">Eman iritzia iradokizunak hobetzeko (aukerakoa):</translation>
 <translation id="4890187583552566966">Administratzaileak desgaitu egin du Google-ren Laguntzailea.</translation>
-<translation id="4890408602550914571">Ziurtatu telefonoa hurbil dagoela eta Bluetooth-a aktibatuta daukala.</translation>
+<translation id="4890408602550914571">Ziurtatu telefonoa hurbil dagoela eta Bluetootha aktibatuta daukala.</translation>
 <translation id="4895488851634969361">Bateria beteta dago.</translation>
 <translation id="490375751687810070">Bertikala</translation>
 <translation id="490788395437447240">Bateria: % <ph name="BATTERY_PERCENTAGE" /></translation>
@@ -753,7 +753,7 @@
 <translation id="5300589172476337783">Erakutsi</translation>
 <translation id="5302048478445481009">Hizkuntza</translation>
 <translation id="5308380583665731573">Konektatu</translation>
-<translation id="5313326810920013265">Bluetooth-aren ezarpenak</translation>
+<translation id="5313326810920013265">Bluetootharen ezarpenak</translation>
 <translation id="5314219114274263156">Grabatu da pantaila</translation>
 <translation id="5317780077021120954">Gorde</translation>
 <translation id="5319712128756744240">Parekatu beste gailu batekin</translation>
@@ -803,9 +803,9 @@
 <translation id="554893713779400387">Aktibatu/Desaktibatu diktaketa</translation>
 <translation id="5560420195677022218">Ikusi telefonoko aplikazioak <ph name="DEVICE_TYPE" /> gailuan</translation>
 <translation id="556042886152191864">Botoia</translation>
-<translation id="5571066253365925590">Bluetooth-a gaitu da</translation>
+<translation id="5571066253365925590">Bluetootha gaitu da</translation>
 <translation id="557563299383177668">Hurrengo paragrafoa</translation>
-<translation id="5577281275355252094">Phone Hub erabiltzeko, egiaztatu Bluetooth-a gaituta daukazula telefonoan</translation>
+<translation id="5577281275355252094">Phone Hub erabiltzeko, egiaztatu Bluetootha gaituta daukazula telefonoan</translation>
 <translation id="5580000943347215299">Liburutegia</translation>
 <translation id="558849140439112033">Arrastatu argazkian agertzea nahi duzun eremua hautatzeko</translation>
 <translation id="5597451508971090205"><ph name="SHORT_WEEKDAY" />, <ph name="DATE" /></translation>
@@ -835,7 +835,7 @@
 <translation id="574392208103952083">Ertaina</translation>
 <translation id="5744083938413354016">Sakatze bidezko arrastatzea</translation>
 <translation id="5745612484876805746">Iluntzean, automatikoki aktibatzen da gaueko argia</translation>
-<translation id="5750765938512549687">Desaktibatuta dago Bluetooth-a</translation>
+<translation id="5750765938512549687">Desaktibatuta dago Bluetootha</translation>
 <translation id="5760866832697883462">Konektatu <ph name="NAME" /> gailua</translation>
 <translation id="5762420912707163638">Aktibatu edo desaktibatu markatzailea. <ph name="STATE_TEXT" /> Erabili ukipen-panela, ukipen-pantaila edo arkatza pantailan marrazteko.</translation>
 <translation id="576341972084747908">Arriskutsua da <ph name="FILENAME" /> deskargatzea</translation>
@@ -939,7 +939,7 @@
 <translation id="6344138931392227467"><ph name="DEVICE_NAME" /> gailua konektatu da</translation>
 <translation id="6351032674660237738">APLIKAZIOEN IRADOKIZUNAK</translation>
 <translation id="6359587239691116345">Lortu azken eginbideak eta segurtasun-hobekuntzak. Eguneratzea baztertzen baduzu, baliteke gailuak behar bezala funtzionatzeari uztea eta segurtasun- eta errendimendu-arazoak izatea.</translation>
-<translation id="6376931439017688372">Aktibatuta dago Bluetooth-a</translation>
+<translation id="6376931439017688372">Aktibatuta dago Bluetootha</translation>
 <translation id="6381109794406942707">Gailua desblokeatzeko, idatzi PINa.</translation>
 <translation id="639644700271529076">BLOK MAIUS desaktibatuta dago</translation>
 <translation id="6406704438230478924">altgr</translation>
@@ -1204,7 +1204,7 @@
 <translation id="7868900307798234037">Hatz-markarekin desblokeatzen</translation>
 <translation id="7872195908557044066">Administratzailea zure eSIM txartela berrezartzen ari da. Itxaron minutu batzuk.</translation>
 <translation id="7872786842639831132">Desaktibatuta</translation>
-<translation id="7875575368831396199">Bluetooth-a desaktibatuta dago <ph name="DEVICE_TYPE" /> gailuan. Aktiba ezazu Phone Hub erabiltzeko.</translation>
+<translation id="7875575368831396199">Bluetootha desaktibatuta dago <ph name="DEVICE_TYPE" /> gailuan. Aktiba ezazu Phone Hub erabiltzeko.</translation>
 <translation id="7877557217297072640">{0,plural, =0{Itzuli gailuaren aurreko bertsiora orain}=1{Itzuli gailuaren aurreko bertsiora segundo bat barru}other{Itzuli gailuaren aurreko bertsiora # segundo barru}}</translation>
 <translation id="7886169021410746335">Doitu pribatutasun-ezarpenak</translation>
 <translation id="7886277072580235377">Interneteko saioari buruzko informazioa ezabatu egingo da hura amaitzen duzunean. <ph name="LEARN_MORE" /></translation>
@@ -1238,7 +1238,7 @@
 <translation id="8036504271468642248">Aurreko esaldia</translation>
 <translation id="8042893070933512245">Ireki Erabilerraztasun-ezarpenak menua</translation>
 <translation id="8044457332620420407">Teklatuaren ondoko argia itzalita dago</translation>
-<translation id="8048123526339889627">Bluetooth-aren ezarpenak</translation>
+<translation id="8048123526339889627">Bluetootharen ezarpenak</translation>
 <translation id="8051716679295756675">Badago "<ph name="DESK_TEMPLATE_NAME" />" izeneko txantiloi bat</translation>
 <translation id="8052898407431791827">Kopiatu da arbelean</translation>
 <translation id="8054466585765276473">Bateria-denbora kalkulatzen.</translation>
@@ -1315,7 +1315,7 @@
 <translation id="8473301994082929012"><ph name="ORGANIZATION_NAME" /> erakundeak <ph name="FEATURE_STATE" /> dauka <ph name="FEATURE_NAME" />.</translation>
 <translation id="8477270416194247200">Bertan behera uzteko, sakatu Alt + Bilatu edo Maius.</translation>
 <translation id="8492573885090281069"><ph name="DISPLAY_NAME" /> pantailak ez du onartzen <ph name="SPECIFIED_RESOLUTION" /> bereizmena. <ph name="FALLBACK_RESOLUTION" /> ezarri da pantailaren bereizmen gisa. Sakatu "Berretsi" aldaketak gordetzeko. <ph name="TIMEOUT_SECONDS" /> barru aurreko ezarpenak leheneratuko dira.</translation>
-<translation id="85123341071060231">Chromebook-aren Bluetooth-a desaktibatuta dago. Chromebook-a desblokeatzeko, idatzi pasahitza.</translation>
+<translation id="85123341071060231">Chromebook-aren Bluetootha desaktibatuta dago. Chromebook-a desblokeatzeko, idatzi pasahitza.</translation>
 <translation id="8513108775083588393">Biratu auto.</translation>
 <translation id="851458219935658693">Erakutsi lan-eremu honetan dauden leihoak, aukera-botoia hautatuta dago</translation>
 <translation id="8517041960877371778">Baliteke <ph name="DEVICE_TYPE" /> gailua ez kargatzea piztuta dagoen bitartean.</translation>
@@ -1410,7 +1410,7 @@
 <translation id="9065203028668620118">Editatu</translation>
 <translation id="9070640332319875144">Laguntzailea zerbitzuaren ezarpenak</translation>
 <translation id="9072519059834302790"><ph name="TIME_LEFT" /> agortu arte.</translation>
-<translation id="9074739597929991885">Bluetooth-a</translation>
+<translation id="9074739597929991885">Bluetootha</translation>
 <translation id="9077404278023321866">Txantiloiak</translation>
 <translation id="9077515519330855811">Multimedia-edukia kontrolatzeko aukerak, <ph name="MEDIA_TITLE" /> erreproduzitzen</translation>
 <translation id="9079731690316798640">Wifia: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb
index 6479219..3aa4eac 100644
--- a/ash/strings/ash_strings_hy.xtb
+++ b/ash/strings/ash_strings_hy.xtb
@@ -165,6 +165,7 @@
 <translation id="1838895407229022812">Գիշերային ռեժիմն անջատված է</translation>
 <translation id="1862380676329487333">Թարմացնել և դուրս գալ</translation>
 <translation id="1864454756846565995">USB-C սարք (հետևի միացք)</translation>
+<translation id="1869497990620230175">Ֆայլերի արագ մուտք</translation>
 <translation id="1879018240766558464">Ինկոգնիտո պատուհանները ներկայումս չեն աջակցվում։ Մյուս հավելվածները կպահվեն։</translation>
 <translation id="1882814835921407042">Բջջային կապ չկա</translation>
 <translation id="1882897271359938046">Հայելապատճենվում է <ph name="DISPLAY_NAME" />-ին</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb
index 495e1952e..0814e56 100644
--- a/ash/strings/ash_strings_th.xtb
+++ b/ash/strings/ash_strings_th.xtb
@@ -165,6 +165,7 @@
 <translation id="1838895407229022812">แสงตอนกลางคืนปิดอยู่</translation>
 <translation id="1862380676329487333">อัปเดตและออกจากระบบ</translation>
 <translation id="1864454756846565995">อุปกรณ์ USB-C (พอร์ตด้านหลัง)</translation>
+<translation id="1869497990620230175">ไฟล์ด่วน</translation>
 <translation id="1879018240766558464">ขณะนี้ยังไม่รองรับหน้าต่างที่ไม่ระบุตัวตน ระบบจะบันทึกแอปอื่นๆ</translation>
 <translation id="1882814835921407042">ไม่มีเครือข่ายมือถือ</translation>
 <translation id="1882897271359938046">กำลังแสดงผลไปที่ <ph name="DISPLAY_NAME" /></translation>
diff --git a/ash/webui/camera_app_ui/resources/js/metrics.ts b/ash/webui/camera_app_ui/resources/js/metrics.ts
index 4bd7a36..43cbd3c4 100644
--- a/ash/webui/camera_app_ui/resources/js/metrics.ts
+++ b/ash/webui/camera_app_ui/resources/js/metrics.ts
@@ -529,3 +529,57 @@
         [MetricDimension.SUPPORT_ZOOM, capabilities.zoom],
       ]));
 }
+
+/**
+ * TODO(b/223089758): Remove `DocResultType` and `DocFixType` and mark the
+ * dimensions as obsolete once multi-page document scanning feature is fully
+ * landed.
+ */
+export enum DocScanFixType {
+  NONE = 0,
+  CORNER = 0b1,
+  ROTATION = 0b10,
+}
+
+export enum DocScanResultActionType {
+  CANCEL = 'cancel',
+  SAVE_AS_PDF = 'save-as-pdf',
+  SAVE_AS_PHOTO = 'save-as-photo',
+  SHARE = 'share',
+}
+
+/**
+ * Sends the multi-page document scanning result event. The actions will either
+ * remove all pages (cancel) or generate files from pages (save/share).
+ */
+export function sendDocScanResultEvent(
+    action: DocScanResultActionType,
+    fixType: DocScanFixType,
+    fixCount: number,
+    ): void {
+  sendEvent(
+      {
+        eventCategory: 'doc-scan',
+        eventAction: action,
+        eventValue: fixCount,
+      },
+      new Map([
+        [MetricDimension.DOC_FIX_TYPE, fixType],
+      ]));
+}
+
+export enum DocScanActionType {
+  ADD_PAGE = 'add-page',
+  DELETE_PAGE = 'delete-page',
+  FIX = 'fix',
+}
+
+/**
+ * Sends the multi-page document scanning event.
+ */
+export function sendDocScanEvent(action: DocScanActionType): void {
+  sendEvent({
+    eventCategory: 'doc-scan',
+    eventAction: action,
+  });
+}
diff --git a/ash/webui/camera_app_ui/resources/js/views/camera.ts b/ash/webui/camera_app_ui/resources/js/views/camera.ts
index a648c81..4657404 100644
--- a/ash/webui/camera_app_ui/resources/js/views/camera.ts
+++ b/ash/webui/camera_app_ui/resources/js/views/camera.ts
@@ -648,7 +648,13 @@
         blob,
         corners,
         rotation: Rotation.ANGLE_0,
+      });
+      metrics.sendCaptureEvent({
+        facing: this.getFacing(),
         resolution,
+        shutterType: this.shutterType,
+        resolutionLevel: this.cameraManager.getPhotoResolutionLevel(resolution),
+        aspectRatioSet: this.cameraManager.getAspectRatioSet(resolution),
       });
     } finally {
       nav.close(ViewName.FLASH);
diff --git a/ash/webui/camera_app_ui/resources/js/views/document_fix_mode.ts b/ash/webui/camera_app_ui/resources/js/views/document_fix_mode.ts
index 94008b6..8ac38abf 100644
--- a/ash/webui/camera_app_ui/resources/js/views/document_fix_mode.ts
+++ b/ash/webui/camera_app_ui/resources/js/views/document_fix_mode.ts
@@ -169,12 +169,19 @@
    */
   private readonly resizeObserver: ResizeObserver;
 
-  constructor({target, onExit, onUpdatePage}: {
+  /**
+   * The listener called when fix mode shows.
+   */
+  private readonly onShow: () => void;
+
+  constructor({target, onDone, onShow, onUpdatePage}: {
     target: HTMLElement,
-    onExit: () => void,
+    onDone: () => void,
+    onShow: () => void,
     onUpdatePage:
         ({corners, rotation}: {corners: Point[], rotation: Rotation}) => void,
   }) {
+    this.onShow = onShow;
     const fragment = util.instantiateTemplate(this.templateSelector);
     this.root = dom.getFrom(fragment, '.document-fix-mode', HTMLElement);
     target.append(this.root);
@@ -394,7 +401,7 @@
     });
     dom.getFrom(
            this.root, 'button[i18n-text=label_crop_done]', HTMLButtonElement)
-        .addEventListener('click', onExit);
+        .addEventListener('click', onDone);
   }
 
   private setDragging(corner: Corner, pointerId: number) {
@@ -640,6 +647,7 @@
   show(): void {
     this.root.classList.add('show');
     this.resizeObserver.observe(this.previewArea);
+    this.onShow();
   }
 
   hide(): void {
diff --git a/ash/webui/camera_app_ui/resources/js/views/document_review.ts b/ash/webui/camera_app_ui/resources/js/views/document_review.ts
index a19106a..d91dce1 100644
--- a/ash/webui/camera_app_ui/resources/js/views/document_review.ts
+++ b/ash/webui/camera_app_ui/resources/js/views/document_review.ts
@@ -7,6 +7,13 @@
 import * as dom from '../dom.js';
 import {Point} from '../geometry.js';
 import {I18nString} from '../i18n_string.js';
+import {
+  DocScanActionType,
+  DocScanFixType,
+  DocScanResultActionType,
+  sendDocScanEvent,
+  sendDocScanResultEvent,
+} from '../metrics.js';
 import {Filenamer} from '../models/file_namer.js';
 import {
   getBool as getLocalStorage,
@@ -19,7 +26,6 @@
 import {
   LocalStorageKey,
   MimeType,
-  Resolution,
   Rotation,
   ViewName,
 } from '../type.js';
@@ -33,7 +39,10 @@
   blob: Blob;
   corners: Point[];
   rotation: Rotation;
-  resolution: Resolution;
+}
+interface PageInternal extends Page {
+  isCornersUpdated: boolean;
+  isRotationUpdated: boolean;
 }
 
 export enum Mode {
@@ -48,7 +57,7 @@
   /**
    * Information of each pages for creating PDF files and sending metrics.
    */
-  private pages: Page[] = [];
+  private pages: PageInternal[] = [];
 
   /**
    * The sidebar element, which contains the thumbnails and delete buttons of
@@ -98,7 +107,7 @@
    * Pending payload for updating pages. Null if there isn't any pending
    * payload.
    */
-  private pendingUpdatePayload: [number, Page]|null = null;
+  private pendingUpdatePayload: [number, PageInternal]|null = null;
 
   /**
    * The function to hide the multi-page available indicator at leave. Should be
@@ -106,6 +115,12 @@
    */
   private hideMultiPageAvailableIndicator: (() => void)|null = null;
 
+  /**
+   * Count the fix times of each session (reset when page count is zero) for
+   * sending events.
+   */
+  private fixCount = 0;
+
   constructor(protected readonly resultSaver: ResultSaver) {
     super(
         ViewName.DOCUMENT_REVIEW,
@@ -131,7 +146,7 @@
       const clickOnDeleteButton =
           target.closest(`.${this.classes.delete}`) !== null;
       if (clickOnDeleteButton) {
-        await this.deletePage(index);
+        await this.onDeletePage(index);
         return;
       }
       this.selectPage(index);
@@ -139,35 +154,54 @@
 
     const fixMode = new DocumentFixMode({
       target: this.previewElement,
-      onExit: () => {
+      onDone: () => {
         this.waitForUpdatingPage(() => this.showMode(Mode.PREVIEW));
       },
       onUpdatePage: ({corners, rotation}) => {
+        const page = this.pages[this.selectedIndex];
+        const isCornersUpdated = page.isCornersUpdated ||
+            page.corners.some(
+                (oldCorner, i) => oldCorner.x !== corners[i].x ||
+                    oldCorner.y !== corners[i].y);
+        const isRotationUpdated =
+            page.isRotationUpdated || page.rotation !== rotation;
         this.updatePage(this.selectedIndex, {
-          ...this.pages[this.selectedIndex],
+          ...page,
           corners,
           rotation,
+          isCornersUpdated,
+          isRotationUpdated,
         });
       },
+      onShow: () => {
+        this.fixCount += 1;
+      },
     });
     const previewMode = new DocumentPreviewMode({
       target: this.previewElement,
       onAdd: () => {
+        sendDocScanEvent(DocScanActionType.ADD_PAGE);
         this.close();
       },
       onCancel: () => {
+        this.sendResultEvent(DocScanResultActionType.CANCEL);
         this.clearPages();
         this.close();
       },
       onFix: () => {
+        sendDocScanEvent(DocScanActionType.FIX);
         this.showMode(Mode.FIX);
       },
       onShare: () => {
+        this.sendResultEvent(DocScanResultActionType.SHARE);
         this.share(
             this.pages.length > 1 ? MimeType.PDF : MimeType.JPEG,
         );
       },
       onSave: (mimeType: MimeType.JPEG|MimeType.PDF) => {
+        this.sendResultEvent(
+            mimeType === MimeType.JPEG ? DocScanResultActionType.SAVE_AS_PHOTO :
+                                         DocScanResultActionType.SAVE_AS_PDF);
         nav.open(ViewName.FLASH);
         this.save(mimeType).then(() => this.clearPages()).finally(() => {
           this.close();
@@ -186,9 +220,14 @@
    * Adds a page to `this.pages` and updates related elements.
    */
   async addPage(page: Page): Promise<void> {
-    const croppedPage = await this.crop(page);
+    const pageInternal: PageInternal = {
+      ...page,
+      isCornersUpdated: false,
+      isRotationUpdated: false,
+    };
+    const croppedPage = await this.crop(pageInternal);
     await this.addPageView(croppedPage.blob);
-    this.pages.push(page);
+    this.pages.push(pageInternal);
     this.root.classList.toggle(this.classes.single, this.pages.length === 1);
   }
 
@@ -304,7 +343,7 @@
    * @return Promise resolves when the update is done and there isn't any
    * pending payload.
    */
-  private async updatePage(index: number, page: Page): Promise<void> {
+  private async updatePage(index: number, page: PageInternal): Promise<void> {
     this.pendingUpdatePayload = [index, page];
     if (this.updatingPage !== null) {
       return;
@@ -336,7 +375,8 @@
     }
   }
 
-  private async updatePageInternal(index: number, page: Page): Promise<void> {
+  private async updatePageInternal(index: number, page: PageInternal):
+      Promise<void> {
     const croppedPage = await this.crop(page);
     const pageElement = this.pagesElement.children[index];
     await this.updatePageView(pageElement, croppedPage.blob);
@@ -350,6 +390,20 @@
   }
 
   /**
+   * The handler called when users delete a page.
+   */
+  private async onDeletePage(index: number): Promise<void> {
+    sendDocScanEvent(DocScanActionType.DELETE_PAGE);
+    await this.deletePage(index);
+
+    if (this.pages.length === 0) {
+      // By design, this line is not reachable. If we decide to let users delete
+      // the last page later, we should close the view when no pages remain.
+      this.close();
+    }
+  }
+
+  /**
    * Deletes the page and selects the next page.
    */
   private async deletePage(index: number): Promise<void> {
@@ -359,12 +413,6 @@
         this.selectedIndex === this.pages.length ? this.pages.length - 1 :
                                                    this.selectedIndex);
     this.root.classList.toggle(this.classes.single, this.pages.length === 1);
-
-    if (this.pages.length === 0) {
-      // By design, this line is not reachable. If we decide to let users delete
-      // all pages later, we should close the view when no pages remain.
-      this.close();
-    }
   }
 
   private deletePageView(index: number): void {
@@ -415,7 +463,7 @@
     this.pagesElement.replaceChildren();
   }
 
-  private async crop(page: Page): Promise<Page> {
+  private async crop(page: PageInternal): Promise<PageInternal> {
     const {blob, corners, rotation} = page;
     const newBlob = await ChromeHelper.getInstance().convertToDocument(
         blob, corners, rotation, MimeType.JPEG);
@@ -445,6 +493,9 @@
   protected override leaving(): boolean {
     this.hideMultiPageAvailableIndicator?.();
     this.hideMultiPageAvailableIndicator = null;
+    if (this.pages.length === 0) {
+      this.fixCount = 0;
+    }
     return true;
   }
 
@@ -468,7 +519,7 @@
       this.selectPage(index);
       return true;
     } else if (key === 'Delete') {
-      this.deletePage(this.selectedIndex);
+      this.onDeletePage(this.selectedIndex);
       return true;
     }
     return false;
@@ -486,4 +537,17 @@
     }
     super.setUnfocusable();
   }
+
+  private sendResultEvent(action: DocScanResultActionType) {
+    const isCornersUpdated = this.pages.some((page) => page.isCornersUpdated);
+    const isRotationUpdated = this.pages.some((page) => page.isRotationUpdated);
+    let fixType = DocScanFixType.NONE;
+    if (isCornersUpdated) {
+      fixType |= DocScanFixType.CORNER;
+    }
+    if (isRotationUpdated) {
+      fixType |= DocScanFixType.ROTATION;
+    }
+    return sendDocScanResultEvent(action, fixType, this.fixCount);
+  }
 }
diff --git a/base/allocator/partition_allocator/address_pool_manager.h b/base/allocator/partition_allocator/address_pool_manager.h
index ff7c5a1..ba6bdb80 100644
--- a/base/allocator/partition_allocator/address_pool_manager.h
+++ b/base/allocator/partition_allocator/address_pool_manager.h
@@ -65,12 +65,12 @@
   uintptr_t GetPoolBaseAddress(pool_handle handle);
 #endif
 
-  // Reserves address space from GigaCage.
+  // Reserves address space from the pool.
   uintptr_t Reserve(pool_handle handle,
                     uintptr_t requested_address,
                     size_t length);
 
-  // Frees address space back to GigaCage and decommits underlying system pages.
+  // Frees address space back to the pool and decommits underlying system pages.
   void UnreserveAndDecommit(pool_handle handle,
                             uintptr_t address,
                             size_t length);
diff --git a/base/allocator/partition_allocator/address_pool_manager_bitmap.h b/base/allocator/partition_allocator/address_pool_manager_bitmap.h
index 489cf075..0aa51ce 100644
--- a/base/allocator/partition_allocator/address_pool_manager_bitmap.h
+++ b/base/allocator/partition_allocator/address_pool_manager_bitmap.h
@@ -111,17 +111,17 @@
 
   static bool IsAllowedSuperPageForBRPPool(uintptr_t address) {
     // The only potentially dangerous scenario, in which this check is used, is
-    // when the assignment of the first raw_ptr<T> object for a non-GigaCage
-    // address is racing with the allocation of a new GigCage super-page at the
-    // same address. We assume that if raw_ptr<T> is being initialized with a
-    // raw pointer, the associated allocation is "alive"; otherwise, the issue
-    // should be fixed by rewriting the raw pointer variable as raw_ptr<T>.
-    // In the worst case, when such a fix is impossible, we should just undo the
-    // raw pointer -> raw_ptr<T> rewrite of the problematic field. If the
-    // above assumption holds, the existing allocation will prevent us from
-    // reserving the super-page region and, thus, having the race condition.
-    // Since we rely on that external synchronization, the relaxed memory
-    // ordering should be sufficient.
+    // when the assignment of the first raw_ptr<T> object for an address
+    // allocated outside the BRP pool is racing with the allocation of a new
+    // super page at the same address. We assume that if raw_ptr<T> is being
+    // initialized with a raw pointer, the associated allocation is "alive";
+    // otherwise, the issue should be fixed by rewriting the raw pointer
+    // variable as raw_ptr<T>. In the worst case, when such a fix is
+    // impossible, we should just undo the raw pointer -> raw_ptr<T> rewrite of
+    // the problematic field. If the above assumption holds, the existing
+    // allocation will prevent us from reserving the super-page region and,
+    // thus, having the race condition.  Since we rely on that external
+    // synchronization, the relaxed memory ordering should be sufficient.
     return !brp_forbidden_super_page_map_[address >> kSuperPageShift].load(
         std::memory_order_relaxed);
   }
diff --git a/base/allocator/partition_allocator/address_space_stats.h b/base/allocator/partition_allocator/address_space_stats.h
index 6f3192b..a0d10603 100644
--- a/base/allocator/partition_allocator/address_space_stats.h
+++ b/base/allocator/partition_allocator/address_space_stats.h
@@ -17,7 +17,7 @@
 struct PoolStats {
   size_t usage = 0;
 
-  // On 32-bit, GigaCage is mainly a logical entity, intermingled with
+  // On 32-bit, pools are mainly logical entities, intermingled with
   // allocations not managed by PartitionAlloc. The "largest available
   // reservation" is not possible to measure in that case.
 #if defined(PA_HAS_64_BITS_POINTERS)
diff --git a/base/allocator/partition_allocator/glossary.md b/base/allocator/partition_allocator/glossary.md
index 5dd37bf..ca18a1e7 100644
--- a/base/allocator/partition_allocator/glossary.md
+++ b/base/allocator/partition_allocator/glossary.md
@@ -89,18 +89,23 @@
   holds some not-too-large memory chunks, ready to be allocated. This
   speeds up in-thread allocation by reducing a lock hold to a
   thread-local storage lookup, improving cache locality.
-* **GigaCage**: A memory region several gigabytes wide, reserved by
-  PartitionAlloc upon initialization, from which all allocations are
-  taken. The motivation for GigaCage is for code to be able to examine
-  a pointer and to immediately determine whether or not the memory was
-  allocated by PartitionAlloc. This provides support for a number of
-  features, including
-  [StarScan][starscan-readme] and
-  [BackupRefPtr][brp-doc].
-  * Note that GigaCage only exists in builds with 64-bit pointers.
-  * In builds with 32-bit pointers, PartitionAlloc tracks pointers
-    it dispenses with a bitmap. This is often referred to as "fake
-    GigaCage" (or simply "GigaCage") for lack of a better term.
+* **Pool**: A large (and contiguous on 64-bit)  memory region, housing
+  super pages, etc. from which PartitionAlloc services allocations. The
+  primary purpose of the pools is to provide a fast answer to the
+  question, "Did PartitionAlloc allocate the memory for this pointer
+  from this pool?" with a single bit-masking operation.
+  * The regular pool contains all non-BackupRefPtr allocations.
+  * The BRP pool contains all the BRP allocations.
+  * Pools are downgraded into a logical concept in 32-bit environments,
+    tracking a non-contiguous set of allocations using a bitmap.
+
+*** promo
+A third pool is provided in 64-bit environments. It is generically
+named the "configurable" pool, because its primary user (the
+[V8 Sandbox][v8-sandbox]) can configure it at runtime, providing a
+pre-existing mapping.
+***
+
 * **Payload**: The usable area of a super page in which slot spans
   reside. While generally this means "everything between the first
   and last guard partition pages in a super page," the presence of
@@ -124,6 +129,19 @@
 statements etc.), or something as costly as system calls.
 ***
 
+## Legacy Terms
+
+These terms are (mostly) deprecated and should not be used. They are
+surfaced here to provide a ready reference for readers coming from
+older design documents or documentation.
+
+* **GigaCage**: A memory region several gigabytes wide, reserved by
+  PartitionAlloc upon initialization, from which nearly all allocations
+  are taken. _Pools_ have overtaken GigaCage in conceptual importance,
+  and so and so there is less need today to refer to "GigaCage" or the
+  "cage." This is especially true given the V8 Sandbox and the
+  configurable pool (see above).
+
 ## PartitionAlloc-Everywhere
 
 Originally, PartitionAlloc was used only in Blink (Chromium's rendering engine).
@@ -153,5 +171,4 @@
 
 [max-bucket-comment]: https://source.chromium.org/chromium/chromium/src/+/main:base/allocator/partition_allocator/partition_alloc_constants.h;l=345;drc=667e6b001f438521e1c1a1bc3eabeead7aaa1f37
 [pa-thread-cache]: https://source.chromium.org/chromium/chromium/src/+/main:base/allocator/partition_allocator/thread_cache.h
-[starscan-readme]: https://chromium.googlesource.com/chromium/src/+/main/base/allocator/partition_allocator/starscan/README.md
-[brp-doc]: https://docs.google.com/document/d/1m0c63vXXLyGtIGBi9v6YFANum7-IRC3-dmiYBCWqkMk/preview
+[v8-sandbox]: https://docs.google.com/document/d/1FM4fQmIhEqPG8uGp5o9A-mnPB5BOeScZYpkHjo0KKA8/preview#
diff --git a/base/allocator/partition_allocator/page_allocator.h b/base/allocator/partition_allocator/page_allocator.h
index ebefb55d..8b15b1b 100644
--- a/base/allocator/partition_allocator/page_allocator.h
+++ b/base/allocator/partition_allocator/page_allocator.h
@@ -79,7 +79,7 @@
 // allocation. Use PageTag::kChromium as a catch-all category.
 //
 // |file_descriptor_for_shared_alloc| is only used in mapping the shadow
-// GigaCage to the same physical address as the real one in
+// pools to the same physical address as the real one in
 // PartitionAddressSpace::Init(). It should be ignored in other cases.
 //
 // This call will return 0/nullptr if the allocation cannot be satisfied.
diff --git a/base/allocator/partition_allocator/partition_alloc_constants.h b/base/allocator/partition_allocator/partition_alloc_constants.h
index 1d984a1..35924fa 100644
--- a/base/allocator/partition_allocator/partition_alloc_constants.h
+++ b/base/allocator/partition_allocator/partition_alloc_constants.h
@@ -259,18 +259,18 @@
 constexpr size_t kSuperPageOffsetMask = kSuperPageAlignment - 1;
 constexpr size_t kSuperPageBaseMask = ~kSuperPageOffsetMask;
 
-// GigaCage is generally split into two pools, one which supports BackupRefPtr
-// (BRP) and one that doesn't.
+// PartitionAlloc's address space is primarily split into two pools.
+// See `glossary.md`.
 #if defined(PA_HAS_64_BITS_POINTERS)
 // The 3rd, Configurable Pool is only available in 64-bit mode.
 constexpr size_t kNumPools = 3;
-// Maximum GigaCage pool size. With exception of Configurable Pool, it is also
+// Maximum pool size. With exception of Configurable Pool, it is also
 // the actual size, unless PA_USE_DYNAMICALLY_SIZED_GIGA_CAGE is set, which
 // allows to choose a different size at initialization time for certain
 // configurations.
 //
 // Special-case Android and iOS, which incur test failures with larger
-// GigaCage. Regardless, allocating >8GiB with malloc() on these platforms is
+// pools. Regardless, allocating >8GiB with malloc() on these platforms is
 // unrealistic as of 2022.
 #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
 constexpr size_t kPoolMaxSize = 8 * kGiB;
@@ -318,7 +318,7 @@
 
 #if defined(PA_HAS_64_BITS_POINTERS)
 // In 64-bit mode, the direct map allocation granularity is super page size,
-// because this is the reservation granularity of the GigaCage.
+// because this is the reservation granularity of the pools.
 constexpr PA_ALWAYS_INLINE size_t DirectMapAllocationGranularity() {
   return kSuperPageSize;
 }
@@ -329,7 +329,7 @@
 #else   // defined(PA_HAS_64_BITS_POINTERS)
 // In 32-bit mode, address space is space is a scarce resource. Use the system
 // allocation granularity, which is the lowest possible address space allocation
-// unit. However, don't go below partition page size, so that GigaCage bitmaps
+// unit. However, don't go below partition page size, so that pool bitmaps
 // don't get too large. See kBytesPer1BitOfBRPPoolBitmap.
 PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR PA_ALWAYS_INLINE size_t
 DirectMapAllocationGranularity() {
diff --git a/base/allocator/partition_allocator/partition_page.cc b/base/allocator/partition_allocator/partition_page.cc
index 6ad1afc..e93b1f61 100644
--- a/base/allocator/partition_allocator/partition_page.cc
+++ b/base/allocator/partition_allocator/partition_page.cc
@@ -73,7 +73,7 @@
   // This can create a fake "address space exhaustion" OOM, in the case where
   // e.g. a large allocation is freed on a thread, and another large one is made
   // from another *before* UnmapNow() has finished running. In this case the
-  // second one may not find enough space in the GigaCage, and fail. This is
+  // second one may not find enough space in the pool, and fail. This is
   // expected to be very rare though, and likely preferable to holding the lock
   // while releasing the address space.
   ScopedUnlockGuard unlock{root->lock_};
diff --git a/base/allocator/partition_allocator/partition_root.cc b/base/allocator/partition_allocator/partition_root.cc
index ab9fbf1..3627a130 100644
--- a/base/allocator/partition_allocator/partition_root.cc
+++ b/base/allocator/partition_allocator/partition_root.cc
@@ -678,7 +678,7 @@
 #endif  // #if !defined(ARCH_CPU_64_BITS)
 
   // Out of memory can be due to multiple causes, such as:
-  // - Out of GigaCage virtual address space
+  // - Out of virtual address space in the desired pool
   // - Out of commit due to either our process, or another one
   // - Excessive allocations in the current process
   //
diff --git a/base/allocator/partition_allocator/partition_root.h b/base/allocator/partition_allocator/partition_root.h
index 9712f6a..103b09283 100644
--- a/base/allocator/partition_allocator/partition_root.h
+++ b/base/allocator/partition_allocator/partition_root.h
@@ -389,10 +389,10 @@
   explicit PartitionRoot(PartitionOptions opts) : flags() { Init(opts); }
   ~PartitionRoot();
 
-  // This will unreserve any space in the GigaCage that the PartitionRoot is
+  // This will unreserve any space in the pool that the PartitionRoot is
   // using. This is needed because many tests create and destroy many
   // PartitionRoots over the lifetime of a process, which can exhaust the
-  // GigaCage and cause tests to fail.
+  // pool and cause tests to fail.
   void DestructForTesting();
 
 #if defined(PA_ENABLE_MAC11_MALLOC_SIZE_HACK)
@@ -1195,7 +1195,7 @@
   uintptr_t object_addr = internal::ObjectPtr2Addr(object);
 
   // On Android, malloc() interception is more fragile than on other
-  // platforms, as we use wrapped symbols. However, the GigaCage allows us to
+  // platforms, as we use wrapped symbols. However, the pools allow us to
   // quickly tell that a pointer was allocated with PartitionAlloc.
   //
   // This is a crash to detect imperfect symbol interception. However, we can
diff --git a/base/allocator/partition_allocator/reservation_offset_table.h b/base/allocator/partition_allocator/reservation_offset_table.h
index 91f6e83..530fe67 100644
--- a/base/allocator/partition_allocator/reservation_offset_table.h
+++ b/base/allocator/partition_allocator/reservation_offset_table.h
@@ -60,10 +60,10 @@
 //
 // *) In 32-bit mode, Y is not used by PartitionAlloc, and cannot be used
 //    until X is unreserved, because PartitionAlloc always uses kSuperPageSize
-//    alignment when reserving address spaces. One can use "GigaCage" to
-//    further determine which part of the supe page is used by PartitionAlloc.
-//    This isn't a problem in 64-bit mode, where allocation granularity is
-//    kSuperPageSize.
+//    alignment when reserving address spaces. One can use check "is in pool?"
+//    to further determine which part of the super page is used by
+//    PartitionAlloc. This isn't a problem in 64-bit mode, where allocation
+//    granularity is kSuperPageSize.
 class PA_COMPONENT_EXPORT(PARTITION_ALLOC) ReservationOffsetTable {
  public:
 #if defined(PA_HAS_64_BITS_POINTERS)
diff --git a/base/allocator/partition_allocator/starscan/pcscan_internal.cc b/base/allocator/partition_allocator/starscan/pcscan_internal.cc
index 7f69967..69d965c 100644
--- a/base/allocator/partition_allocator/starscan/pcscan_internal.cc
+++ b/base/allocator/partition_allocator/starscan/pcscan_internal.cc
@@ -1274,7 +1274,7 @@
 void PCScanInternal::Initialize(PCScan::InitConfig config) {
   PA_DCHECK(!is_initialized_);
 #if defined(PA_HAS_64_BITS_POINTERS)
-  // Make sure that GigaCage is initialized.
+  // Make sure that pools are initialized.
   PartitionAddressSpace::Init();
 #endif
   CommitCardTable();
diff --git a/base/allocator/partition_allocator/starscan/pcscan_unittest.cc b/base/allocator/partition_allocator/starscan/pcscan_unittest.cc
index 785fa34..77610ab5b 100644
--- a/base/allocator/partition_allocator/starscan/pcscan_unittest.cc
+++ b/base/allocator/partition_allocator/starscan/pcscan_unittest.cc
@@ -46,7 +46,7 @@
  public:
   PartitionAllocPCScanTestBase() {
     PartitionAllocGlobalInit([](size_t) { PA_LOG(FATAL) << "Out of memory"; });
-    // Previous test runs within the same process decommit GigaCage, therefore
+    // Previous test runs within the same process decommit pools, therefore
     // we need to make sure that the card table is recommitted for each run.
     PCScan::ReinitForTesting(
         {PCScan::InitConfig::WantedWriteProtectionMode::kDisabled,
diff --git a/base/allocator/partition_allocator/starscan/write_protector.cc b/base/allocator/partition_allocator/starscan/write_protector.cc
index dcb8f13..e6bb912 100644
--- a/base/allocator/partition_allocator/starscan/write_protector.cc
+++ b/base/allocator/partition_allocator/starscan/write_protector.cc
@@ -77,7 +77,7 @@
   PA_CHECK(-1 != ioctl(uffd_, UFFDIO_API, &uffdio_api));
   PA_CHECK(UFFD_API == uffdio_api.api);
 
-  // Register the giga-cage to listen uffd events.
+  // Register the regular pool to listen uffd events.
   struct uffdio_register uffdio_register;
   uffdio_register.range.start = PartitionAddressSpace::RegularPoolBase();
   uffdio_register.range.len = kPoolMaxSize;
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1
index 259b8e69..04ac2c6 100644
--- a/build/fuchsia/linux_internal.sdk.sha1
+++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@
-9.20221001.0.1
+9.20221003.0.1
diff --git a/buildtools/deps_revisions.gni b/buildtools/deps_revisions.gni
index 6a28432..10fd90e2 100644
--- a/buildtools/deps_revisions.gni
+++ b/buildtools/deps_revisions.gni
@@ -5,5 +5,5 @@
 declare_args() {
   # Used to cause full rebuilds on libc++ rolls. This should be kept in sync
   # with the libcxx_revision vars in //DEPS.
-  libcxx_revision = "591c99193d353c17b694d1692db75630082525b9"
+  libcxx_revision = "2e919977e0030ce61bd19c40cefe31b995f1e2d4"
 }
diff --git a/cc/metrics/event_latency_tracing_recorder.cc b/cc/metrics/event_latency_tracing_recorder.cc
index e2ac7b1..0b0c4be 100644
--- a/cc/metrics/event_latency_tracing_recorder.cc
+++ b/cc/metrics/event_latency_tracing_recorder.cc
@@ -126,7 +126,10 @@
             kSubmitCompositorFrameToPresentationCompositorFrame:
           return "RendererCompositorFinishedToSubmitCompositorFrame";
         default:
-          NOTREACHED();
+          // TODO(crbug.com/1366253): Logs are added to debug NOTREACHED() begin
+          // hit in crbug/1366253. Remove after investigation is finished.
+          NOTREACHED() << "Invalid CC stage after compositor thread: "
+                       << static_cast<int>(compositor_stage);
           return "";
       }
     case EventMetrics::DispatchStage::kRendererMainFinished:
@@ -149,7 +152,10 @@
             kSubmitCompositorFrameToPresentationCompositorFrame:
           return "RendererMainFinishedToSubmitCompositorFrame";
         default:
-          NOTREACHED();
+          // TODO(crbug.com/1366253): Logs are added to debug NOTREACHED() begin
+          // hit in crbug/1366253. Remove after investigation is finished.
+          NOTREACHED() << "Invalid CC stage after main thread: "
+                       << static_cast<int>(compositor_stage);
           return "";
       }
     default:
diff --git a/chrome/VERSION b/chrome/VERSION
index c5fced0d..6f060c31 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=108
 MINOR=0
-BUILD=5335
+BUILD=5338
 PATCH=0
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index 247dd12..d5ae2f3 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-107.0.5301.0_rc-r2-merged.afdo.bz2
+chromeos-chrome-amd64-107.0.5304.21_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/resources/chromium_strings_eu.xtb b/chrome/app/resources/chromium_strings_eu.xtb
index 9c2d967..28b842ed 100644
--- a/chrome/app/resources/chromium_strings_eu.xtb
+++ b/chrome/app/resources/chromium_strings_eu.xtb
@@ -263,7 +263,7 @@
 <translation id="6863361426438995919">Google Pay (Chromium-en kopiatu da)</translation>
 <translation id="6873893289264747459">"<ph name="EXTENSION_NAME" />" elementuak malwarea duela hauteman du Chromium-ek</translation>
 <translation id="6893813176749746474">Chromium eguneratu da baina ez duzu erabili 30 egunetan gutxienez.</translation>
-<translation id="691026815377248078">Chromium-ek Bluetooth-a erabiltzeko baimena behar du parekatzen jarraitzeko. <ph name="IDS_BLUETOOTH_DEVICE_CHOOSER_AUTHORIZE_BLUETOOTH_LINK" /></translation>
+<translation id="691026815377248078">Chromium-ek Bluetootha erabiltzeko baimena behar du parekatzen jarraitzeko. <ph name="IDS_BLUETOOTH_DEVICE_CHOOSER_AUTHORIZE_BLUETOOTH_LINK" /></translation>
 <translation id="6929417474050522668">Probak abian diren bitartean, iragarkien neurketari esker, bisitatzen dituzun webguneek Chromium-i informazioa eska diezaiokete. Informazio horren bidez, webguneek beren iragarkien errendimendua neur dezakete. Webguneen artean ahalik eta informazio gutxien transferituta mugatzen du iragarkien neurketak webguneen arteko jarraipena.</translation>
 <translation id="6940431691900807093">Beranduago, bisitatzen duzun webgune batek zure interesak ikusteko eska diezaioke Chromium-i, agertzen zaizkizun iragarkiak pertsonalizatze aldera. Chromium-ek hiru interes parteka ditzake gehienez.</translation>
 <translation id="6964305034639999644">Ireki esteka Chromium-eko &amp;ezkutuko moduko leiho batean</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index d0e877c2..8acd3a7 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -71,6 +71,7 @@
 <translation id="1067661089446014701">Øg sikkerheden ved at kryptere adgangskoder på din enhed, før de gemmes på din Google-konto</translation>
 <translation id="1067922213147265141">Andre Google-tjenester</translation>
 <translation id="1069355737714877171">Fjern eSIM-profilen ved navn <ph name="PROFILE_NAME" /></translation>
+<translation id="1069814191880976658">Vælg en anden skærm</translation>
 <translation id="1070377999570795893">Et andet program på din computer har tilføjet en udvidelse, som kan ændre måden, Chrome fungerer på.
 
 <ph name="EXTENSION_NAME" /></translation>
@@ -229,6 +230,7 @@
 <translation id="120069043972472860">Meget dårlig</translation>
 <translation id="1201402288615127009">Næste</translation>
 <translation id="1201564082781748151">Lokale data kan gendannes, hvis du glemmer din adgangskode</translation>
+<translation id="1202116106683864634">Er du sikker på, at du vil slette denne adgangsnøgle?</translation>
 <translation id="1202596434010270079">Terminalappen er blevet opdateret. Fjern USB-stikket.</translation>
 <translation id="120368089816228251">Musiknode</translation>
 <translation id="1203942045716040624">Shared Worker: <ph name="SCRIPT_URL" /></translation>
@@ -252,6 +254,7 @@
 <translation id="1223853788495130632">Din administrator anbefaler en bestemt værdi for denne indstilling.</translation>
 <translation id="1225177025209879837">Behandler anmodning...</translation>
 <translation id="1227507814927581609">Godkendelsen mislykkedes under oprettelse af forbindelse til "<ph name="DEVICE_NAME" />".</translation>
+<translation id="1227660082540388410">Rediger adgangsnøgle</translation>
 <translation id="1227993798763400520">Det lykkedes ikke at caste – prøv igen</translation>
 <translation id="1230417814058465809">Standardbeskyttelse er aktiveret. Du kan øge sikkerheden ved at bruge forbedret beskyttelse.</translation>
 <translation id="1231733316453485619">Vil du aktivere synkronisering?</translation>
@@ -780,6 +783,7 @@
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Oprindelig)</translation>
 <translation id="1709217939274742847">Vælg en billet, som du vil bruge til godkendelse. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation>
 <translation id="1709762881904163296">Netværksindstillinger</translation>
+<translation id="1709916727352927457">Slet adgangsnøgle</translation>
 <translation id="1709972045049031556">Delingen lykkedes ikke</translation>
 <translation id="1711935594505774770">Denne handling rydder alle de data og cookies, der er gemt af <ph name="SITE_GROUP_NAME" />, eventuelle websites i denne gruppe og de apps, den har installeret</translation>
 <translation id="1714644264617423774">Aktivér hjælpefunktioner for at gøre din enhed nemmere at bruge. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation>
@@ -1107,6 +1111,7 @@
 <translation id="2007404777272201486">Rapportér et problem...</translation>
 <translation id="2009590708342941694">Emojiværktøj</translation>
 <translation id="2010501376126504057">Kompatible enheder</translation>
+<translation id="2010888903612390044">Der er ikke tilsluttet nogen mikrofon</translation>
 <translation id="2015232545623037616">Computer og Chromecast er på samme Wi-Fi-netværk</translation>
 <translation id="2016473077102413275">Funktioner, der skal bruge billeder, fungerer ikke</translation>
 <translation id="2016574333161572915">Din Google Meet-hardware er klar til konfiguration</translation>
@@ -3043,6 +3048,7 @@
 <translation id="3813296892522778813">Gå til <ph name="BEGIN_LINK_CHROMIUM" />Hjælp til Google Chrome<ph name="END_LINK_CHROMIUM" />, hvis du ikke kan finde det, du leder efter.</translation>
 <translation id="3813358687923336574">Sprog, der bruges til oversættelse af sider og Hurtig info</translation>
 <translation id="3814529970604306954">Skolekonto</translation>
+<translation id="3814792775883886759">Der er ikke tilsluttet noget kamera</translation>
 <translation id="3816118180265633665">Chrome-farver</translation>
 <translation id="3817524650114746564">Åbn computerens proxyindstillinger</translation>
 <translation id="3819164369574292143">Zoom ind for at forstørre elementer på skærmen. Brug søgetasten+Ctrl+M til at aktivere eller deaktivere luppen. Brug Ctrl+Alt+piletasterne til at bevæge dig rundt på skærmen, når der er zoomet ind.</translation>
@@ -4289,6 +4295,7 @@
 <translation id="5017643436812738274">Du kan navigere på sider med en tekstmarkør. Tryk på Ctrl+søgetasten+7 for at deaktivere.</translation>
 <translation id="5018207570537526145">Åbn udvidelsens website</translation>
 <translation id="5018526990965779848">Send brugs- og diagnosticeringsdata. Hjælp med at forbedre din Android-oplevelse ved automatisk at sende diagnosticerings- og enhedsdata samt data om brug af apps til Google. Dataene bruges til forbedring af bl.a. systemets og appens stabilitet. Visse samlede data hjælper også Google-apps og -partnere, f.eks. Android-udviklere. Hvis indstillingen for yderligere web- og appaktivitet er aktiveret, gemmes disse data muligvis på din Google-konto.</translation>
+<translation id="5020008942039547742">Vælg et andet vindue</translation>
 <translation id="5021750053540820849">Endnu ikke opdateret</translation>
 <translation id="5024511550058813796">Din historik er på alle synkroniserede enheder, så du kan fortsætte med det, du var i gang med</translation>
 <translation id="5026492829171796515">Log ind for at tilføje en Google-konto</translation>
@@ -4515,6 +4522,7 @@
 <translation id="5252653240322147470">Pinkoden skal være mindre end <ph name="MAXIMUM" /> tegn</translation>
 <translation id="5254368820972107711">Vis de filer, der skal slettes</translation>
 <translation id="52550593576409946">Terminalapplikationen kunne ikke startes.</translation>
+<translation id="5255726914791076208">Din <ph name="RP_ID" />-konto ændres ikke, når du redigerer din adgangsnøgle</translation>
 <translation id="5255859108402770436">Log ind igen</translation>
 <translation id="52566111838498928">Indlæser skrifttyper...</translation>
 <translation id="5256861893479663409">På alle websites</translation>
@@ -6055,6 +6063,7 @@
 <translation id="672609503628871915">Se de nye funktioner</translation>
 <translation id="67269783048918309">Send brugs- og diagnosticeringsdata. Denne enhed sender i øjeblikket automatisk diagnosticerings- og enhedsdata samt data om brug af apps til Google. Disse data bruges ikke til at identificere dit barn. De bruges kun til forbedring af bl.a. systemets og appens stabilitet. Visse samlede data hjælper også Google-apps og -partnere, f.eks. Android-udviklere. Denne <ph name="BEGIN_LINK1" />indstilling<ph name="END_LINK1" /> håndhæves af ejeren. Hvis indstillingen til yderligere web- og appaktivitet er aktiveret for dit barn, gemmes disse data muligvis på barnets Google-konto. <ph name="BEGIN_LINK2" />Få flere oplysninger<ph name="END_LINK2" /></translation>
 <translation id="6727969043791803658">Tilsluttet, <ph name="BATTERY_PERCENTAGE" /> % batteri</translation>
+<translation id="6729192290958770680">Angiv dit brugernavn</translation>
 <translation id="6731320427842222405">Dette kan tage et par minutter</translation>
 <translation id="6733620523445262364">"<ph name="BOOKMARK_TITLE" />" blev oprettet.</translation>
 <translation id="6735304988756581115">Vis cookies og andre websitedata...</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb
index aab42a9c..42ab220d 100644
--- a/chrome/app/resources/generated_resources_eu.xtb
+++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -117,7 +117,7 @@
 <translation id="1108938384783527433">Historiaren sinkronizazioa</translation>
 <translation id="1110155001042129815">Itxaron</translation>
 <translation id="1110965959145884739">Aukeratu gailuan instalatu nahi dituzun hizkuntza-paketeak. Erabiltzaileek hizkuntza-fitxategiak partekatzen dituzte, diskoko tokia aurrezteko. <ph name="BEGIN_LINK_LEARN_MORE" />Lortu informazio gehiago<ph name="END_LINK_LEARN_MORE" /></translation>
-<translation id="1112420131909513020">Atzeko planoko fitxa bat Bluetooth-a erabiltzen ari da</translation>
+<translation id="1112420131909513020">Atzeko planoko fitxa bat Bluetootha erabiltzen ari da</translation>
 <translation id="1114102982691049955"><ph name="PRINTER_MANUFACTURER" /> <ph name="PRINTER_MODEL" /> (USB)</translation>
 <translation id="1114202307280046356">Diamantea</translation>
 <translation id="1114427165525619358">Gailu honetan eta Google-ko kontuan gordetako pasahitzak</translation>
@@ -513,7 +513,7 @@
 <translation id="1482626744466814421">Egin fitxa honen laster-marka…</translation>
 <translation id="1482772681918035149">pasahitzak editatu nahi ditu</translation>
 <translation id="1483493594462132177">Bidali</translation>
-<translation id="1484979925941077974">Webgunea Bluetooth-a erabiltzen ari da</translation>
+<translation id="1484979925941077974">Webgunea Bluetootha erabiltzen ari da</translation>
 <translation id="1485015260175968628">Hau egin dezake:</translation>
 <translation id="1485141095922496924">Bertsioa: <ph name="PRODUCT_VERSION" /> (<ph name="PRODUCT_CHANNEL" />) <ph name="PRODUCT_MODIFIER" /> <ph name="PRODUCT_VERSION_BITS" /></translation>
 <translation id="1486096554574027028">Bilatu pasahitza</translation>
@@ -628,7 +628,7 @@
 <translation id="1593926297800505364">Gorde ordainketa-metodoa</translation>
 <translation id="1595492813686795610">Bertsio-berritzen ari da Linux</translation>
 <translation id="1596286373007273895">Erabilgarri</translation>
-<translation id="1596709061955594992">Bluetooth-a desaktibatuta dago. Aktiba ezazu gailu erabilgarriak ikusteko.</translation>
+<translation id="1596709061955594992">Bluetootha desaktibatuta dago. Aktiba ezazu gailu erabilgarriak ikusteko.</translation>
 <translation id="1598233202702788831">Administratzaileak desgaitu ditu eguneratzeak.</translation>
 <translation id="1600857548979126453">Atzitu orriaren araztailearen backenda</translation>
 <translation id="1601560923496285236">Aplikatu</translation>
@@ -697,9 +697,9 @@
 <translation id="1642492862748815878"><ph name="DEVICE" /> gailura eta Bluetooth bidezko beste <ph name="NUMBER_OF_DEVICES" /> gailutara konektatuta</translation>
 <translation id="1642494467033190216">rootfs bidezko babesa kendu eta gailua berriro abiarazi behar duzu beste arazketa-eginbide batzuk gaitzeko.</translation>
 <translation id="1643072738649235303">SHA-1 ziurtagiria duen X9.62 ECDSA sinadura</translation>
-<translation id="1643921258693943800">Nearby Share erabiltzeko, aktibatu Bluetooth-a eta wifia</translation>
+<translation id="1643921258693943800">Nearby Share erabiltzeko, aktibatu Bluetootha eta wifia</translation>
 <translation id="1644574205037202324">Historia</translation>
-<translation id="1644852018355792105">Idatzi <ph name="DEVICE" /> gailuaren Bluetooth-aren pasakodea</translation>
+<translation id="1644852018355792105">Idatzi <ph name="DEVICE" /> gailuaren Bluetootharen pasakodea</translation>
 <translation id="1645004815457365098">Iturburu ezezaguna</translation>
 <translation id="1645516838734033527"><ph name="DEVICE_TYPE" /> gailua seguru mantentzeko, telefonoan pantailaren blokeoa erabiltzea eskatzen du Smart Lock zerbitzuak.</translation>
 <translation id="1646982517418478057">Ziurtagiri hau enkriptatzeko, idatzi pasahitz bat</translation>
@@ -1026,7 +1026,7 @@
 <translation id="1936157145127842922">Erakutsi karpetan</translation>
 <translation id="1936931585862840749">Zehaztu kopia kopurua (1-<ph name="MAX_COPIES" />).</translation>
 <translation id="1937774647013465102">Gailu honekin (<ph name="ARCHITECTURE_DEVICE" />) ezin da inportatu edukiontziaren <ph name="ARCHITECTURE_CONTAINER" /> arkitektura mota. Saiatu edukiontzia beste gailu batean leheneratzen edo erabili Fitxategiak aplikazioa edukiontzi-irudi honen barnean dauden fitxategiak atzitzeko.</translation>
-<translation id="1938320257168860255">Arazoren bat izan da. Ziurtatu telefonoa hurbil eta desblokeatuta dagoela, eta Bluetooth-a eta wifia aktibatuta dauzkala.</translation>
+<translation id="1938320257168860255">Arazoren bat izan da. Ziurtatu telefonoa hurbil eta desblokeatuta dagoela, eta Bluetootha eta wifia aktibatuta dauzkala.</translation>
 <translation id="1938351510777341717">Kanpoko Komandoa tekla</translation>
 <translation id="1940546824932169984">Konektatutako gailuak</translation>
 <translation id="1941410638996203291">Hasiera-ordua: <ph name="TIME" /></translation>
@@ -1081,7 +1081,7 @@
 <translation id="1992924914582925289">Kendu gailutik</translation>
 <translation id="1994173015038366702">Webgunearen URLa</translation>
 <translation id="1995916364271252349">Webguneek erabili eta erakuts dezaketen informazioa kontrolatzen du (kokapena, kamera, leiho gainerakorrak eta beste)</translation>
-<translation id="1997433994358798851">Chrome-k Bluetooth-a erabiltzeko baimena behar du gailura konektatze aldera</translation>
+<translation id="1997433994358798851">Chrome-k Bluetootha erabiltzeko baimena behar du gailura konektatze aldera</translation>
 <translation id="1997616988432401742">Zure ziurtagiriak</translation>
 <translation id="1999115740519098545">Abioan</translation>
 <translation id="2000419248597011803">Helbide-barrako zein bilaketa-koadroko bilaketak eta cookie batzuk bidaltzen ditu bilatzaile lehenetsira</translation>
@@ -1112,7 +1112,7 @@
 <translation id="2030455719695904263">Ukipen-panela</translation>
 <translation id="2031639749079821948">Google-ko kontuan gordeta dago pasahitza</translation>
 <translation id="2031914984822377766">Gehitu <ph name="LINK_BEGIN" />webguneetarako hizkuntza<ph name="LINK_END" /> lehenetsiak. Zerrendako lehen hizkuntza erabiliko da itzulpenetan.</translation>
-<translation id="2033758234986231162">Ezin da mantendu gailua telefonoarekin konektatuta. Ziurtatu telefonoa hurbil eta desblokeatuta dagoela, eta Bluetooth-a eta wifia aktibatuta dauzkala.</translation>
+<translation id="2033758234986231162">Ezin da mantendu gailua telefonoarekin konektatuta. Ziurtatu telefonoa hurbil eta desblokeatuta dagoela, eta Bluetootha eta wifia aktibatuta dauzkala.</translation>
 <translation id="2034346955588403444">Gehitu beste wifi-sare bat</translation>
 <translation id="2035211704574173780">Gris-eskala</translation>
 <translation id="203574396658008164">Gaitu pantaila blokeatutik oharrak idazteko aukera</translation>
@@ -1372,7 +1372,7 @@
 <translation id="2263679799334060788">Asko eskertzen dizugu iritzia ematea, Google Cast hobetzeko erabiltzen baitugu. Igortzeko arazoak konpontzeko laguntza nahi baduzu, joan <ph name="BEGIN_LINK" />laguntza-zentrora<ph name="END_LINK" />.</translation>
 <translation id="22665427234727190">Eskatu nire baimena webguneren batek Bluetooth bidezko gailuak atzitu nahi dituenean (gomendatua)</translation>
 <translation id="2266957463645820432">USB bidezko IPP protokoloa (IPPUSB)</translation>
-<translation id="2268130516524549846">Bluetooth-a desgaituta dago</translation>
+<translation id="2268130516524549846">Bluetootha desgaituta dago</translation>
 <translation id="2270450558902169558">Partekatu datuak <ph name="DOMAIN" /> domeinuko edozein gailurekin</translation>
 <translation id="2270612886833477697"><ph name="BEGIN_PARAGRAPH1" />Instalatuz gero, <ph name="BEGIN_BOLD" />disko gogorreko eduki guztia ezabatuko da<ph name="END_BOLD" />. Ziurtatu datuen babeskopiak egin dituzula.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Instalazio-prozesua hasiz gero, ezin da bertan behera utzi.<ph name="END_PARAGRAPH2" /></translation>
@@ -2265,7 +2265,7 @@
 <translation id="3058517085907878899">Jarri izena gailuari</translation>
 <translation id="3059195548603439580">Sistemaren osagaien bila zabiltza? Joan helbide honetara:</translation>
 <translation id="3060952009917586498">Aldatu gailuaren hizkuntza. Oraingo hizkuntza <ph name="LANGUAGE" /> da.</translation>
-<translation id="3060987956645097882">Ezin izan dugu konektatu gailua telefonoarekin. Ziurtatu telefonoa hurbil eta desblokeatuta dagoela, eta Bluetooth-a eta wifia aktibatuta dauzkala.</translation>
+<translation id="3060987956645097882">Ezin izan dugu konektatu gailua telefonoarekin. Ziurtatu telefonoa hurbil eta desblokeatuta dagoela, eta Bluetootha eta wifia aktibatuta dauzkala.</translation>
 <translation id="3064871050034234884">Webguneek soinua erreproduzi dezakete</translation>
 <translation id="3065041951436100775">Itxiarazi diren fitxei buruzko iritzia.</translation>
 <translation id="3065522099314259755">Teklatuaren errepikapen-maiztasuna</translation>
@@ -2304,7 +2304,7 @@
 <translation id="3103451787721578293">Idatzi datu hauek kargatzeko arrazoi bat:</translation>
 <translation id="3105339775057145050">Ezin izan da instalatu azken eguneratzea</translation>
 <translation id="3105796011181310544">Google-ra itzuli nahi duzu?</translation>
-<translation id="310671807099593501">Webgunea Bluetooth-a erabiltzen ari da</translation>
+<translation id="310671807099593501">Webgunea Bluetootha erabiltzen ari da</translation>
 <translation id="3108931485517391283">Ezin da jaso</translation>
 <translation id="3109206895301430738">Gordetako fitxa taldeak</translation>
 <translation id="3109724472072898302">Tolestuta</translation>
@@ -2331,7 +2331,7 @@
 <translation id="3129215702932019810">Errore bat gertatu da aplikazioa abiaraztean</translation>
 <translation id="3130528281680948470">Gailua berrezarri egingo da, eta erabiltzaile-kontu eta tokiko datu guztiak kendu egingo dira. Ekintza hau ezin da desegin.</translation>
 <translation id="313205617302240621">Pasahitza ahaztu zaizu?</translation>
-<translation id="3132277757485842847">Ezin izan dugu mantendu gailua telefonoarekin konektatuta. Ziurtatu telefonoa hurbil eta desblokeatuta dagoela, eta Bluetooth-a eta wifia aktibatuta dauzkala.</translation>
+<translation id="3132277757485842847">Ezin izan dugu mantendu gailua telefonoarekin konektatuta. Ziurtatu telefonoa hurbil eta desblokeatuta dagoela, eta Bluetootha eta wifia aktibatuta dauzkala.</translation>
 <translation id="3132896062549112541">Araua</translation>
 <translation id="3132996321662585180">Freskatu egunero</translation>
 <translation id="3134393957315651797">Hautatu <ph name="EXPERIMENT_NAME" /> probaren egoera. Probaren azalpena: <ph name="EXPERIMENT_DESCRIPTION" /></translation>
@@ -2820,7 +2820,7 @@
 <translation id="3627588569887975815">Ireki esteka &amp;ezkutuko moduko leihoan</translation>
 <translation id="3627671146180677314">Netscape ziurtagiria berritzeko ordua</translation>
 <translation id="3627879631695760395">Instalatu <ph name="APP" />…</translation>
-<translation id="3628275722731025472">Desaktibatu Bluetooth-a</translation>
+<translation id="3628275722731025472">Desaktibatu Bluetootha</translation>
 <translation id="3629631988386925734">Smart Lock gaitzeko, idatzi pasahitza. Hurrengoan, telefonoak desblokeatuko du <ph name="DEVICE_TYPE" /> gailua. Smart Lock desaktibatzeko, joan ezarpenetara.</translation>
 <translation id="3629664892718440872">Gogoratu aukera hau</translation>
 <translation id="3630132874740063857">Zure telefonoa</translation>
@@ -2862,7 +2862,7 @@
 <translation id="3665589677786828986">Beste programa batek ezarpen batzuk hondatu dituela hauteman du Chrome-k. Ezarpen horien jatorrizko balio lehenetsiak berrezarri dira.</translation>
 <translation id="3665919494326051362">Une honetako bertsioa <ph name="CURRENT_VERSION" /> da</translation>
 <translation id="3670113805793654926">Edozein saltzaileren gailuak</translation>
-<translation id="3670229581627177274">Aktibatu Bluetooth-a</translation>
+<translation id="3670229581627177274">Aktibatu Bluetootha</translation>
 <translation id="3672681487849735243">Errore bat hauteman da jatorrizko hardwarean</translation>
 <translation id="3673097791729989571"><ph name="SAML_DOMAIN" /> domeinuak ostatatzen du saio-hasiera</translation>
 <translation id="3673622964532248901">Ez duzu gailu honetara edukia igortzeko baimenik.</translation>
@@ -2998,7 +2998,7 @@
 <translation id="379082410132524484">Iraungita dago txartela</translation>
 <translation id="3792973596468118484"><ph name="NUM_EXTENSIONS" /> luzapen</translation>
 <translation id="3793588272211751505">{NUM_DAYS,plural, =1{Chrome-k ez du aurkitu software kaltegarririk ordenagailuan • Atzo egiaztatu zuen}other{Chrome-k ez du aurkitu software kaltegarririk ordenagailuan • Duela {NUM_DAYS} egun egiaztatu zuen}}</translation>
-<translation id="379500251094592809">Nearby Share erabiltzeko, egiaztatu bi gailuak desblokeatuta eta elkarrengandik hurbil daudela, eta Bluetooth-a aktibatuta daukatela. Zure kontaktuetan ez dagoen Chromebook batekin edukia partekatzeko asmoa baduzu, egiaztatu Nearby-ren ikusgaitasuna aktibatuta dagoela (hautatu ordua egoeraren eremua irekitzeko, eta, gero, aktibatu Nearby-ren ikusgaitasuna). <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation>
+<translation id="379500251094592809">Nearby Share erabiltzeko, egiaztatu bi gailuak desblokeatuta eta elkarrengandik hurbil daudela, eta Bluetootha aktibatuta daukatela. Zure kontaktuetan ez dagoen Chromebook batekin edukia partekatzeko asmoa baduzu, egiaztatu Nearby-ren ikusgaitasuna aktibatuta dagoela (hautatu ordua egoeraren eremua irekitzeko, eta, gero, aktibatu Nearby-ren ikusgaitasuna). <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation>
 <translation id="379509625511193653">Desaktibatuta</translation>
 <translation id="3795766489237825963">Erreproduzitu animazioak</translation>
 <translation id="3796648294839530037">Gogoko sareak:</translation>
@@ -3291,7 +3291,7 @@
 <translation id="4047726037116394521">Joan orri nagusira</translation>
 <translation id="4049783682480068824">{COUNT,plural, =1{# kontaktu ez dago erabilgarri. Nearby Share kontaktu horrekin erabiltzeko, gehitu kontaktuetan haren Google-ko kontuarekin lotutako helbide elektronikoa.}other{# kontaktu ez daude erabilgarri. Nearby Share kontaktu horiekin erabiltzeko, gehitu kontaktuetan haien Google-ko kontuarekin lotutako helbide elektronikoa.}}</translation>
 <translation id="4050225813016893843">Autentifikazio-metodoa</translation>
-<translation id="4050534976465737778">Egiaztatu bi gailuak desblokeatuta eta elkarrengandik hurbil daudela, eta Bluetooth-a aktibatuta daukatela. Zure kontaktuetan ez dagoen Chromebook batekin edukia partekatzeko asmoa baduzu, egiaztatu Nearby-ren ikusgaitasuna aktibatuta dagoela (ireki egoeraren eremua eta, gero, aktibatu Nearby-ren ikusgaitasuna). <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation>
+<translation id="4050534976465737778">Egiaztatu bi gailuak desblokeatuta eta elkarrengandik hurbil daudela, eta Bluetootha aktibatuta daukatela. Zure kontaktuetan ez dagoen Chromebook batekin edukia partekatzeko asmoa baduzu, egiaztatu Nearby-ren ikusgaitasuna aktibatuta dagoela (ireki egoeraren eremua eta, gero, aktibatu Nearby-ren ikusgaitasuna). <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation>
 <translation id="4052120076834320548">Oso txikia</translation>
 <translation id="4054070260844648638">Guztientzat ikusgai</translation>
 <translation id="4056223980640387499">Sepia</translation>
@@ -3478,7 +3478,7 @@
 <translation id="4250680216510889253">Ez</translation>
 <translation id="4251377547188244181">Gailua kiosko eta seinaleztatze modurako erregistratzea</translation>
 <translation id="4252035718262427477">Web-orria, fitxategi bakarra (web sorta)</translation>
-<translation id="4252899949534773101">Bluetooth-a desgaituta dago</translation>
+<translation id="4252899949534773101">Bluetootha desgaituta dago</translation>
 <translation id="4252996741873942488"><ph name="WINDOW_TITLE" /> - Fitxako edukia partekatzen da</translation>
 <translation id="4253168017788158739">Oharra</translation>
 <translation id="4253183225471855471">Ez da aurkitu sarerik. Berriro saiatu aurretik, sartu SIM txartela eta berrabiarazi gailua.</translation>
@@ -4002,7 +4002,7 @@
 <translation id="4746351372139058112">Mezuak</translation>
 <translation id="4748783296226936791">Webguneak HID gailuetara konektatu ohi dira ezohikoak diren teklatuek, bideo-jokoen kontrolagailuek eta bestelako gailuek darabilten eginbideak eskaintzeko</translation>
 <translation id="4749960740855309258">Ireki beste fitxa bat</translation>
-<translation id="4750185073185658673">Hartu telefonoa eta berrikusi beste baimen batzuk. Ziurtatu telefonoak Bluetooth-a eta wifia aktibatuta dauzkala.</translation>
+<translation id="4750185073185658673">Hartu telefonoa eta berrikusi beste baimen batzuk. Ziurtatu telefonoak Bluetootha eta wifia aktibatuta dauzkala.</translation>
 <translation id="4750394297954878236">Iradokizunak</translation>
 <translation id="475088594373173692">Lehen erabiltzailea</translation>
 <translation id="4756378406049221019">Gelditu / Kargatu berriro</translation>
@@ -4153,7 +4153,7 @@
 <translation id="488785315393301722">Erakutsi xehetasunak</translation>
 <translation id="4890773143211625964">Erakutsi inprimagailuaren aukera aurreratuak</translation>
 <translation id="4891089016822695758">Beta foroa</translation>
-<translation id="4892229439761351791">Webguneak Bluetooth-a erabil dezake</translation>
+<translation id="4892229439761351791">Webguneak Bluetootha erabil dezake</translation>
 <translation id="489258173289528622">Gailua kargatzen ari ez denean inaktibo geratuz gero gauzatu beharreko ekintza</translation>
 <translation id="4892811427319351753">Ezin da gaitu <ph name="EXTENSION_TYPE_PARAMETER" /></translation>
 <translation id="4893073099212494043">Gaitu hurrengo hitzaren iragarpena</translation>
@@ -4381,7 +4381,7 @@
 <translation id="5130675701626084557">Ezin izan da deskargatu profila. Saiatu berriro geroago. Bestela, laguntza lortzeko, jarri operadorearekin harremanetan.</translation>
 <translation id="5131591206283983824">Ukipen-panela sakatu eta arrastatzeko aukera</translation>
 <translation id="5135533361271311778">Ezin izan da sortu laster-markaren elementua.</translation>
-<translation id="5136343472380336530">Egiaztatu bi gailuak desblokeatuta eta elkarrengandik hurbil daudela, eta Bluetooth-a aktibatuta daukatela. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation>
+<translation id="5136343472380336530">Egiaztatu bi gailuak desblokeatuta eta elkarrengandik hurbil daudela, eta Bluetootha aktibatuta daukatela. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation>
 <translation id="5137501176474113045">Ezabatu elementua</translation>
 <translation id="5139112070765735680">Bilatu "<ph name="QUERY_NAME" />" <ph name="DEFAULT_SEARCH_ENGINE_NAME" /> erabilita</translation>
 <translation id="5139823398361067371">Idatzi segurtasun-giltzaren PINa. PINa ez badakizu, segurtasun-giltza berrezarri egin beharko duzu.</translation>
@@ -4835,7 +4835,7 @@
 <translation id="5563234215388768762">Bilatu Google-n edo idatzi URL bat</translation>
 <translation id="5565735124758917034">Aktibo</translation>
 <translation id="5568069709869097550">Ezin da hasi saioa</translation>
-<translation id="5571066253365925590">Bluetooth-a gaitu da</translation>
+<translation id="5571066253365925590">Bluetootha gaitu da</translation>
 <translation id="5571092938913434726">Multimedia-edukia kontrolatzeko aukera orokorrak</translation>
 <translation id="5571832155627049070">Pertsonalizatu profila</translation>
 <translation id="5572648434713976849">Iradokizun hobeak jasoko dituzu helbide-barran</translation>
@@ -5107,7 +5107,7 @@
 <translation id="5840658767386246331">Bilatu Google-n</translation>
 <translation id="5840680448799937675">Internetera konektatu gabe partekatuko dira beti fitxategiak</translation>
 <translation id="5841270259333717135">Konfiguratu Ethernet-a</translation>
-<translation id="5842497610951477805">Gaitu Bluetooth-a</translation>
+<translation id="5842497610951477805">Gaitu Bluetootha</translation>
 <translation id="5844574845205796324">Iradoki arakatzeko eduki berria</translation>
 <translation id="5846200638699387931">Erlazio-sintaxiaren errorea: <ph name="ERROR_LINE" /></translation>
 <translation id="5846455742152785308">Ez dago itzalik</translation>
@@ -5425,7 +5425,7 @@
 <translation id="6129953537138746214">Zuriunea</translation>
 <translation id="6130692320435119637">Gehitu wifi-sarea</translation>
 <translation id="6130887916931372608">Teklatuko tekla</translation>
-<translation id="6135823405800500595">Ziurtatu telefonoa hurbil eta desblokeatuta dagoela, eta Bluetooth-a eta wifia aktibatuta dauzkala</translation>
+<translation id="6135823405800500595">Ziurtatu telefonoa hurbil eta desblokeatuta dagoela, eta Bluetootha eta wifia aktibatuta dauzkala</translation>
 <translation id="6135826623269483856">Leihoak pantaila guztietan kudeatzeko baimena ez dutenak</translation>
 <translation id="6136114942382973861">Itxi deskargen barra</translation>
 <translation id="6136287496450963112">Segurtasun-giltza ez daukazu PIN kodearekin babestuta. Hatz-markak kudeatzeko, sortu PIN bat.</translation>
@@ -5463,7 +5463,7 @@
 <translation id="617213288191670920">Ez da gehitu hizkuntzarik</translation>
 <translation id="6173623053897475761">Idatzi berriro PINa</translation>
 <translation id="6175314957787328458">Microsoft domeinuen GUID identifikatzailea</translation>
-<translation id="6176043333338857209">Aldi baterako aktibatuko da Bluetooth-a, segurtasun-giltzarekin konektatzeko</translation>
+<translation id="6176043333338857209">Aldi baterako aktibatuko da Bluetootha, segurtasun-giltzarekin konektatzeko</translation>
 <translation id="6178664161104547336">Hautatu ziurtagiri bat</translation>
 <translation id="6178682841350631965">Eguneratu dira saioa hasteko datuak</translation>
 <translation id="6180510783007738939">Lerroen tresna</translation>
@@ -6472,7 +6472,7 @@
 <translation id="7131040479572660648">Irakurri <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> eta <ph name="WEBSITE_3" /> webguneetan dituzun datuak</translation>
 <translation id="713122686776214250">Gehitu &amp;orria…</translation>
 <translation id="7134098520442464001">Txikitu testua</translation>
-<translation id="7135729336746831607">Bluetooth-a aktibatu nahi duzu?</translation>
+<translation id="7135729336746831607">Bluetootha aktibatu nahi duzu?</translation>
 <translation id="7136694880210472378">Ezarri lehenetsi gisa</translation>
 <translation id="7138678301420049075">Beste bat</translation>
 <translation id="7139627972753429585"><ph name="APP_NAME" /> mikrofonoa erabiltzen ari da</translation>
@@ -6699,7 +6699,7 @@
 <translation id="7378611153938412599">Seguruak ez diren pasahitzak erraz asmatzen dira. Ziurtatu pasahitz konplexuak sortzen dituzula. <ph name="BEGIN_LINK" />Ikusi segurtasun-aholku gehiago.<ph name="END_LINK" /></translation>
 <translation id="73786666777299047">Ireki Chrome Web Store</translation>
 <translation id="737938816678769289">Konektatu eta konfiguratu erraz gertu dauden eta Parekatze bizkorra darabilten gailuak</translation>
-<translation id="7380459290951585794">Ziurtatu telefonoa hurbil eta desblokeatuta dagoela, eta Bluetooth-a eta wifia aktibatuta dauzkala</translation>
+<translation id="7380459290951585794">Ziurtatu telefonoa hurbil eta desblokeatuta dagoela, eta Bluetootha eta wifia aktibatuta dauzkala</translation>
 <translation id="7380622428988553498">Balio ez duten karaktereak ditu gailuaren izenak</translation>
 <translation id="7380768571499464492">Eguneratu da <ph name="PRINTER_NAME" /></translation>
 <translation id="7382085868019811559">Arakatzaile zaharrekiko bateragarritasuna (LBS) eginbidearekin, URLen eredu jakin batzuk aurreko bertsioko eginbideak erabil ditzakeen ordezko arakatzaile batean ireki daitezke, webguneak behar bezala exekuta daitezen.</translation>
@@ -7023,7 +7023,7 @@
 <translation id="7676867886086876795">Bidali ahotsa Google-ri, testu-eremuetan diktatu ahal izateko.</translation>
 <translation id="7679171213002716280">Kudeatutako <ph name="PRINTER_COUNT" /> inprimagailu daude.</translation>
 <translation id="7680416688940118410">Ukipen-pantailaren kalibrazioa</translation>
-<translation id="7681095912841365527">Webguneak Bluetooth-a erabil dezake</translation>
+<translation id="7681095912841365527">Webguneak Bluetootha erabil dezake</translation>
 <translation id="7681597159868843240">Webguneek gailuko mugimendu-sentsoreak erabili ohi dituzte eginbide batzuk eskaintzeko; adibidez, errealitate birtuala edo fitnessaren jarraipena egiteko aukera</translation>
 <translation id="7683373461016844951">Aurrera egiteko, sakatu Ados eta sakatu Gehitu pertsona bat <ph name="DOMAIN" /> domeinuko zure helbide elektronikorako profila sortzeko.</translation>
 <translation id="7683834360226457448">Ikusmen-urritasuna duten erabiltzaileentzako pantaila-tresnak</translation>
@@ -7118,7 +7118,7 @@
 <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> (domeinua: <ph name="DOWNLOAD_DOMAIN" />)</translation>
 <translation id="7764857504908700767">Probak abian diren bitartean, spamaren eta iruzurren murrizketak fidagarritasun-tokenak erabiltzen ditu webguneei iruzurrak hautematen eta robotak pertsonengandik desberdintzen laguntzeko.</translation>
 <translation id="7765158879357617694">Eraman</translation>
-<translation id="7765507180157272835">Bluetooth-a eta wifia behar dira</translation>
+<translation id="7765507180157272835">Bluetootha eta wifia behar dira</translation>
 <translation id="7766082757934713382">Sareko datu-erabilera murrizten laguntzen du, aplikazioen eta sistemaren eguneratze automatikoak pausatzen baititu</translation>
 <translation id="7766807826975222231">Eman txangoa</translation>
 <translation id="7766838926148951335">Eman baimenak</translation>
@@ -7227,7 +7227,7 @@
 <translation id="786073089922909430">Zerbitzua: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Deskargak</translation>
 <translation id="7861846108263890455">Google-ko kontuaren hizkuntza</translation>
-<translation id="7864539943188674973">Desgaitu Bluetooth-a</translation>
+<translation id="7864539943188674973">Desgaitu Bluetootha</translation>
 <translation id="7865127013871431856">Itzultzeko aukerak</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - Parekatu da</translation>
 <translation id="7869655448736341731">Edozein</translation>
@@ -7256,7 +7256,7 @@
 <translation id="7890147169288018054">Ikusi sarearen informazioa, hala nola IP helbidea edo MAC helbidea</translation>
 <translation id="7892384782944609022">Ezin izan da parekatu. Berriro saiatzeko, hautatu gailu bat.</translation>
 <translation id="7893008570150657497">Atzitu ordenagailuko argazkiak, musika eta bestelako multimedia-edukia</translation>
-<translation id="7893153962594818789">Bluetooth-a desaktibatuta dago <ph name="DEVICE_TYPE" /> gailuan. Idatzi pasahitza eta aktibatu Bluetooth-a.</translation>
+<translation id="7893153962594818789">Bluetootha desaktibatuta dago <ph name="DEVICE_TYPE" /> gailuan. Idatzi pasahitza eta aktibatu Bluetootha.</translation>
 <translation id="7893393459573308604"><ph name="ENGINE_NAME" /> (lehenetsia)</translation>
 <translation id="7896292361319775586"><ph name="FILE" /> gorde nahi duzu?</translation>
 <translation id="789722939441020330">Ez eman hainbat fitxategi automatikoki deskargatzeko baimena webguneei</translation>
@@ -7699,7 +7699,7 @@
 <translation id="8289509909262565712">Ongi etorri <ph name="DEVICE_OS" /> sistemara</translation>
 <translation id="8293206222192510085">Gehitu laster-marka</translation>
 <translation id="8294431847097064396">Iturburua</translation>
-<translation id="8298429963694909221">Telefonoko jakinarazpenak jaso ditzakezu <ph name="DEVICE_TYPE" /> gailuan. <ph name="DEVICE_TYPE" /> gailuan jakinarazpenak baztertzen badituzu, telefonoan ere baztertu egingo dituzu. Ziurtatu telefonoa hurbil dagoela, eta Bluetooth-a eta wifia aktibatuta dauzkala.</translation>
+<translation id="8298429963694909221">Telefonoko jakinarazpenak jaso ditzakezu <ph name="DEVICE_TYPE" /> gailuan. <ph name="DEVICE_TYPE" /> gailuan jakinarazpenak baztertzen badituzu, telefonoan ere baztertu egingo dituzu. Ziurtatu telefonoa hurbil dagoela, eta Bluetootha eta wifia aktibatuta dauzkala.</translation>
 <translation id="8299319456683969623">Ez duzu konexiorik.</translation>
 <translation id="8300011035382349091">Editatu fitxa honen laster-marka</translation>
 <translation id="8300374739238450534">Gau-urdina</translation>
@@ -7856,7 +7856,7 @@
 <translation id="8449008133205184768">Itsatsi eta bat etorrarazi estiloarekin</translation>
 <translation id="8449036207308062757">Kudeatu memoria</translation>
 <translation id="8456512334795994339">Aurkitu lan egiteko eta jolasteko aplikazioak</translation>
-<translation id="845702320058262034">Ezin da konektatu. Ziurtatu telefonoaren Bluetooth-a aktibatuta dagoela.</translation>
+<translation id="845702320058262034">Ezin da konektatu. Ziurtatu telefonoaren Bluetootha aktibatuta dagoela.</translation>
 <translation id="8457451314607652708">Inportatu laster-markak</translation>
 <translation id="8458341576712814616">Lasterbidea</translation>
 <translation id="8458627787104127436">Ireki guztiak (<ph name="URL_COUNT" />) beste leiho batean</translation>
@@ -8496,7 +8496,7 @@
 <translation id="9068598199622656904">Lasterbideak erabiltzeko, sakatu tekla bakar bat aldiko, teklak aldi berean sakatuta eduki beharrean</translation>
 <translation id="9068878141610261315">Fitxategi mota hau ez da onartzen</translation>
 <translation id="9070342919388027491">Ezkerrera eraman da fitxa</translation>
-<translation id="9074739597929991885">Bluetooth-a</translation>
+<translation id="9074739597929991885">Bluetootha</translation>
 <translation id="9074836595010225693">USB sagua konektatu da</translation>
 <translation id="9075413375877487220">"Arakatze seguru hobetua" eginbideak ez du jotzen fidagarritzat luzapena.</translation>
 <translation id="9076283476770535406">Helduentzako edukia izan dezake</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb
index a427599..14ec2e2 100644
--- a/chrome/app/resources/generated_resources_hy.xtb
+++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -71,6 +71,7 @@
 <translation id="1067661089446014701">Անվտանգության մակարդակը բարձրացնելու համար դուք կարող եք գաղտնագրել գաղտնաբառերը ձեր սարքում՝ նախքան Google հաշվում պահելը։</translation>
 <translation id="1067922213147265141">Google-ի այլ ծառայություններ</translation>
 <translation id="1069355737714877171">Հեռացնել eSIM պրոֆիլը (<ph name="PROFILE_NAME" />)</translation>
+<translation id="1069814191880976658">Ընտրել այլ էկրան</translation>
 <translation id="1070377999570795893">Ձեր համակարգչի ծրագրերից մեկն ավելացրել է ընդլայնում, որը կարող է միջամտել Chrome-ի աշխատանքին:
 
 <ph name="EXTENSION_NAME" /></translation>
@@ -227,6 +228,7 @@
 <translation id="120069043972472860">Անդիտելի</translation>
 <translation id="1201402288615127009">Հաջորդը</translation>
 <translation id="1201564082781748151">Եթե մոռանաք ձեր գաղտնաբառը, սարքի տվյալները կարող են վերականգնվել</translation>
+<translation id="1202116106683864634">Իսկապե՞ս ուզում եք ջնջել այս անցաբառը։</translation>
 <translation id="1202596434010270079">Kiosk հավելվածը թարմացվեց: Հեռացրեք USB հիշողությունը:</translation>
 <translation id="120368089816228251">Նոտա</translation>
 <translation id="1203942045716040624">Shared Worker՝ <ph name="SCRIPT_URL" /></translation>
@@ -250,6 +252,7 @@
 <translation id="1223853788495130632">Ադմինիստրատորը խորհուրդ է տալիս այս կարգավորման համար որոշակի արժեք ընտրել:</translation>
 <translation id="1225177025209879837">Հարցումը մշակվում է…</translation>
 <translation id="1227507814927581609">«<ph name="DEVICE_NAME" />»-ին կապակցվելիս իսկորոշումը ձախողվեց:</translation>
+<translation id="1227660082540388410">Անցաբառի փոփոխում</translation>
 <translation id="1227993798763400520">Չհաջողվեց հեռարձակել։ Նորից փորձեք։</translation>
 <translation id="1230417814058465809">Սովորական պաշտպանությունը միացված է։ Հավելյալ ապահովության համար օգտագործեք բարելավված
  պաշտպանությունը։</translation>
@@ -770,6 +773,7 @@
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (օրիգինալ)</translation>
 <translation id="1709217939274742847">Ընտրեք տոմս՝ նույնականացման համար օգտագործելու համար: <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation>
 <translation id="1709762881904163296">Ցանցի կարգավորումներ</translation>
+<translation id="1709916727352927457">Անցաբառի ջնջում</translation>
 <translation id="1709972045049031556">Սխալ առաջացավ</translation>
 <translation id="1711935594505774770"><ph name="SITE_GROUP_NAME" /> խմբի կայքերի, դրանց ենթակայքերի և տեղադրած հավելվածների կողմից պահված բոլոր տվյալներն ու քուքիները կջնջվեն։</translation>
 <translation id="1714644264617423774">Միացնել հատուկ գործառույթները՝ սարքն ավելի հեշտ օգտագործելու համար։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation>
@@ -1096,6 +1100,7 @@
 <translation id="2007404777272201486">Report an Issue...</translation>
 <translation id="2009590708342941694">«Էմոջիներ» գործիք</translation>
 <translation id="2010501376126504057">Համատեղելի սարքեր</translation>
+<translation id="2010888903612390044">Միացված խոսափող չկա</translation>
 <translation id="2015232545623037616">Համակարգիչը և Chromecast-ը միևնույն Wi-Fi ցանցում են գտնվում</translation>
 <translation id="2016473077102413275">Գործառույթները, որոնց համար պահանջվում են պատկերներ, չեն աշխատի</translation>
 <translation id="2016574333161572915">Google Meet-ի ձեր սարքակազմը պատրաստ է կարգավորման</translation>
@@ -3029,6 +3034,7 @@
 <translation id="3813296892522778813">Եթե չեք գտնում ձեր ուզածը, այցելեք <ph name="BEGIN_LINK_CHROMIUM" />Google Chrome-ի օգնության էջ<ph name="END_LINK_CHROMIUM" /></translation>
 <translation id="3813358687923336574">Էջերի թարգմանության և արագ պատասխանների համար օգտագործվող լեզուն</translation>
 <translation id="3814529970604306954">Ուսումնական հաշիվ</translation>
+<translation id="3814792775883886759">Միացված տեսախցիկ չկա</translation>
 <translation id="3816118180265633665">Chrome-ի գույներ</translation>
 <translation id="3817524650114746564">Ձեր համակարգչում բացեք պրոքսի սերվերի կարգավորումները</translation>
 <translation id="3819164369574292143">Մեծացրեք մասշտաբը՝ տարրերը էկրանին ավելի խոշոր դարձնելու համար։ Օգտագործեք Որոնում + Ctrl + M դյուրանցումը՝ խոշորացույցը միացնելու և անջատելու համար, և Ctrl + Alt + Սլաքների ստեղներ՝ մեծացրած մաստշաբի դեպքում էկրանով շարժվելու համար։</translation>
@@ -4275,6 +4281,7 @@
 <translation id="5017643436812738274">Դուք կարող եք մեկ էջից անցնել մյուսը տեսքտի նշորդի միջոցով։ Անջատելու համար սեղմեք Ctrl + Search + 7։</translation>
 <translation id="5018207570537526145">Բացել ընդլայնման կայքը</translation>
 <translation id="5018526990965779848">Օգտագործման և դիագնոստիկ տվյալների ուղարկում։ Օգնեք բարելավել Android-ի աշխատանքը՝ Google-ին ավտոմատ ուղարկելով ախտորոշիչ, ինչպես նաև սարքի ու հավելվածի օգտագործման մասին տվյալներ։ Դա կօգնի բարելավել համակարգի ու հավելվածների աշխատանքի կայունությունը։ Հավաքված տեղեկությունների մի մասը օգտակար կլինի մեր գործընկերների, օրինակ, Android ծրագրավորողների համար։ Եթե միացնեք Վեբ որոնման և հավելվածների լրացուցիչ պատմությունը, այս տվյալները կպահվեն ձեր Google հաշվում։</translation>
+<translation id="5020008942039547742">Ընտրել այլ պատուհան</translation>
 <translation id="5021750053540820849">Չի թարմացվել</translation>
 <translation id="5024511550058813796">Ձեր գործողությունների պատմությունը հասանելի կլինի բոլոր համաժամացված սարքերում, և դուք կկարողանաք շարունակել այն, ինչ անում էիք։</translation>
 <translation id="5026492829171796515">Մուտք գործեք՝ Google հաշիվ ավելացնելու համար</translation>
@@ -4501,6 +4508,7 @@
 <translation id="5252653240322147470">PIN կոդը պետք է <ph name="MAXIMUM" />-ից քիչ թիվ պարունակի</translation>
 <translation id="5254368820972107711">Ցուցադրել ֆայլերը, որոնք ջնջվելու են</translation>
 <translation id="52550593576409946">Չհաջողվեց գործարկել kiosk ծրագիրը:</translation>
+<translation id="5255726914791076208">Այս անցաբառը փոփոխելու դեպքում ձեր <ph name="RP_ID" /> հաշիվը չի փոփոխվի</translation>
 <translation id="5255859108402770436">Նորից մուտք գործեք</translation>
 <translation id="52566111838498928">Տառատեսակները բեռնվում են…</translation>
 <translation id="5256861893479663409">Բոլոր կայքերում</translation>
@@ -6040,6 +6048,7 @@
 <translation id="672609503628871915">Իմանալ՝ ինչ նոր բան կա</translation>
 <translation id="67269783048918309">Օգտագործման և դիագնոստիկ տվյալների ուղարկում Ներկայումս այս սարքը ախտորոշման, սարքի և հավելվածի օգտագործման տվյալներն ավտոմատ ուղարկում է Google-ին: Այս տեղեկությունները չեն օգտագործվի ձեր երեխային նույնականացնելու համար և կօգնեն բարելավել համակարգի ու հավելվածի աշխատանքի կայունությունը: Հավաքված տեղեկությունների մի մասը օգտակար կլինի մեր գործընկերների, օրինակ, Android ծրագրավորողների համար։ Այս <ph name="BEGIN_LINK1" />կարգավորումը<ph name="END_LINK1" /> պարտադրված է սեփականատիրոջ կողմից: Եթե Վեբ որոնման և հավելվածների պատմությունը միացված է, այս տվյալները կպահվեն երեխայի Google հաշվում։ <ph name="BEGIN_LINK2" />Մանրամասն<ph name="END_LINK2" /></translation>
 <translation id="6727969043791803658">Միացված է, մարտկոցի լիցքը՝ <ph name="BATTERY_PERCENTAGE" /></translation>
+<translation id="6729192290958770680">Մուտքագրեք ձեր օգտանունը</translation>
 <translation id="6731320427842222405">Սա կարող է մի քանի րոպե տևել</translation>
 <translation id="6733620523445262364">«<ph name="BOOKMARK_TITLE" />» էջանիշը ստեղծվեց։</translation>
 <translation id="6735304988756581115">Ցույց տալ քուքիները և կայքի այլ տվյալները…</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index e55bcba..8790fd99 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -71,6 +71,7 @@
 <translation id="1067661089446014701">คุณสามารถเข้ารหัสให้กับรหัสผ่านในอุปกรณ์ก่อนบันทึกลงในบัญชี Google เพื่อเพิ่มความปลอดภัย</translation>
 <translation id="1067922213147265141">บริการอื่นๆ ของ Google</translation>
 <translation id="1069355737714877171">ลบโปรไฟล์ eSIM ที่มีชื่อว่า <ph name="PROFILE_NAME" /></translation>
+<translation id="1069814191880976658">เลือกหน้าจออื่น</translation>
 <translation id="1070377999570795893">โปรแกรมอื่นบนคอมพิวเตอร์ได้เพิ่มส่วนขยายที่อาจเปลี่ยนลักษณะการทำงานของ Chrome
 
 <ph name="EXTENSION_NAME" /></translation>
@@ -226,6 +227,7 @@
 <translation id="120069043972472860">ดูไม่ได้</translation>
 <translation id="1201402288615127009">ถัดไป</translation>
 <translation id="1201564082781748151">กู้คืนข้อมูลในเครื่องได้หากคุณลืมรหัสผ่าน</translation>
+<translation id="1202116106683864634">คุณแน่ใจไหมว่าต้องการลบพาสคีย์นี้</translation>
 <translation id="1202596434010270079">อัปเดตแอปคีออสก์แล้ว โปรดนำ USB สติ๊กออก</translation>
 <translation id="120368089816228251">โน้ตดนตรี</translation>
 <translation id="1203942045716040624">ผู้ปฏิบัติงานที่แชร์: <ph name="SCRIPT_URL" /></translation>
@@ -249,6 +251,7 @@
 <translation id="1223853788495130632">ผู้ดูแลระบบของคุณแนะนำให้ใช้ค่าเฉพาะสำหรับการตั้งค่านี้</translation>
 <translation id="1225177025209879837">กำลังดำเนินการตามคำขอ...</translation>
 <translation id="1227507814927581609">การตรวจสอบสิทธิ์ล้มเหลวขณะที่เชื่อมต่อกับ "<ph name="DEVICE_NAME" />"</translation>
+<translation id="1227660082540388410">แก้ไขพาสคีย์</translation>
 <translation id="1227993798763400520">แคสต์ไม่สำเร็จ โปรดลองอีกครั้ง</translation>
 <translation id="1230417814058465809">การปกป้องแบบมาตรฐานเปิดอยู่ ใช้การปกป้องที่ปรับปรุงแล้วเพื่อความปลอดภัยมากขึ้น</translation>
 <translation id="1231733316453485619">เปิดการซิงค์ไหม</translation>
@@ -768,6 +771,7 @@
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (ดั้งเดิม)</translation>
 <translation id="1709217939274742847">เลือกตั๋วที่จะใช้สำหรับการตรวจสอบสิทธิ์ <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation>
 <translation id="1709762881904163296">การตั้งค่าเครือข่าย</translation>
+<translation id="1709916727352927457">ลบพาสคีย์</translation>
 <translation id="1709972045049031556">แชร์ไม่สำเร็จ</translation>
 <translation id="1711935594505774770">การดำเนินการนี้จะล้างข้อมูลและคุกกี้ทั้งหมดที่ <ph name="SITE_GROUP_NAME" />, เว็บไซต์ใดก็ตามภายใต้กลุ่มนี้ และแอปที่ติดตั้งโดยกลุ่มนี้จัดเก็บไว้</translation>
 <translation id="1714644264617423774">เปิดใช้งานฟีเจอร์การช่วยเหลือพิเศษเพื่อให้อุปกรณ์ใช้งานง่ายยิ่งขึ้น <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation>
@@ -1094,6 +1098,7 @@
 <translation id="2007404777272201486">รายงานปัญหา...</translation>
 <translation id="2009590708342941694">เครื่องมืออีโมจิ</translation>
 <translation id="2010501376126504057">อุปกรณ์ที่เข้ากันได้</translation>
+<translation id="2010888903612390044">ไม่มีไมโครโฟนเชื่อมต่ออยู่</translation>
 <translation id="2015232545623037616">PC และ Chromecast ใช้เครือข่าย Wi-Fi เดียวกัน</translation>
 <translation id="2016473077102413275">ฟีเจอร์ที่ต้องใช้รูปภาพจะไม่ทำงาน</translation>
 <translation id="2016574333161572915">ฮาร์ดแวร์ของ Google Meet พร้อมตั้งค่าแล้ว</translation>
@@ -3027,6 +3032,7 @@
 <translation id="3813296892522778813">ไปที่<ph name="BEGIN_LINK_CHROMIUM" />ความช่วยเหลือของ Google Chrome<ph name="END_LINK_CHROMIUM" /> หากคุณไม่พบข้อมูลที่กำลังค้นหา</translation>
 <translation id="3813358687923336574">ภาษาที่ใช้ในการแปลหน้าเว็บและใช้กับคำตอบด่วน</translation>
 <translation id="3814529970604306954">บัญชีโรงเรียน</translation>
+<translation id="3814792775883886759">ไม่มีกล้องเชื่อมต่ออยู่</translation>
 <translation id="3816118180265633665">สีของ Chrome</translation>
 <translation id="3817524650114746564">เปิดการตั้งค่าพร็อกซีของคอมพิวเตอร์</translation>
 <translation id="3819164369574292143">ซูมเข้าเพื่อทำให้รายการในหน้าจอมีขนาดใหญ่ขึ้น ใช้แป้นค้นหา + Ctrl + M เพื่อเปิดและปิดแว่นขยาย ใช้แป้น Ctrl + Alt + ลูกศรเพื่อไปยังส่วนต่างๆ เมื่อซูมเข้า</translation>
@@ -4272,6 +4278,7 @@
 <translation id="5017643436812738274">คุณไปยังส่วนต่างๆ ของหน้าได้ด้วยเคอร์เซอร์ข้อความ กด Ctrl+Search+7 เพื่อปิด</translation>
 <translation id="5018207570537526145">เปิดเว็บไซต์ส่วนขยาย</translation>
 <translation id="5018526990965779848">ส่งข้อมูลการใช้งานและการวินิจฉัย ช่วยปรับปรุงประสบการณ์การใช้งาน Android ของคุณให้ดีขึ้นด้วยการส่งข้อมูลการวินิจฉัย อุปกรณ์ และการใช้งานแอปไปยัง Google โดยอัตโนมัติ ซึ่งจะช่วยให้แอปและระบบมีความเสถียร พร้อมทั้งปรับปรุงด้านอื่นๆ ข้อมูลที่รวบรวมมาบางส่วนจะมีประโยชน์ต่อแอปและพาร์ทเนอร์ของ Google ด้วย เช่น นักพัฒนาแอป Android หากเปิดการตั้งค่ากิจกรรมเพิ่มเติมบนเว็บและแอปไว้ ระบบอาจบันทึกข้อมูลนี้ไว้ในบัญชี Google ของคุณ</translation>
+<translation id="5020008942039547742">เลือกหน้าต่างอื่น</translation>
 <translation id="5021750053540820849">ยังไม่ได้อัปเดต</translation>
 <translation id="5024511550058813796">อุปกรณ์ทั้งหมดที่ซิงค์ไว้จะมีประวัติการเข้าชมของคุณอยู่ ดังนั้นคุณสามารถทำสิ่งที่ดำเนินการอยู่ต่อได้</translation>
 <translation id="5026492829171796515">ลงชื่อเข้าใช้เพื่อเพิ่มบัญชี Google</translation>
@@ -4498,6 +4505,7 @@
 <translation id="5252653240322147470">PIN ต้องมีน้อยกว่า <ph name="MAXIMUM" /> หลัก</translation>
 <translation id="5254368820972107711">แสดงไฟล์ที่จะนำออก</translation>
 <translation id="52550593576409946">ไม่สามารถเรียกใช้แอปพลิเคชันคีออสก์</translation>
+<translation id="5255726914791076208">เมื่อแก้ไขพาสคีย์ บัญชี <ph name="RP_ID" /> จะไม่เปลี่ยนแปลง</translation>
 <translation id="5255859108402770436">ลงชื่อเข้าใช้อีกครั้ง</translation>
 <translation id="52566111838498928">กำลังโหลดแบบอักษร...</translation>
 <translation id="5256861893479663409">ในเว็บไซต์ทั้งหมด</translation>
@@ -6033,6 +6041,7 @@
 <translation id="672609503628871915">ดูว่ามีอะไรใหม่</translation>
 <translation id="67269783048918309">ส่งข้อมูลการใช้งานและการวินิจฉัย ปัจจุบันอุปกรณ์นี้ส่งข้อมูลการวินิจฉัย อุปกรณ์ และการใช้งานแอปไปยัง Google โดยอัตโนมัติ โดยจะไม่มีการใช้ข้อมูลนี้ในการระบุชื่อบุตรหลานของคุณ และจะช่วยให้แอปและระบบมีความเสถียร พร้อมทั้งปรับปรุงด้านอื่นๆ ข้อมูลที่รวบรวมมาบางส่วนจะมีประโยชน์ต่อแอปและพาร์ทเนอร์ของ Google ด้วย เช่น นักพัฒนาแอป Android เจ้าของเป็นผู้บังคับใช้<ph name="BEGIN_LINK1" />การตั้งค่า<ph name="END_LINK1" />นี้ หากเปิดการตั้งค่ากิจกรรมเพิ่มเติมบนเว็บและแอปสำหรับบุตรหลาน ระบบอาจบันทึกข้อมูลนี้ไว้ในบัญชี Google ของบุตรหลาน <ph name="BEGIN_LINK2" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK2" /></translation>
 <translation id="6727969043791803658">เชื่อมต่อแล้ว แบตเตอรี่ <ph name="BATTERY_PERCENTAGE" />%</translation>
+<translation id="6729192290958770680">ป้อนชื่อผู้ใช้</translation>
 <translation id="6731320427842222405">การดำเนินการนี้อาจใช้เวลาสองถึงสามนาที</translation>
 <translation id="6733620523445262364">สร้าง '<ph name="BOOKMARK_TITLE" />' แล้ว</translation>
 <translation id="6735304988756581115">แสดงคุกกี้และข้อมูลอื่นของไซต์...</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb
index 5e3d143..57e2ebc 100644
--- a/chrome/app/resources/generated_resources_uz.xtb
+++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -1115,6 +1115,7 @@
 <translation id="2034346955588403444">Boshqa WiFi tarmoq qo‘shish</translation>
 <translation id="2035211704574173780">Kulrang tus</translation>
 <translation id="203574396658008164">Qulflangan ekrandan eslatmalar olishga ruxsat berish</translation>
+<translation id="2036514476578229158">Bu saytga kirish uchun ruxsat soʻradingiz. Ota-onangiz Family Link orqali javob berishlari mumkin.</translation>
 <translation id="2037445849770872822">Bu Google hisobi uchun nazorat sozlangan. Ota-ona nazoratini chuqurroq sozlash uchun Davom etish tugmasini bosing.
 
 Aks holda, hoziroq hisobdan chiqing va qurilmadagi sozlamalar oʻzgarmaydi.
@@ -1235,6 +1236,7 @@
 <translation id="2135787500304447609">&amp;Qaytarish</translation>
 <translation id="2136372518715274136">Yangi parolni kiriting</translation>
 <translation id="2136476978468204130">Kodli ibora xato kiritildi</translation>
+<translation id="2137891579555018930">Ruxsat kutilmoqda...</translation>
 <translation id="2138398485845393913">“<ph name="DEVICE_NAME" />” qurilmasiga ulanish bajarilmoqda</translation>
 <translation id="2139919072249842737">Sozlash tugmasi</translation>
 <translation id="2140788884185208305">Quvvat darajasi</translation>
@@ -4117,6 +4119,7 @@
 <translation id="4858913220355269194">Futbol</translation>
 <translation id="4862642413395066333">OCSP javoblarini imzolash</translation>
 <translation id="4863769717153320198"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (standart)</translation>
+<translation id="486459320933704969">Bu saytga kirishingiz uchun ota-onangiz yoki vasiyingiz ruxsat berishi kerak</translation>
 <translation id="4864805589453749318">Maktab hisobini kiritishga ruxsat berayotgan ota-onani tanlang.</translation>
 <translation id="486635084936119914">Ba’zi turdagi fayllar yuklab olinishi bilan avtomatik ochilsin</translation>
 <translation id="4868281708609571334">Google Assistentga <ph name="SUPERVISED_USER_NAME" />ning ovozini taniting</translation>
@@ -8683,6 +8686,7 @@
 <translation id="947329552760389097">Elementlarni &amp;tekshirish</translation>
 <translation id="947526284350604411">Javobingiz</translation>
 <translation id="947667444780368238"><ph name="ORIGIN" /> bu jilddagi fayllarni ocha olmaydi, chunki unda tizim fayllari mavjud</translation>
+<translation id="949314938206378263">Bu saytga kirish uchun ruxsat soʻradingiz. Ota-onangiz Family Link orqali javob berishi mumkin.</translation>
 <translation id="950307215746360464">Sozlash qoʻllanmasi</translation>
 <translation id="951991426597076286">Rad etish</translation>
 <translation id="952471655966876828">Qurilma yoqilganda yoki ishlatilayotganda avtomatik ravishda ulanadi</translation>
diff --git a/chrome/app/resources/google_chrome_strings_eu.xtb b/chrome/app/resources/google_chrome_strings_eu.xtb
index c94de1a..1ceb4c8 100644
--- a/chrome/app/resources/google_chrome_strings_eu.xtb
+++ b/chrome/app/resources/google_chrome_strings_eu.xtb
@@ -24,7 +24,7 @@
 <translation id="139993653570221430">Iritziz aldatzen bazara, joan Chrome-ren ezarpenetara. Iragarkiak eskaintzeko darabilgun modua aplikatu bitartean egiten dira probak; beraz, aldaketak ez dituzu berehala ikusiko.</translation>
 <translation id="1434626383986940139">Chrome Canary aplikazioak</translation>
 <translation id="1507198376417198979">Pertsonalizatu Chrome-ko profil berria</translation>
-<translation id="1516530951338665275">Google Chrome-k Bluetooth-a erabiltzeko baimena behar du parekatzen jarraitzeko. <ph name="IDS_BLUETOOTH_DEVICE_CHOOSER_AUTHORIZE_BLUETOOTH_LINK" /></translation>
+<translation id="1516530951338665275">Google Chrome-k Bluetootha erabiltzeko baimena behar du parekatzen jarraitzeko. <ph name="IDS_BLUETOOTH_DEVICE_CHOOSER_AUTHORIZE_BLUETOOTH_LINK" /></translation>
 <translation id="1547295885616600893"><ph name="BEGIN_LINK_CROS_OSS" />Kode irekiko software<ph name="END_LINK_CROS_OSS" /> gehigarriari esker da posible Chrome OS.</translation>
 <translation id="1553358976309200471">Eguneratu Chrome</translation>
 <translation id="1583073672411044740"><ph name="EXISTING_USER" /> erabiltzaileak Chrome-ko profil honetan hasi du saioa dagoeneko. Chrome-ko beste profil bat sortuko da <ph name="USER_EMAIL_ADDRESS" /> helbiderako.</translation>
diff --git a/chrome/browser/background_sync/periodic_background_sync_permission_context.h b/chrome/browser/background_sync/periodic_background_sync_permission_context.h
index 7681233c..5ddee8b 100644
--- a/chrome/browser/background_sync/periodic_background_sync_permission_context.h
+++ b/chrome/browser/background_sync/periodic_background_sync_permission_context.h
@@ -5,6 +5,7 @@
 #ifndef CHROME_BROWSER_BACKGROUND_SYNC_PERIODIC_BACKGROUND_SYNC_PERMISSION_CONTEXT_H_
 #define CHROME_BROWSER_BACKGROUND_SYNC_PERIODIC_BACKGROUND_SYNC_PERMISSION_CONTEXT_H_
 
+#include "base/feature_list.h"
 #include "build/build_config.h"
 #include "components/content_settings/core/common/content_settings.h"
 #include "components/permissions/permission_context_base.h"
@@ -13,6 +14,12 @@
 class BrowserContext;
 }
 
+namespace features {
+
+BASE_DECLARE_FEATURE(kPeriodicSyncPermissionForDefaultSearchEngine);
+
+}  // namespace features
+
 // This permission context is responsible for getting, deciding on and updating
 // the Periodic Background Sync permission for a particular website. This
 // permission guards the use of the Periodic Background Sync API. It's not being
diff --git a/chrome/browser/background_sync/periodic_background_sync_permission_context_unittest.cc b/chrome/browser/background_sync/periodic_background_sync_permission_context_unittest.cc
index b372224..c982cef 100644
--- a/chrome/browser/background_sync/periodic_background_sync_permission_context_unittest.cc
+++ b/chrome/browser/background_sync/periodic_background_sync_permission_context_unittest.cc
@@ -192,8 +192,7 @@
     : public PeriodicBackgroundSyncPermissionContextTest {
  private:
   base::test::ScopedFeatureList feature_list_{
-      base::Feature{"PeriodicSyncPermissionForDefaultSearchEngine",
-                    base::FEATURE_ENABLED_BY_DEFAULT}};
+      features::kPeriodicSyncPermissionForDefaultSearchEngine};
 };
 
 TEST_F(PeriodicBackgroundSyncPermissionContextWithPermissionTest,
diff --git a/chrome/browser/chromeos/extensions/wm/wm_desks_private_apitest.cc b/chrome/browser/chromeos/extensions/wm/wm_desks_private_apitest.cc
index 533e509..95db134 100644
--- a/chrome/browser/chromeos/extensions/wm/wm_desks_private_apitest.cc
+++ b/chrome/browser/chromeos/extensions/wm/wm_desks_private_apitest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "ash/constants/ash_features.h"
+#include "build/build_config.h"
 #include "chrome/browser/extensions/extension_apitest.h"
 #include "content/public/test/browser_test.h"
 
@@ -23,7 +24,14 @@
   base::test::ScopedFeatureList scoped_feature_list;
 };
 
-IN_PROC_BROWSER_TEST_F(WmDesksPrivateApiTest, WmDesksPrivateApiTest) {
+// TODO(crbug.com/1370233): Re-enable this test
+#if BUILDFLAG(IS_LINUX)
+#define MAYBE_WmDesksPrivateApiTest DISABLED_WmDesksPrivateApiTest
+#else
+#define MAYBE_WmDesksPrivateApiTest WmDesksPrivateApiTest
+#endif
+IN_PROC_BROWSER_TEST_F(MAYBE_WmDesksPrivateApiTest,
+                       MAYBE_WmDesksPrivateApiTest) {
   // This loads and runs an extension from
   // chrome/test/data/extensions/api_test/wm_desks_private.
   ASSERT_TRUE(RunExtensionTest("wm_desks_private"));
diff --git a/chrome/browser/chromeos/reporting/metric_default_utils.cc b/chrome/browser/chromeos/reporting/metric_default_utils.cc
index 29d7e19..f2255b9 100644
--- a/chrome/browser/chromeos/reporting/metric_default_utils.cc
+++ b/chrome/browser/chromeos/reporting/metric_default_utils.cc
@@ -15,8 +15,7 @@
                                      base::TimeDelta testing_rate) {
   // If telemetry testing rates flag is enabled, use `testing_rate` to reduce
   // time before metric collection and reporting.
-  return base::FeatureList::IsEnabled(
-             MetricRateController::kEnableTelemetryTestingRates)
+  return base::FeatureList::IsEnabled(kEnableTelemetryTestingRates)
              ? testing_rate
              : default_rate;
 }
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 6321eb34..f129154 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
@@ -5406,10 +5406,6 @@
     : public DeclarativeNetRequestBrowserTest {
  public:
   DeclarativeNetRequestSubresourceWebBundlesBrowserTest() = default;
-  void SetUp() override {
-    feature_list_.InitWithFeatures({features::kSubresourceWebBundles}, {});
-    DeclarativeNetRequestBrowserTest::SetUp();
-  }
   void SetUpOnMainThread() override {
     ExtensionBrowserTest::SetUpOnMainThread();
     CreateTempDir();
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
index 71dd6aa..91db616 100644
--- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -3865,11 +3865,6 @@
   SubresourceWebBundlesWebRequestApiTest& operator=(
       const SubresourceWebBundlesWebRequestApiTest&) = delete;
 
-  void SetUp() override {
-    feature_list_.InitWithFeatures({features::kSubresourceWebBundles}, {});
-    ExtensionApiTest::SetUp();
-  }
-
  protected:
   // Whether 'extraHeaders' is set in opt_extraInfoSpec of addEventListener.
   enum class ExtraInfoSpec {
diff --git a/chrome/browser/extensions/content_script_apitest.cc b/chrome/browser/extensions/content_script_apitest.cc
index 15bf9cd9..6f586ae7 100644
--- a/chrome/browser/extensions/content_script_apitest.cc
+++ b/chrome/browser/extensions/content_script_apitest.cc
@@ -2047,12 +2047,6 @@
 }
 
 class SubresourceWebBundlesContentScriptApiTest : public ExtensionApiTest {
- public:
-  void SetUp() override {
-    feature_list_.InitWithFeatures({features::kSubresourceWebBundles}, {});
-    ExtensionApiTest::SetUp();
-  }
-
  protected:
   // Registers a request handler for static content.
   void RegisterRequestHandler(const std::string& relative_url,
diff --git a/chrome/browser/feed/android/feed_service_bridge.cc b/chrome/browser/feed/android/feed_service_bridge.cc
index ab1f76e..a8e3f14 100644
--- a/chrome/browser/feed/android/feed_service_bridge.cc
+++ b/chrome/browser/feed/android/feed_service_bridge.cc
@@ -100,7 +100,8 @@
     return static_cast<jint>(ContentOrder::kUnspecified);
   JavaUnreadContentObserver* observer = new JavaUnreadContentObserver(
       base::android::ScopedJavaGlobalRef<jobject>(j_observer));
-  api->AddUnreadContentObserver(is_web_feed ? kWebFeedStream : kForYouStream,
+  api->AddUnreadContentObserver(is_web_feed ? StreamType(StreamKind::kFollowing)
+                                            : StreamType(StreamKind::kForYou),
                                 observer);
   return reinterpret_cast<jlong>(observer);
 }
@@ -119,7 +120,8 @@
   FeedApi* api = GetFeedApi();
   if (!api)
     return 0;
-  return static_cast<int>(api->GetContentOrder(kWebFeedStream));
+  return static_cast<int>(
+      api->GetContentOrder(StreamType(StreamKind::kFollowing)));
 }
 
 static void JNI_FeedServiceBridge_SetContentOrderForWebFeed(
@@ -130,10 +132,12 @@
     return;
   switch (content_order) {
     case static_cast<jint>(ContentOrder::kGrouped):
-      api->SetContentOrder(kWebFeedStream, ContentOrder::kGrouped);
+      api->SetContentOrder(StreamType(StreamKind::kFollowing),
+                           ContentOrder::kGrouped);
       return;
     case static_cast<jint>(ContentOrder::kReverseChron):
-      api->SetContentOrder(kWebFeedStream, ContentOrder::kReverseChron);
+      api->SetContentOrder(StreamType(StreamKind::kFollowing),
+                           ContentOrder::kReverseChron);
       return;
     case static_cast<jint>(ContentOrder::kUnspecified):
       break;
diff --git a/chrome/browser/media/router/providers/cast/app_activity.cc b/chrome/browser/media/router/providers/cast/app_activity.cc
index a6765f8..82040d06 100644
--- a/chrome/browser/media/router/providers/cast/app_activity.cc
+++ b/chrome/browser/media/router/providers/cast/app_activity.cc
@@ -94,8 +94,9 @@
       cast_message.client_id(), std::move(callback));
 }
 
-void AppActivity::SendMediaStatusToClients(const base::Value& media_status,
-                                           absl::optional<int> request_id) {
+void AppActivity::SendMediaStatusToClients(
+    const base::Value::Dict& media_status,
+    absl::optional<int> request_id) {
   CastActivity::SendMediaStatusToClients(media_status, request_id);
   if (media_controller_)
     media_controller_->SetMediaStatus(media_status);
diff --git a/chrome/browser/media/router/providers/cast/app_activity.h b/chrome/browser/media/router/providers/cast/app_activity.h
index 826b6495..012eb5b3 100644
--- a/chrome/browser/media/router/providers/cast/app_activity.h
+++ b/chrome/browser/media/router/providers/cast/app_activity.h
@@ -38,7 +38,7 @@
               CastSessionTracker* session_tracker);
   ~AppActivity() override;
 
-  void SendMediaStatusToClients(const base::Value& media_status,
+  void SendMediaStatusToClients(const base::Value::Dict& media_status,
                                 absl::optional<int> request_id) override;
   void OnAppMessage(const cast::channel::CastMessage& message) override;
   void OnInternalMessage(const cast_channel::InternalMessage& message) override;
diff --git a/chrome/browser/media/router/providers/cast/app_activity_unittest.cc b/chrome/browser/media/router/providers/cast/app_activity_unittest.cc
index 40a91668..1dce123 100644
--- a/chrome/browser/media/router/providers/cast/app_activity_unittest.cc
+++ b/chrome/browser/media/router/providers/cast/app_activity_unittest.cc
@@ -314,8 +314,8 @@
 
   auto* client = AddMockClient("theClientId");
   auto message = cast_channel::CreateCastMessage(
-      "urn:x-cast:com.google.foo", base::Value(base::Value::Type::DICTIONARY),
-      "sourceId", "theClientId");
+      "urn:x-cast:com.google.foo", base::Value(base::Value::Dict()), "sourceId",
+      "theClientId");
   EXPECT_CALL(*client,
               SendMessageToClient(IsPresentationConnectionMessage(
                   CreateAppMessage("theSessionId", "theClientId", message)
@@ -329,8 +329,8 @@
   auto* client1 = AddMockClient("theClientId1");
   auto* client2 = AddMockClient("theClientId2");
   auto message = cast_channel::CreateCastMessage(
-      "urn:x-cast:com.google.foo", base::Value(base::Value::Type::DICTIONARY),
-      "sourceId", "*");
+      "urn:x-cast:com.google.foo", base::Value(base::Value::Dict()), "sourceId",
+      "*");
   EXPECT_CALL(*client1,
               SendMessageToClient(IsPresentationConnectionMessage(
                   CreateAppMessage("theSessionId", "theClientId1", message)
diff --git a/chrome/browser/media/router/providers/cast/cast_activity.cc b/chrome/browser/media/router/providers/cast/cast_activity.cc
index dcebaea8..de4cc5bf 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity.cc
+++ b/chrome/browser/media/router/providers/cast/cast_activity.cc
@@ -106,8 +106,9 @@
   it->second->SendMessageToClient(std::move(message));
 }
 
-void CastActivity::SendMediaStatusToClients(const base::Value& media_status,
-                                            absl::optional<int> request_id) {
+void CastActivity::SendMediaStatusToClients(
+    const base::Value::Dict& media_status,
+    absl::optional<int> request_id) {
   for (auto& client : connected_clients_)
     client.second->SendMediaStatusToClient(media_status, request_id);
 }
diff --git a/chrome/browser/media/router/providers/cast/cast_activity.h b/chrome/browser/media/router/providers/cast/cast_activity.h
index b3dfc75..ca42b4a 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity.h
+++ b/chrome/browser/media/router/providers/cast/cast_activity.h
@@ -87,7 +87,7 @@
       const std::string& client_id,
       blink::mojom::PresentationConnectionMessagePtr message);
 
-  virtual void SendMediaStatusToClients(const base::Value& media_status,
+  virtual void SendMediaStatusToClients(const base::Value::Dict& media_status,
                                         absl::optional<int> request_id);
 
   // Handles a message forwarded by CastActivityManager.
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_manager.cc b/chrome/browser/media/router/providers/cast/cast_activity_manager.cc
index 6457bd1..8cbc11e2 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_manager.cc
+++ b/chrome/browser/media/router/providers/cast/cast_activity_manager.cc
@@ -623,9 +623,10 @@
   }
 }
 
-void CastActivityManager::OnMediaStatusUpdated(const MediaSinkInternal& sink,
-                                               const base::Value& media_status,
-                                               absl::optional<int> request_id) {
+void CastActivityManager::OnMediaStatusUpdated(
+    const MediaSinkInternal& sink,
+    const base::Value::Dict& media_status,
+    absl::optional<int> request_id) {
   auto it = FindActivityBySink(sink);
   if (it != activities_.end()) {
     it->second->SendMediaStatusToClients(media_status, request_id);
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_manager.h b/chrome/browser/media/router/providers/cast/cast_activity_manager.h
index 75c6bd10..65967c0 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_manager.h
+++ b/chrome/browser/media/router/providers/cast/cast_activity_manager.h
@@ -117,7 +117,7 @@
                                const CastSession& session) override;
   void OnSessionRemoved(const MediaSinkInternal& sink) override;
   void OnMediaStatusUpdated(const MediaSinkInternal& sink,
-                            const base::Value& media_status,
+                            const base::Value::Dict& media_status,
                             absl::optional<int> request_id) override;
 
   static void SetActitityFactoryForTest(CastActivityFactoryForTest* factory) {
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_manager_unittest.cc b/chrome/browser/media/router/providers/cast/cast_activity_manager_unittest.cc
index 81c44b6..05c20de1 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_manager_unittest.cc
+++ b/chrome/browser/media/router/providers/cast/cast_activity_manager_unittest.cc
@@ -44,7 +44,6 @@
 #include "third_party/openscreen/src/cast/common/public/cast_streaming_app_ids.h"
 
 using base::test::IsJson;
-using base::test::ParseJson;
 using base::test::ParseJsonDict;
 using testing::_;
 using testing::AnyNumber;
@@ -846,8 +845,8 @@
 
   // Destination ID matches client ID.
   cast::channel::CastMessage message = cast_channel::CreateCastMessage(
-      "urn:x-cast:com.google.foo", base::Value(base::Value::Type::DICTIONARY),
-      "sourceId", "theClientId");
+      "urn:x-cast:com.google.foo", base::Value(base::Value::Dict()), "sourceId",
+      "theClientId");
 
   EXPECT_CALL(*app_activity_, OnAppMessage(IsCastChannelMessage(message)));
   manager_->OnAppMessage(kChannelId, message);
@@ -861,7 +860,7 @@
 
   EXPECT_CALL(*app_activity_,
               SendMediaStatusToClients(IsJson(status), request_id));
-  manager_->OnMediaStatusUpdated(sink_, ParseJson(status), request_id);
+  manager_->OnMediaStatusUpdated(sink_, ParseJsonDict(status), request_id);
 }
 
 TEST_F(CastActivityManagerTest, SecondPendingRequestCancelsTheFirst) {
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_test_base.h b/chrome/browser/media/router/providers/cast/cast_activity_test_base.h
index f44efc5c..2efdabd7 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_test_base.h
+++ b/chrome/browser/media/router/providers/cast/cast_activity_test_base.h
@@ -38,7 +38,7 @@
   MOCK_METHOD1(SendMessageToClient,
                void(blink::mojom::PresentationConnectionMessagePtr message));
   MOCK_METHOD2(SendMediaStatusToClient,
-               void(const base::Value& media_status,
+               void(const base::Value::Dict& media_status,
                     absl::optional<int> request_id));
   MOCK_METHOD1(
       CloseConnection,
@@ -50,7 +50,8 @@
                void(int sequence_number,
                     CastInternalMessage::ErrorCode error_code,
                     absl::optional<std::string> description));
-  MOCK_METHOD2(SendErrorToClient, void(int sequence_number, base::Value error));
+  MOCK_METHOD2(SendErrorToClient,
+               void(int sequence_number, base::Value::Dict error));
   MOCK_METHOD1(OnMessage,
                void(blink::mojom::PresentationConnectionMessagePtr message));
   MOCK_METHOD1(DidChangeState,
diff --git a/chrome/browser/media/router/providers/cast/cast_internal_message_util.cc b/chrome/browser/media/router/providers/cast/cast_internal_message_util.cc
index c82f829..a8c9b6c2 100644
--- a/chrome/browser/media/router/providers/cast/cast_internal_message_util.cc
+++ b/chrome/browser/media/router/providers/cast/cast_internal_message_util.cc
@@ -163,17 +163,25 @@
 
 blink::mojom::PresentationConnectionMessagePtr CreateMessageCommon(
     CastInternalMessage::Type type,
-    base::Value payload,
+    base::Value::Dict payload,
     const std::string& client_id,
     absl::optional<int> sequence_number = absl::nullopt) {
-  base::Value message(base::Value::Type::DICTIONARY);
-  message.SetKey("type", base::Value(CastInternalMessageTypeToString(type)));
-  message.SetKey("message", std::move(payload));
+  base::Value::Dict message;
+
+  message.Set("type", base::Value(CastInternalMessageTypeToString(type)));
+
+  // When `payload` is empty, we want to set `message` to null instead of {} in
+  // the JSON that is generated.
+  if (payload.empty())
+    message.Set("message", base::Value());
+  else
+    message.Set("message", std::move(payload));
+
   if (sequence_number) {
-    message.SetKey("sequenceNumber", base::Value(*sequence_number));
+    message.Set("sequenceNumber", base::Value(*sequence_number));
   }
-  message.SetKey("timeoutMillis", base::Value(0));
-  message.SetKey("clientId", base::Value(client_id));
+  message.Set("timeoutMillis", base::Value(0));
+  message.Set("clientId", base::Value(client_id));
 
   std::string str;
   CHECK(base::JSONWriter::Write(message, &str));
@@ -190,28 +198,28 @@
   message.Set("action", action_type);
 
   return CreateMessageCommon(CastInternalMessage::Type::kReceiverAction,
-                             base::Value(std::move(message)), client_id);
+                             std::move(message), client_id);
 }
 
-base::Value CreateAppMessageBody(
+base::Value::Dict CreateAppMessageBody(
     const std::string& session_id,
     const cast::channel::CastMessage& cast_message) {
   // TODO(https://crbug.com/862532): Investigate whether it is possible to move
   // instead of copying the contents of |cast_message|. Right now copying is
   // done because the message is passed as a const ref at the
   // CastSocket::Observer level.
-  base::Value message(base::Value::Type::DICTIONARY);
-  message.SetKey("sessionId", base::Value(session_id));
-  message.SetKey("namespaceName", base::Value(cast_message.namespace_()));
+  base::Value::Dict message;
+  message.Set("sessionId", base::Value(session_id));
+  message.Set("namespaceName", base::Value(cast_message.namespace_()));
   switch (cast_message.payload_type()) {
     case cast::channel::CastMessage_PayloadType_STRING:
-      message.SetKey("message", base::Value(cast_message.payload_utf8()));
+      message.Set("message", base::Value(cast_message.payload_utf8()));
       break;
     case cast::channel::CastMessage_PayloadType_BINARY: {
       const auto& payload = cast_message.payload_binary();
-      message.SetKey("message",
-                     base::Value(base::Value::BlobStorage(
-                         payload.front(), payload.front() + payload.size())));
+      message.Set("message",
+                  base::Value(base::Value::BlobStorage(
+                      payload.front(), payload.front() + payload.size())));
       break;
     }
     default:
@@ -235,8 +243,8 @@
   DCHECK(!session_with_receiver_label.FindByDottedPath("receiver.label"));
   session_with_receiver_label.SetByDottedPath(
       "receiver.label", base::Value(GetReceiverLabel(sink, hash_token)));
-  return CreateMessageCommon(
-      type, base::Value(std::move(session_with_receiver_label)), client_id);
+  return CreateMessageCommon(type, std::move(session_with_receiver_label),
+                             client_id);
 }
 
 }  // namespace
@@ -481,7 +489,7 @@
     const std::string& client_id,
     int sequence_number) {
   return CreateMessageCommon(CastInternalMessage::Type::kAppMessage,
-                             base::Value(), client_id, sequence_number);
+                             base::Value::Dict(), client_id, sequence_number);
 }
 
 blink::mojom::PresentationConnectionMessagePtr CreateAppMessage(
@@ -495,7 +503,7 @@
 
 blink::mojom::PresentationConnectionMessagePtr CreateV2Message(
     const std::string& client_id,
-    const base::Value& payload,
+    const base::Value::Dict& payload,
     absl::optional<int> sequence_number) {
   return CreateMessageCommon(CastInternalMessage::Type::kV2Message,
                              payload.Clone(), client_id, sequence_number);
@@ -505,12 +513,12 @@
     const std::string& client_id,
     absl::optional<int> sequence_number) {
   return CreateMessageCommon(CastInternalMessage::Type::kLeaveSession,
-                             base::Value(), client_id, sequence_number);
+                             base::Value::Dict(), client_id, sequence_number);
 }
 
 blink::mojom::PresentationConnectionMessagePtr CreateErrorMessage(
     const std::string& client_id,
-    base::Value error,
+    base::Value::Dict error,
     absl::optional<int> sequence_number) {
   return CreateMessageCommon(CastInternalMessage::Type::kError,
                              std::move(error), client_id, sequence_number);
diff --git a/chrome/browser/media/router/providers/cast/cast_internal_message_util.h b/chrome/browser/media/router/providers/cast/cast_internal_message_util.h
index 03a8b3a..2b1c3ac 100644
--- a/chrome/browser/media/router/providers/cast/cast_internal_message_util.h
+++ b/chrome/browser/media/router/providers/cast/cast_internal_message_util.h
@@ -230,11 +230,11 @@
     const CastMessage& cast_message);
 blink::mojom::PresentationConnectionMessagePtr CreateV2Message(
     const std::string& client_id,
-    const base::Value& payload,
+    const base::Value::Dict& payload,
     absl::optional<int> sequence_number);
 blink::mojom::PresentationConnectionMessagePtr CreateErrorMessage(
     const std::string& client_id,
-    base::Value error,
+    base::Value::Dict error,
     absl::optional<int> sequence_number);
 blink::mojom::PresentationConnectionMessagePtr CreateLeaveSessionAckMessage(
     const std::string& client_id,
diff --git a/chrome/browser/media/router/providers/cast/cast_internal_message_util_unittest.cc b/chrome/browser/media/router/providers/cast/cast_internal_message_util_unittest.cc
index d09ad17..2746eb9 100644
--- a/chrome/browser/media/router/providers/cast/cast_internal_message_util_unittest.cc
+++ b/chrome/browser/media/router/providers/cast/cast_internal_message_util_unittest.cc
@@ -518,8 +518,8 @@
 }
 
 TEST(CastInternalMessageUtilTest, CreateV2Message) {
-  base::Value message_body(base::Value::Type::DICTIONARY);
-  message_body.SetKey("foo", base::Value("bar"));
+  base::Value::Dict message_body;
+  message_body.Set("foo", base::Value("bar"));
 
   auto message = CreateV2Message("client_id", message_body, 12345);
   EXPECT_THAT(message, IsPresentationConnectionMessage(R"({
diff --git a/chrome/browser/media/router/providers/cast/cast_media_controller.cc b/chrome/browser/media/router/providers/cast/cast_media_controller.cc
index 1d4bd80..b8e955d 100644
--- a/chrome/browser/media/router/providers/cast/cast_media_controller.cc
+++ b/chrome/browser/media/router/providers/cast/cast_media_controller.cc
@@ -166,7 +166,8 @@
   observer_->OnMediaStatusUpdated(media_status_.Clone());
 }
 
-void CastMediaController::SetMediaStatus(const base::Value& status_value) {
+void CastMediaController::SetMediaStatus(
+    const base::Value::Dict& status_value) {
   UpdateMediaStatus(status_value);
   observer_->OnMediaStatusUpdated(media_status_.Clone());
 }
@@ -196,34 +197,36 @@
   return request;
 }
 
-void CastMediaController::UpdateMediaStatus(const base::Value& message_value) {
-  const base::Value* status_list_value = message_value.FindKey("status");
-  if (!status_list_value || !status_list_value->is_list())
+void CastMediaController::UpdateMediaStatus(
+    const base::Value::Dict& message_value) {
+  const base::Value::List* status_list = message_value.FindList("status");
+  if (!status_list)
     return;
-  base::Value::ConstListView status_list =
-      status_list_value->GetListDeprecated();
-  if (status_list.empty())
+  if (status_list->empty())
     return;
-  const base::Value& status_value = status_list[0];
+  const base::Value& status_value = (*status_list)[0];
   if (!status_value.is_dict())
     return;
-  SetIfNonNegative(&media_session_id_, status_value.FindKey("mediaSessionId"));
+  SetIfNonNegative(&media_session_id_,
+                   status_value.GetDict().Find("mediaSessionId"));
   SetIfValid(&media_status_.title,
-             status_value.FindPath("media.metadata.title"));
-  SetIfValid(&media_status_.secondary_title,
-             status_value.FindPath("media.metadata.subtitle"));
+             status_value.GetDict().FindByDottedPath("media.metadata.title"));
+  SetIfValid(
+      &media_status_.secondary_title,
+      status_value.GetDict().FindByDottedPath("media.metadata.subtitle"));
   SetIfNonNegative(&media_status_.current_time,
-                   status_value.FindKey("currentTime"));
+                   status_value.GetDict().Find("currentTime"));
   SetIfNonNegative(&media_status_.duration,
-                   status_value.FindPath("media.duration"));
+                   status_value.GetDict().FindByDottedPath("media.duration"));
 
-  const base::Value* images = status_value.FindPath("media.metadata.images");
-  if (images && images->is_list()) {
+  const base::Value::List* images =
+      status_value.GetDict().FindListByDottedPath("media.metadata.images");
+  if (images) {
     media_status_.images.clear();
-    for (const base::Value& image_value : images->GetListDeprecated()) {
+    for (const base::Value& image_value : *images) {
       if (!image_value.is_dict())
         continue;
-      const std::string* url_string = image_value.FindStringKey("url");
+      const std::string* url_string = image_value.GetDict().FindString("url");
       if (!url_string)
         continue;
       media_status_.images.emplace_back(absl::in_place, GURL(*url_string),
@@ -231,31 +234,29 @@
     }
   }
 
-  const base::Value* commands_value =
-      status_value.FindListKey("supportedMediaCommands");
-  if (commands_value) {
-    const base::ListValue& commands_list =
-        base::Value::AsListValue(*commands_value);
+  const base::Value::List* commands_list =
+      status_value.GetDict().FindList("supportedMediaCommands");
+  if (commands_list) {
     // |can_set_volume| and |can_mute| are not used, because the receiver volume
     // info obtained in SetSession() is used instead.
-    media_status_.can_play_pause = base::Contains(
-        commands_list.GetListDeprecated(), base::Value(kMediaCommandPause));
-    media_status_.can_seek = base::Contains(commands_list.GetListDeprecated(),
-                                            base::Value(kMediaCommandSeek));
-    media_status_.can_skip_to_next_track = base::Contains(
-        commands_list.GetListDeprecated(), base::Value(kMediaCommandQueueNext));
-    media_status_.can_skip_to_previous_track = base::Contains(
-        commands_list.GetListDeprecated(), base::Value(kMediaCommandQueuePrev));
+    media_status_.can_play_pause =
+        base::Contains(*commands_list, base::Value(kMediaCommandPause));
+    media_status_.can_seek =
+        base::Contains(*commands_list, base::Value(kMediaCommandSeek));
+    media_status_.can_skip_to_next_track =
+        base::Contains(*commands_list, base::Value(kMediaCommandQueueNext));
+    media_status_.can_skip_to_previous_track =
+        base::Contains(*commands_list, base::Value(kMediaCommandQueuePrev));
   }
 
-  const base::Value* player_state = status_value.FindKey("playerState");
-  if (player_state && player_state->is_string()) {
-    const std::string& state = player_state->GetString();
-    if (state == "PLAYING") {
+  const std::string* player_state =
+      status_value.GetDict().FindString("playerState");
+  if (player_state) {
+    if (*player_state == "PLAYING") {
       media_status_.play_state = mojom::MediaStatus::PlayState::PLAYING;
-    } else if (state == "PAUSED") {
+    } else if (*player_state == "PAUSED") {
       media_status_.play_state = mojom::MediaStatus::PlayState::PAUSED;
-    } else if (state == "BUFFERING") {
+    } else if (*player_state == "BUFFERING") {
       media_status_.play_state = mojom::MediaStatus::PlayState::BUFFERING;
     }
   }
diff --git a/chrome/browser/media/router/providers/cast/cast_media_controller.h b/chrome/browser/media/router/providers/cast/cast_media_controller.h
index e1dbff8..00f2939 100644
--- a/chrome/browser/media/router/providers/cast/cast_media_controller.h
+++ b/chrome/browser/media/router/providers/cast/cast_media_controller.h
@@ -70,7 +70,7 @@
   // These methods may notify the MediaStatusObserver that the status has been
   // updated.
   void SetSession(const CastSession& session);
-  void SetMediaStatus(const base::Value& media_status);
+  void SetMediaStatus(const base::Value::Dict& media_status);
 
   const std::string& sender_id() const { return sender_id_; }
 
@@ -78,7 +78,7 @@
   base::Value::Dict CreateMediaRequest(cast_channel::V2MessageType type);
   base::Value::Dict CreateVolumeRequest();
 
-  void UpdateMediaStatus(const base::Value& message_value);
+  void UpdateMediaStatus(const base::Value::Dict& message_value);
 
   const std::string sender_id_;
   const raw_ptr<AppActivity> activity_;
diff --git a/chrome/browser/media/router/providers/cast/cast_media_controller_unittest.cc b/chrome/browser/media/router/providers/cast/cast_media_controller_unittest.cc
index 2a8782a..9a7670c 100644
--- a/chrome/browser/media/router/providers/cast/cast_media_controller_unittest.cc
+++ b/chrome/browser/media/router/providers/cast/cast_media_controller_unittest.cc
@@ -192,9 +192,9 @@
   }
 
   void SetMediaStatus(Value status_value) {
-    Value status_list(Value::Type::DICTIONARY);
-    status_list.SetKey("status", Value(Value::Type::LIST));
-    status_list.FindKey("status")->Append(std::move(status_value));
+    Value::Dict status_list;
+    status_list.Set("status", Value(Value::List()));
+    status_list.FindList("status")->Append(std::move(status_value));
 
     controller_->SetMediaStatus(status_list);
   }
diff --git a/chrome/browser/media/router/providers/cast/cast_session_client.h b/chrome/browser/media/router/providers/cast/cast_session_client.h
index b4dc4f387..495ceda 100644
--- a/chrome/browser/media/router/providers/cast/cast_session_client.h
+++ b/chrome/browser/media/router/providers/cast/cast_session_client.h
@@ -50,7 +50,7 @@
   // Sends a media status message to the client.  If |request_id| is given, it
   // is used to look up the sequence number of a previous request, which is
   // included in the outgoing message.
-  virtual void SendMediaStatusToClient(const base::Value& media_status,
+  virtual void SendMediaStatusToClient(const base::Value::Dict& media_status,
                                        absl::optional<int> request_id) = 0;
 
   // Changes the PresentationConnection state to CLOSED/TERMINATED and resets
@@ -80,7 +80,8 @@
   // NOTE: This is current only called from SendErrorCodeToClient, but based on
   // the old code this method based on, it seems likely it will have other
   // callers once error handling for the Cast MRP is more fleshed out.
-  virtual void SendErrorToClient(int sequence_number, base::Value error) = 0;
+  virtual void SendErrorToClient(int sequence_number,
+                                 base::Value::Dict error) = 0;
 
  private:
   std::string client_id_;
diff --git a/chrome/browser/media/router/providers/cast/cast_session_client_impl.cc b/chrome/browser/media/router/providers/cast/cast_session_client_impl.cc
index c8159e1..7f24212 100644
--- a/chrome/browser/media/router/providers/cast/cast_session_client_impl.cc
+++ b/chrome/browser/media/router/providers/cast/cast_session_client_impl.cc
@@ -29,12 +29,12 @@
 // null.
 void RemoveNullFields(base::Value& value) {
   if (value.is_list()) {
-    for (auto& item : value.GetListDeprecated()) {
+    for (auto& item : value.GetList()) {
       RemoveNullFields(item);
     }
   } else if (value.is_dict()) {
     std::vector<std::string> to_remove;
-    for (auto pair : value.DictItems()) {
+    for (auto pair : value.GetDict()) {
       if (pair.second.is_none()) {
         to_remove.push_back(pair.first);
       } else {
@@ -78,7 +78,7 @@
 }
 
 void CastSessionClientImpl::SendMediaStatusToClient(
-    const base::Value& media_status,
+    const base::Value::Dict& media_status,
     absl::optional<int> request_id) {
   // Look up if there is a pending request from this client associated with this
   // message. If so, send the media status message as a response by setting the
@@ -131,16 +131,16 @@
     int sequence_number,
     CastInternalMessage::ErrorCode error_code,
     absl::optional<std::string> description) {
-  base::Value message(base::Value::Type::DICTIONARY);
-  message.SetKey("code", base::Value(*cast_util::EnumToString(error_code)));
-  message.SetKey("description",
-                 description ? base::Value(*description) : base::Value());
-  message.SetKey("details", base::Value());
+  base::Value::Dict message;
+  message.Set("code", base::Value(*cast_util::EnumToString(error_code)));
+  message.Set("description",
+              description ? base::Value(*description) : base::Value());
+  message.Set("details", base::Value());
   SendErrorToClient(sequence_number, std::move(message));
 }
 
 void CastSessionClientImpl::SendErrorToClient(int sequence_number,
-                                              base::Value error) {
+                                              base::Value::Dict error) {
   SendMessageToClient(
       CreateErrorMessage(client_id(), std::move(error), sequence_number));
 }
@@ -258,7 +258,7 @@
   if (result == cast_channel::Result::kOk) {
     // Send an empty message to let the client know the request succeeded.
     SendMessageToClient(
-        CreateV2Message(client_id(), base::Value(), sequence_number));
+        CreateV2Message(client_id(), base::Value::Dict(), sequence_number));
   } else {
     // TODO(crbug.com/951089): Send correct error codes.  The original
     // implementation isn't much help here because it sends incorrectly
diff --git a/chrome/browser/media/router/providers/cast/cast_session_client_impl.h b/chrome/browser/media/router/providers/cast/cast_session_client_impl.h
index b87b30e7..a4e2c7f 100644
--- a/chrome/browser/media/router/providers/cast/cast_session_client_impl.h
+++ b/chrome/browser/media/router/providers/cast/cast_session_client_impl.h
@@ -31,7 +31,7 @@
   // and other methods.
   void SendMessageToClient(
       blink::mojom::PresentationConnectionMessagePtr message) override;
-  void SendMediaStatusToClient(const base::Value& media_status,
+  void SendMediaStatusToClient(const base::Value::Dict& media_status,
                                absl::optional<int> request_id) override;
   void CloseConnection(
       blink::mojom::PresentationConnectionCloseReason close_reason) override;
@@ -41,7 +41,7 @@
   void SendErrorCodeToClient(int sequence_number,
                              CastInternalMessage::ErrorCode error_code,
                              absl::optional<std::string> description) override;
-  void SendErrorToClient(int sequence_number, base::Value error) override;
+  void SendErrorToClient(int sequence_number, base::Value::Dict error) override;
 
   // blink::mojom::PresentationConnection implementation
   void OnMessage(
diff --git a/chrome/browser/media/router/providers/cast/cast_session_client_unittest.cc b/chrome/browser/media/router/providers/cast/cast_session_client_unittest.cc
index 3dbb5038..bb9e2ea 100644
--- a/chrome/browser/media/router/providers/cast/cast_session_client_unittest.cc
+++ b/chrome/browser/media/router/providers/cast/cast_session_client_unittest.cc
@@ -32,7 +32,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 using base::test::IsJson;
-using base::test::ParseJson;
+using base::test::ParseJsonDict;
 using blink::mojom::PresentationConnectionCloseReason;
 using testing::_;
 using testing::AllOf;
@@ -244,7 +244,7 @@
     "timeoutMillis": 0,
     "type": "v2_message"
   })")));
-  client_->SendMediaStatusToClient(ParseJson(R"({"foo": "bar"})"), 123);
+  client_->SendMediaStatusToClient(ParseJsonDict(R"({"foo": "bar"})"), 123);
 }
 
 TEST_F(CastSessionClientImplTest, SendSetVolumeCommandToReceiver) {
diff --git a/chrome/browser/media/router/providers/cast/cast_session_tracker.cc b/chrome/browser/media/router/providers/cast/cast_session_tracker.cc
index 8f479b49..206f9295 100644
--- a/chrome/browser/media/router/providers/cast/cast_session_tracker.cc
+++ b/chrome/browser/media/router/providers/cast/cast_session_tracker.cc
@@ -155,12 +155,9 @@
   absl::optional<int> request_id =
       cast_channel::GetRequestIdFromResponse(updated_message);
 
-  // NOTE: Media status is always passed as a dictionary. Consider making
-  // OnMediaStatusUpdated() take a base::Value::Dict.
-  base::Value updated_message_value(std::move(updated_message));
   // Notify observers of media update.
   for (auto& observer : observers_)
-    observer.OnMediaStatusUpdated(sink, updated_message_value, request_id);
+    observer.OnMediaStatusUpdated(sink, updated_message, request_id);
 }
 
 void CastSessionTracker::CopySavedMediaFieldsToMediaList(
diff --git a/chrome/browser/media/router/providers/cast/cast_session_tracker.h b/chrome/browser/media/router/providers/cast/cast_session_tracker.h
index d9d7730..15eeca8b 100644
--- a/chrome/browser/media/router/providers/cast/cast_session_tracker.h
+++ b/chrome/browser/media/router/providers/cast/cast_session_tracker.h
@@ -36,7 +36,7 @@
                                          const CastSession& session) = 0;
     virtual void OnSessionRemoved(const MediaSinkInternal& sink) = 0;
     virtual void OnMediaStatusUpdated(const MediaSinkInternal& sink,
-                                      const base::Value& media_status,
+                                      const base::Value::Dict& media_status,
                                       absl::optional<int> request_id) = 0;
   };
 
diff --git a/chrome/browser/media/router/providers/cast/cast_session_tracker_unittest.cc b/chrome/browser/media/router/providers/cast/cast_session_tracker_unittest.cc
index 51ae73c6..09809230 100644
--- a/chrome/browser/media/router/providers/cast/cast_session_tracker_unittest.cc
+++ b/chrome/browser/media/router/providers/cast/cast_session_tracker_unittest.cc
@@ -74,7 +74,7 @@
   MOCK_METHOD1(OnSessionRemoved, void(const MediaSinkInternal& sink));
   MOCK_METHOD3(OnMediaStatusUpdated,
                void(const MediaSinkInternal& sink,
-                    const base::Value& media_status,
+                    const base::Value::Dict& media_status,
                     absl::optional<int> request_id));
 };
 
diff --git a/chrome/browser/media/router/providers/cast/mock_app_activity.h b/chrome/browser/media/router/providers/cast/mock_app_activity.h
index eaf7adcf..c0e9d8a 100644
--- a/chrome/browser/media/router/providers/cast/mock_app_activity.h
+++ b/chrome/browser/media/router/providers/cast/mock_app_activity.h
@@ -48,7 +48,7 @@
                void(const std::string& client_id,
                     blink::mojom::PresentationConnectionMessagePtr message));
   MOCK_METHOD2(SendMediaStatusToClients,
-               void(const base::Value& media_status,
+               void(const base::Value::Dict& media_status,
                     absl::optional<int> request_id));
   MOCK_METHOD1(
       ClosePresentationConnections,
diff --git a/chrome/browser/media/router/providers/dial/dial_internal_message_fuzzer.cc b/chrome/browser/media/router/providers/dial/dial_internal_message_fuzzer.cc
index 9f032728..897a7426 100644
--- a/chrome/browser/media/router/providers/dial/dial_internal_message_fuzzer.cc
+++ b/chrome/browser/media/router/providers/dial/dial_internal_message_fuzzer.cc
@@ -18,12 +18,12 @@
 
   absl::optional<base::Value> input = base::JSONReader::Read(
       std::string(reinterpret_cast<const char*>(data), size));
-  if (!input)
+  if (!input || !input.value().is_dict())
     return 0;
 
   std::string error_unused;
-  auto dial_internal_message =
-      DialInternalMessage::From(std::move(input.value()), &error_unused);
+  auto dial_internal_message = DialInternalMessage::From(
+      std::move(input.value().GetDict()), &error_unused);
   if (!dial_internal_message)
     return 0;
 
diff --git a/chrome/browser/media/router/providers/dial/dial_internal_message_util.cc b/chrome/browser/media/router/providers/dial/dial_internal_message_util.cc
index ba790cd5..1aec2c28 100644
--- a/chrome/browser/media/router/providers/dial/dial_internal_message_util.cc
+++ b/chrome/browser/media/router/providers/dial/dial_internal_message_util.cc
@@ -114,49 +114,38 @@
 
 // static
 std::unique_ptr<DialInternalMessage> DialInternalMessage::From(
-    base::Value message,
+    base::Value::Dict message,
     std::string* error) {
   DCHECK(error);
-  if (!message.is_dict()) {
-    *error = "Input message was not a dictionary";
-    return nullptr;
-  }
 
-  base::Value* type_value =
-      message.FindKeyOfType("type", base::Value::Type::STRING);
+  std::string* type_value = message.FindString("type");
   if (!type_value) {
     *error = "Missing type value";
     return nullptr;
   }
 
   DialInternalMessageType message_type =
-      StringToDialInternalMessageType(type_value->GetString());
+      StringToDialInternalMessageType(*type_value);
   if (message_type == DialInternalMessageType::kOther) {
     *error = "Unsupported message type";
     return nullptr;
   }
 
-  base::Value* client_id_value =
-      message.FindKeyOfType("clientId", base::Value::Type::STRING);
-  if (!client_id_value) {
+  std::string* client_id = message.FindString("clientId");
+  if (!client_id) {
     *error = "Missing clientId";
     return nullptr;
   }
 
   absl::optional<base::Value> message_body;
-  base::Value* message_body_value = message.FindKey("message");
+  base::Value* message_body_value = message.Find("message");
   if (message_body_value)
     message_body = std::move(*message_body_value);
 
-  int sequence_number = -1;
-  base::Value* sequence_number_value =
-      message.FindKeyOfType("sequenceNumber", base::Value::Type::INTEGER);
-  if (sequence_number_value)
-    sequence_number = sequence_number_value->GetInt();
+  int sequence_number = message.FindInt("sequenceNumber").value_or(-1);
 
   return std::make_unique<DialInternalMessage>(
-      message_type, std::move(message_body), client_id_value->GetString(),
-      sequence_number);
+      message_type, std::move(message_body), *client_id, sequence_number);
 }
 
 DialInternalMessage::DialInternalMessage(DialInternalMessageType type,
@@ -282,14 +271,14 @@
     absl::optional<int> http_error_code) const {
   // The structure of an error message body is defined as chrome.cast.Error in
   // the Cast SDK.
-  base::Value body(base::Value::Type::DICTIONARY);
-  body.SetStringKey("code", DialAppInfoErrorToString(result_code));
-  body.SetStringKey("description", error_message);
+  base::Value::Dict body;
+  body.Set("code", DialAppInfoErrorToString(result_code));
+  body.Set("description", error_message);
   if (result_code == DialAppInfoResultCode::kHttpError) {
     DCHECK(http_error_code);
-    base::Value details(base::Value::Type::DICTIONARY);
-    details.SetIntKey("http_error_code", *http_error_code);
-    body.SetKey("details", std::move(details));
+    base::Value::Dict details;
+    details.Set("http_error_code", *http_error_code);
+    body.Set("details", std::move(details));
   }
   base::Value message =
       CreateDialMessageCommon(DialInternalMessageType::kError, std::move(body),
@@ -297,84 +286,84 @@
   return message_util::RouteMessageFromValue(std::move(message));
 }
 
-base::Value DialInternalMessageUtil::CreateReceiver(
+base::Value::Dict DialInternalMessageUtil::CreateReceiver(
     const MediaSinkInternal& sink) const {
-  base::Value receiver(base::Value::Type::DICTIONARY);
+  base::Value::Dict receiver;
 
   std::string label = base::SHA1HashString(sink.sink().id() + hash_token_);
   base::Base64UrlEncode(label, base::Base64UrlEncodePolicy::OMIT_PADDING,
                         &label);
-  receiver.SetKey("label", base::Value(label));
+  receiver.Set("label", base::Value(label));
 
-  receiver.SetKey("friendlyName",
-                  base::Value(base::EscapeForHTML(sink.sink().name())));
-  receiver.SetKey("capabilities", base::ListValue());
-  receiver.SetKey("volume", base::Value(base::Value::Type::NONE));
-  receiver.SetKey("isActiveInput", base::Value(base::Value::Type::NONE));
-  receiver.SetKey("displayStatus", base::Value(base::Value::Type::NONE));
+  receiver.Set("friendlyName",
+               base::Value(base::EscapeForHTML(sink.sink().name())));
+  receiver.Set("capabilities", base::ListValue());
 
-  receiver.SetKey("receiverType", base::Value("dial"));
-  receiver.SetKey("ipAddress",
-                  base::Value(sink.dial_data().ip_address.ToString()));
+  receiver.Set("volume", base::Value());
+  receiver.Set("isActiveInput", base::Value());
+  receiver.Set("displayStatus", base::Value());
+
+  receiver.Set("receiverType", base::Value("dial"));
+  receiver.Set("ipAddress",
+               base::Value(sink.dial_data().ip_address.ToString()));
   return receiver;
 }
 
-base::Value DialInternalMessageUtil::CreateReceiverActionBody(
+base::Value::Dict DialInternalMessageUtil::CreateReceiverActionBody(
     const MediaSinkInternal& sink,
     DialReceiverAction action) const {
-  base::Value message_body(base::Value::Type::DICTIONARY);
-  message_body.SetKey("receiver", CreateReceiver(sink));
-  message_body.SetKey("action",
-                      base::Value(DialReceiverActionToString(action)));
+  base::Value::Dict message_body;
+  message_body.Set("receiver", CreateReceiver(sink));
+  message_body.Set("action", base::Value(DialReceiverActionToString(action)));
   return message_body;
 }
 
-base::Value DialInternalMessageUtil::CreateNewSessionBody(
+base::Value::Dict DialInternalMessageUtil::CreateNewSessionBody(
     const std::string& app_name,
     const MediaSinkInternal& sink) const {
-  base::Value message_body(base::Value::Type::DICTIONARY);
-  message_body.SetKey("sessionId", base::Value(GetNextSessionId()));
-  message_body.SetKey("appId", base::Value(""));
-  message_body.SetKey("displayName", base::Value(app_name));
-  message_body.SetKey("statusText", base::Value(""));
-  message_body.SetKey("appImages", base::ListValue());
-  message_body.SetKey("receiver", CreateReceiver(sink));
-  message_body.SetKey("senderApps", base::ListValue());
-  message_body.SetKey("namespaces", base::ListValue());
-  message_body.SetKey("media", base::ListValue());
-  message_body.SetKey("status", base::Value("connected"));
-  message_body.SetKey("transportId", base::Value(""));
+  base::Value::Dict message_body;
+  message_body.Set("sessionId", base::Value(GetNextSessionId()));
+  message_body.Set("appId", base::Value(""));
+  message_body.Set("displayName", base::Value(app_name));
+  message_body.Set("statusText", base::Value(""));
+  message_body.Set("appImages", base::ListValue());
+  message_body.Set("receiver", CreateReceiver(sink));
+  message_body.Set("senderApps", base::ListValue());
+  message_body.Set("namespaces", base::ListValue());
+  message_body.Set("media", base::ListValue());
+  message_body.Set("status", base::Value("connected"));
+  message_body.Set("transportId", base::Value(""));
   return message_body;
 }
 
-base::Value DialInternalMessageUtil::CreateDialAppInfoBody(
+base::Value::Dict DialInternalMessageUtil::CreateDialAppInfoBody(
     const MediaSinkInternal& sink,
     const ParsedDialAppInfo& app_info) const {
-  base::Value message_body(base::Value::Type::DICTIONARY);
-  message_body.SetKey("receiver", CreateReceiver(sink));
-  message_body.SetKey("appState",
-                      base::Value(DialAppStateToString(app_info.state)));
+  base::Value::Dict message_body;
+  message_body.Set("receiver", CreateReceiver(sink));
+  message_body.Set("appState",
+                   base::Value(DialAppStateToString(app_info.state)));
 
-  base::Value extra_data(base::Value::Type::DICTIONARY);
+  base::Value::Dict extra_data;
   for (const auto& key_value : app_info.extra_data) {
-    extra_data.SetKey(key_value.first, base::Value(key_value.second));
+    extra_data.Set(key_value.first, base::Value(key_value.second));
   }
-  message_body.SetKey("extraData", std::move(extra_data));
+  message_body.Set("extraData", std::move(extra_data));
   return message_body;
 }
 
 base::Value DialInternalMessageUtil::CreateDialMessageCommon(
     DialInternalMessageType type,
-    base::Value body,
+    base::Value::Dict body,
     const std::string& client_id,
     int sequence_number) const {
-  base::Value message(base::Value::Type::DICTIONARY);
-  message.SetKey("type", base::Value(DialInternalMessageTypeToString(type)));
-  message.SetKey("message", std::move(body));
-  message.SetKey("clientId", base::Value(client_id));
-  message.SetKey("sequenceNumber", base::Value(sequence_number));
-  message.SetKey("timeoutMillis", base::Value(0));
-  return message;
+  base::Value::Dict message;
+  message.Set("type", base::Value(DialInternalMessageTypeToString(type)));
+  message.Set("message", std::move(body));
+  message.Set("clientId", base::Value(client_id));
+  message.Set("sequenceNumber", base::Value(sequence_number));
+  message.Set("timeoutMillis", base::Value(0));
+  return base::Value(std::move(message));
 }
 
 }  // namespace media_router
diff --git a/chrome/browser/media/router/providers/dial/dial_internal_message_util.h b/chrome/browser/media/router/providers/dial/dial_internal_message_util.h
index 87e6611..6f876f6f 100644
--- a/chrome/browser/media/router/providers/dial/dial_internal_message_util.h
+++ b/chrome/browser/media/router/providers/dial/dial_internal_message_util.h
@@ -50,7 +50,7 @@
   // Returns a DialInternalMessage for |message|. If |message| is not a valid
   // custom DIAL launch internal message, returns nullptr and sets |error| with
   // an error reason.
-  static std::unique_ptr<DialInternalMessage> From(base::Value message,
+  static std::unique_ptr<DialInternalMessage> From(base::Value::Dict message,
                                                    std::string* error);
 
   DialInternalMessage(DialInternalMessageType type,
@@ -149,20 +149,21 @@
       absl::optional<int> http_error_code = absl::nullopt) const;
 
  private:
-  base::Value CreateReceiver(const MediaSinkInternal& sink) const;
-  base::Value CreateReceiverActionBody(const MediaSinkInternal& sink,
-                                       DialReceiverAction action) const;
-  base::Value CreateNewSessionBody(const std::string& app_name,
-                                   const MediaSinkInternal& sink) const;
-  base::Value CreateDialAppInfoBody(const MediaSinkInternal& sink,
-                                    const ParsedDialAppInfo& app_info) const;
+  base::Value::Dict CreateReceiver(const MediaSinkInternal& sink) const;
+  base::Value::Dict CreateReceiverActionBody(const MediaSinkInternal& sink,
+                                             DialReceiverAction action) const;
+  base::Value::Dict CreateNewSessionBody(const std::string& app_name,
+                                         const MediaSinkInternal& sink) const;
+  base::Value::Dict CreateDialAppInfoBody(
+      const MediaSinkInternal& sink,
+      const ParsedDialAppInfo& app_info) const;
 
   // |sequence_number| is used by the Cast SDK to match up requests from the SDK
   // to Chrome with responses from Chrome. If a message from Chrome has no
   // corresponding request, then its |sequence_number| is an invalid value of
   // -1.
   base::Value CreateDialMessageCommon(DialInternalMessageType type,
-                                      base::Value body,
+                                      base::Value::Dict body,
                                       const std::string& client_id,
                                       int sequence_number = -1) const;
 
diff --git a/chrome/browser/media/router/providers/dial/dial_media_route_provider.cc b/chrome/browser/media/router/providers/dial/dial_media_route_provider.cc
index 31b1673e..98b7128b 100644
--- a/chrome/browser/media/router/providers/dial/dial_media_route_provider.cc
+++ b/chrome/browser/media/router/providers/dial/dial_media_route_provider.cc
@@ -213,7 +213,7 @@
 void DialMediaRouteProvider::HandleParsedRouteMessage(
     const MediaRoute::Id& route_id,
     data_decoder::DataDecoder::ValueOrError result) {
-  if (!result.has_value()) {
+  if (!result.has_value() || !result.value().is_dict()) {
     logger_->LogError(
         mojom::LogCategory::kRoute, kLoggerComponent,
         base::StrCat({"Failed to parse the route message. ", result.error()}),
@@ -225,7 +225,7 @@
 
   std::string error;
   std::unique_ptr<DialInternalMessage> internal_message =
-      DialInternalMessage::From(std::move(*result), &error);
+      DialInternalMessage::From(std::move(result.value().GetDict()), &error);
   if (!internal_message) {
     logger_->LogError(mojom::LogCategory::kRoute, kLoggerComponent,
                       base::StrCat({"Invalid route message. ", error}), "",
diff --git a/chrome/browser/media/router/test/provider_test_helpers.cc b/chrome/browser/media/router/test/provider_test_helpers.cc
index 579b078..78aaa09c 100644
--- a/chrome/browser/media/router/test/provider_test_helpers.cc
+++ b/chrome/browser/media/router/test/provider_test_helpers.cc
@@ -163,11 +163,12 @@
 
 std::unique_ptr<DialInternalMessage> ParseDialInternalMessage(
     const std::string& message) {
-  auto message_value = base::JSONReader::ReadDeprecated(message);
+  auto message_value = base::JSONReader::Read(message);
   std::string error_unused;
-  return message_value ? DialInternalMessage::From(std::move(*message_value),
-                                                   &error_unused)
-                       : nullptr;
+  return message_value && message_value->is_dict()
+             ? DialInternalMessage::From(std::move(message_value->GetDict()),
+                                         &error_unused)
+             : nullptr;
 }
 
 }  // namespace media_router
diff --git a/chrome/browser/metrics/majority_age_user_metrics_provider_browsertest.cc b/chrome/browser/metrics/majority_age_user_metrics_provider_browsertest.cc
index 10852e8..8c0bbc9 100644
--- a/chrome/browser/metrics/majority_age_user_metrics_provider_browsertest.cc
+++ b/chrome/browser/metrics/majority_age_user_metrics_provider_browsertest.cc
@@ -53,7 +53,7 @@
  public:
   MajorityAgeUserMetricsProviderTest() : SyncTest(SINGLE_CLIENT) {
     scoped_feature_list_.InitAndEnableFeature(
-        metrics::DemographicMetricsProvider::kDemographicMetricsReporting);
+        metrics::kDemographicMetricsReporting);
   }
 
   int GetAge() { return GetParam(); }
@@ -117,7 +117,7 @@
  public:
   MajorityAgeUserMetricsProviderGuestModeTest() {
     scoped_feature_list_.InitAndEnableFeature(
-        metrics::DemographicMetricsProvider::kDemographicMetricsReporting);
+        metrics::kDemographicMetricsReporting);
   }
 
  private:
diff --git a/chrome/browser/metrics/metrics_service_user_demographics_browsertest.cc b/chrome/browser/metrics/metrics_service_user_demographics_browsertest.cc
index 501039a..df3cdb62 100644
--- a/chrome/browser/metrics/metrics_service_user_demographics_browsertest.cc
+++ b/chrome/browser/metrics/metrics_service_user_demographics_browsertest.cc
@@ -47,8 +47,7 @@
       // Enable UMA and reporting of the synced user's birth year and gender.
       scoped_feature_list_.InitWithFeatures(
           // enabled_features =
-          {internal::kMetricsReportingFeature,
-           DemographicMetricsProvider::kDemographicMetricsReporting},
+          {internal::kMetricsReportingFeature, kDemographicMetricsReporting},
           // disabled_features =
           {});
     } else {
@@ -56,7 +55,7 @@
           // enabled_features =
           {internal::kMetricsReportingFeature},
           // disabled_features =
-          {DemographicMetricsProvider::kDemographicMetricsReporting});
+          {kDemographicMetricsReporting});
     }
   }
 
diff --git a/chrome/browser/metrics/ukm_browsertest.cc b/chrome/browser/metrics/ukm_browsertest.cc
index a99671d0..b891d33 100644
--- a/chrome/browser/metrics/ukm_browsertest.cc
+++ b/chrome/browser/metrics/ukm_browsertest.cc
@@ -426,8 +426,8 @@
     if (param.enable_feature) {
       scoped_feature_list_.InitWithFeatures(
           // enabled_features
-          {DemographicMetricsProvider::kDemographicMetricsReporting,
-           ukm::UkmService::kReportUserNoisedUserBirthYearAndGender},
+          {kDemographicMetricsReporting,
+           ukm::kReportUserNoisedUserBirthYearAndGender},
           // disabled_features
           {});
     } else {
@@ -435,8 +435,8 @@
           // enabled_features
           {},
           // disabled_features
-          {DemographicMetricsProvider::kDemographicMetricsReporting,
-           ukm::UkmService::kReportUserNoisedUserBirthYearAndGender});
+          {kDemographicMetricsReporting,
+           ukm::kReportUserNoisedUserBirthYearAndGender});
     }
   }
 
diff --git a/chrome/browser/resources/chromeos/echo/OWNERS b/chrome/browser/resources/chromeos/echo/OWNERS
index d43a12b..28d6de80 100644
--- a/chrome/browser/resources/chromeos/echo/OWNERS
+++ b/chrome/browser/resources/chromeos/echo/OWNERS
@@ -1,4 +1,2 @@
 jorgelo@chromium.org
 stephenlin@chromium.org
-abutzier@chromium.org
-leecy@chromium.org
diff --git a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_config.cc b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_config.cc
index 58895d63..a46dfa8 100644
--- a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_config.cc
+++ b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_config.cc
@@ -31,8 +31,9 @@
 
 }  // namespace.
 
-const base::Feature kSettingsResetPrompt{kSettingsResetPromptFeatureName,
-                                         base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kSettingsResetPrompt,
+             kSettingsResetPromptFeatureName,
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // static
 std::unique_ptr<SettingsResetPromptConfig> SettingsResetPromptConfig::Create() {
diff --git a/chrome/browser/ssl/chrome_expect_ct_reporter_browsertest.cc b/chrome/browser/ssl/chrome_expect_ct_reporter_browsertest.cc
index ea3da81..7c3f6ff 100644
--- a/chrome/browser/ssl/chrome_expect_ct_reporter_browsertest.cc
+++ b/chrome/browser/ssl/chrome_expect_ct_reporter_browsertest.cc
@@ -34,8 +34,7 @@
  public:
   ExpectCTBrowserTest() : CertVerifierBrowserTest() {
     feature_list_.InitWithFeatures(
-        {network::features::kExpectCTReporting,
-         net::TransportSecurityState::kDynamicExpectCTFeature},
+        {network::features::kExpectCTReporting, net::kDynamicExpectCTFeature},
         {});
 
     // Expect-CT reporting depends on actually enforcing Certificate
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
index 0ee147d7..72369cb8 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
@@ -1235,7 +1235,7 @@
 <translation id="7638584964844754484">Pasaesaldi okerra</translation>
 <translation id="7641339528570811325">Garbitu arakatze-datuak…</translation>
 <translation id="7646772052135772216">Pasahitzen sinkronizazioa ez dabil</translation>
-<translation id="7655900163790317559">Bluetooth-a aktibatzen…</translation>
+<translation id="7655900163790317559">Bluetootha aktibatzen…</translation>
 <translation id="7656862631699126784">Aktibatu ezkutuko moduko fitxak blokeatzeko ezarpena</translation>
 <translation id="7658239707568436148">Utzi</translation>
 <translation id="7663313374500954251"><ph name="PARENT_NAME" /> erabiltzaileak kudeatzen du arakatzailea.</translation>
@@ -1521,7 +1521,7 @@
 <translation id="9069999660519089861">Ez dago irakurri gabeko orririk</translation>
 <translation id="9070377983101773829">Aktibatu ahozko bilaketa</translation>
 <translation id="9074336505530349563">Google-k iradokitzen duen eduki pertsonalizatua jasotzeko, hasi saioa eta aktibatu sinkronizazioa</translation>
-<translation id="9074739597929991885">Bluetooth-a</translation>
+<translation id="9074739597929991885">Bluetootha</translation>
 <translation id="9081543426177426948">Bisitatzen dituzun webguneak ez dira gordetzen ezkutuko moduan</translation>
 <translation id="9086302186042011942">Sinkronizatzen</translation>
 <translation id="9086455579313502267">Ezin da atzitu sarea</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
index 80add51..621f462 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
@@ -340,6 +340,7 @@
 <translation id="2861923151411510142">Ayrim Chrome funksiyalari endi ishlamaydi</translation>
 <translation id="2870560284913253234">Sayt</translation>
 <translation id="2871733351037274014">Sahifalarni oldindan yuklash</translation>
+<translation id="2876136027428473467"><ph name="CHILD_NAME" /> quyidagi saytni tasdiqlashingizni soʻramoqda:</translation>
 <translation id="2886836735871983413">Saytlar roʻyxati saytlarga kirishingiz natijasida shu yerda chiqadi</translation>
 <translation id="2888126860611144412">Chrome haqida</translation>
 <translation id="2891154217021530873">Sahifa yuklanishini to‘xtatish</translation>
@@ -355,6 +356,7 @@
 <translation id="2932150158123903946">Google <ph name="APP_NAME" /> xotirasi</translation>
 <translation id="2932222164150889403">Klaviatura oʻzgarmaydi</translation>
 <translation id="2936980480904111527">Chrome bildirishnomalari vazifalarni osonlashtiradi</translation>
+<translation id="2940075786175545812">Saytni tasdiqlash yoki tasdiqlamaslik varianti</translation>
 <translation id="2942036813789421260">Razm solish sahifasi yopildi</translation>
 <translation id="2946420957526726953">Boshqa qurilmalarga ulanish uchun Chrome yangilanmoqda</translation>
 <translation id="2951071800649516099">Sahifalarni roʻyxatga keyinroq kiritish</translation>
@@ -423,6 +425,7 @@
 <translation id="3259831549858767975">Sahifadagi hamma narsani kichiklashtirish</translation>
 <translation id="3264124641674805320">Keyinroq ochiladigan kontent qanday yuklab olinadi</translation>
 <translation id="3264259168916048410">Kompyuteringiz bu qurilmadan saytga kirish uchun foydalanmoqchi</translation>
+<translation id="3265093782546847662"><ph name="DOMAIN" /> barcha sahifalari</translation>
 <translation id="3265534588625245297">Kuzatadigan saytlaringizni boshqarish</translation>
 <translation id="3269093882174072735">Tasvirni yuklash</translation>
 <translation id="3280562213547448728">Ovozli qidiruv</translation>
@@ -733,6 +736,7 @@
 <translation id="4985248278475639481">Reklamalarni moslashtirish haqida</translation>
 <translation id="4987271110129728827">Bunday sahifa topilmadi. Manzilning xatosiz kiritilganini tekshiring yoki Internetdan qidiring.</translation>
 <translation id="4988526792673242964">Sahifalar</translation>
+<translation id="4991110219272367918">Yopilgan saytni tasdiqlash yoki tasdiqlamaslik varianti</translation>
 <translation id="499724277181351974">Ochish: <ph name="WEBSITE_TITLE" />: <ph name="WEBSITE_URL" /></translation>
 <translation id="5001388021414335527">Bu saytni shu yerda kuzatish</translation>
 <translation id="500351648694011114">Yanada oson koʻring</translation>
@@ -1108,6 +1112,7 @@
 <translation id="6896758677409633944">Nusxa olish</translation>
 <translation id="6900532703269623216">Kuchaytirilgan himoya</translation>
 <translation id="6903907808598579934">Sinxronizatsiyani yoqish</translation>
+<translation id="6908998565271542516">Toʻliq hajmda ochilgan saytni tasdiqlash yoki tasdiqlamaslik varianti</translation>
 <translation id="6909589135458168665">Sahifalarni oldindan yuklash</translation>
 <translation id="6942665639005891494">Yuklanmalar standart jildini istalgan vaqtda sozlamalar menyusidan o‘zgartirish mumkin</translation>
 <translation id="694267552845942083">Siz hozirda sinxronizatsiya sozlamalarini sozlayapsiz. Sinxronizatsiyani yoqish uchun ekranning quyi qismidagi Tasdiqlash tugmasini bosing. Tepaga</translation>
@@ -1115,6 +1120,7 @@
 <translation id="6955535239952325894">Bu sozlama boshqaruv ostidagi brauzerlarda yoqilmagan</translation>
 <translation id="6963766334940102469">Xatcho‘plarni o‘chirish</translation>
 <translation id="696447261358045621">Inkognito rejimidan chiqish</translation>
+<translation id="6971862865055170158">Tasdiqlanmasin</translation>
 <translation id="6979737339423435258">Boshidan beri</translation>
 <translation id="6987047470128880212">Bu qurilmada Inkognito rejim ishlamaydi</translation>
 <translation id="6995899638241819463">Parolim oshkor etilganda ogohlantirilsin</translation>
diff --git a/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service.cc b/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service.cc
index b1c2337..1a52bdb 100644
--- a/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service.cc
+++ b/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service.cc
@@ -112,13 +112,13 @@
 
 bool FileSuggestKeyedService::IsReadyForTest() const {
   return local_file_suggestion_provider_->IsInitializedForTest() &&
-         proto_.initialized();
+         IsProtoInitialized();
 }
 
 void FileSuggestKeyedService::FilterRemovedSuggestions(
     GetSuggestFileDataCallback callback,
     const absl::optional<std::vector<FileSuggestData>>& suggestions) {
-  DCHECK(proto_.initialized());
+  DCHECK(IsProtoInitialized());
 
   // There are no candidate suggestions to filter. Therefore, return early.
   if (!suggestions.has_value() || suggestions->empty()) {
@@ -137,6 +137,10 @@
   std::move(callback).Run(filtered_suggestions);
 }
 
+bool FileSuggestKeyedService::IsProtoInitialized() const {
+  return proto_.initialized();
+}
+
 void FileSuggestKeyedService::OnRemovedSuggestionProtoReady(
     ReadStatus read_status) {
   OnSuggestionProviderUpdated(FileSuggestionType::kDriveFile);
diff --git a/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service.h b/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service.h
index 0d1f763..b2294cf 100644
--- a/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service.h
+++ b/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service.h
@@ -101,6 +101,9 @@
       GetSuggestFileDataCallback callback,
       const absl::optional<std::vector<FileSuggestData>>& suggestions);
 
+  // Returns whether `proto_` is initialized.
+  bool IsProtoInitialized() const;
+
  private:
   // Called when `proto_` is ready to read.
   void OnRemovedSuggestionProtoReady(ReadStatus read_status);
diff --git a/chrome/browser/ui/app_list/search/files/item_suggest_cache.cc b/chrome/browser/ui/app_list/search/files/item_suggest_cache.cc
index e4559117..dbcbf02 100644
--- a/chrome/browser/ui/app_list/search/files/item_suggest_cache.cc
+++ b/chrome/browser/ui/app_list/search/files/item_suggest_cache.cc
@@ -103,14 +103,14 @@
 // JSON utilities
 //---------------
 
-absl::optional<base::Value::ConstListView> GetList(const base::Value* value,
-                                                   const std::string& key) {
+const base::Value::List* GetList(const base::Value* value,
+                                 const std::string& key) {
   if (!value->is_dict())
-    return absl::nullopt;
+    return nullptr;
   const base::Value* field = value->FindListKey(key);
   if (!field)
-    return absl::nullopt;
-  return field->GetListDeprecated();
+    return nullptr;
+  return &field->GetList();
 }
 
 absl::optional<std::string> GetString(const base::Value* value,
@@ -149,13 +149,13 @@
 
   ItemSuggestCache::Results results(suggestion_id.value());
 
-  const auto items = GetList(value, "item");
+  const auto* items = GetList(value, "item");
   if (!items) {
     // Return empty results if there are no items.
     return results;
   }
 
-  for (const auto& result_value : items.value()) {
+  for (const auto& result_value : *items) {
     auto result = ConvertResult(&result_value);
     // If any result fails conversion, fail completely and return absl::nullopt,
     // rather than just skipping this result. This makes clear the distinction
diff --git a/chrome/browser/ui/app_list/search/files/mock_file_suggest_keyed_service.cc b/chrome/browser/ui/app_list/search/files/mock_file_suggest_keyed_service.cc
index f782e64..cfd78fa 100644
--- a/chrome/browser/ui/app_list/search/files/mock_file_suggest_keyed_service.cc
+++ b/chrome/browser/ui/app_list/search/files/mock_file_suggest_keyed_service.cc
@@ -31,6 +31,11 @@
 void MockFileSuggestKeyedService::GetSuggestFileData(
     app_list::FileSuggestionType type,
     GetSuggestFileDataCallback callback) {
+  if (!IsProtoInitialized()) {
+    std::move(callback).Run(/*suggestions=*/absl::nullopt);
+    return;
+  }
+
   // Emulate `FileSuggestKeyedService` that returns data asynchronously.
   base::SequencedTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
diff --git a/chrome/browser/ui/ash/capture_mode/capture_mode_browsertest.cc b/chrome/browser/ui/ash/capture_mode/capture_mode_browsertest.cc
index 06aefe57..82a3101 100644
--- a/chrome/browser/ui/ash/capture_mode/capture_mode_browsertest.cc
+++ b/chrome/browser/ui/ash/capture_mode/capture_mode_browsertest.cc
@@ -2,7 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "ash/capture_mode/capture_mode_types.h"
+#include "ash/constants/ash_features.h"
 #include "ash/public/cpp/capture_mode/capture_mode_test_api.h"
+#include "ash/public/cpp/projector/projector_client.h"
+#include "ash/public/cpp/projector/projector_controller.h"
+#include "ash/public/cpp/projector/projector_session.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/public/cpp/test/shell_test_api.h"
 #include "ash/session/session_controller_impl.h"
@@ -14,6 +19,7 @@
 #include "base/test/bind.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/ash/file_manager/file_manager_test_util.h"
+#include "chrome/browser/ash/system_web_apps/system_web_app_manager.h"
 #include "chrome/browser/chromeos/policy/dlp/dlp_content_manager_test_helper.h"
 #include "chrome/browser/chromeos/policy/dlp/dlp_content_observer.h"
 #include "chrome/browser/chromeos/policy/dlp/dlp_content_restriction_set.h"
@@ -25,6 +31,7 @@
 #include "chrome/browser/chromeos/policy/dlp/mock_dlp_rules_manager.h"
 #include "chrome/browser/extensions/extension_browsertest.h"
 #include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/in_process_browser_test.h"
@@ -814,3 +821,52 @@
   ash::CaptureModeTestApi().StartForFullscreen(/*for_video=*/true);
   WaitForAndVerifyRenderedVideoFrame();
 }
+
+class CaptureModeProjectorBrowserTests : public CaptureModeCameraBrowserTests {
+ public:
+  CaptureModeProjectorBrowserTests() {
+    scoped_feature_list_.InitWithFeatures(
+        {ash::features::kProjector, ash::features::kProjectorAnnotator}, {});
+  }
+
+  ~CaptureModeProjectorBrowserTests() override = default;
+
+  // InProcessBrowserTest:
+  void SetUpOnMainThread() override {
+    CaptureModeCameraBrowserTests::SetUpOnMainThread();
+    auto* profile = browser()->profile();
+    ash::SystemWebAppManager::GetForTest(profile)
+        ->InstallSystemAppsForTesting();
+    ash::ProjectorClient::Get()->OpenProjectorApp();
+    Browser* app_browser =
+        FindSystemWebAppBrowser(profile, ash::SystemWebAppType::PROJECTOR);
+    ASSERT_TRUE(app_browser);
+  }
+
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    CaptureModeCameraBrowserTests::SetUpCommandLine(command_line);
+    command_line->AppendSwitch("--projector-extended-features-disabled");
+  }
+
+  void StartProjectorModeSession() {
+    auto* projector_session = ash::ProjectorSession::Get();
+    EXPECT_FALSE(projector_session->is_active());
+    ash::ProjectorController::Get()->StartProjectorSession("projector_data");
+    EXPECT_TRUE(projector_session->is_active());
+    EXPECT_TRUE(ash::CaptureModeTestApi().IsSessionActive());
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+// Tests that the crash reported in https://crbug.com/1368903 is not happening.
+IN_PROC_BROWSER_TEST_F(CaptureModeProjectorBrowserTests,
+                       NoCrashWhenExitingSessionInWindowRecording) {
+  StartProjectorModeSession();
+  ash::CaptureModeTestApi test_api;
+  ASSERT_TRUE(test_api.GetCameraPreviewWidget());
+  test_api.SetCaptureModeSource(ash::CaptureModeSource::kWindow);
+  SendKeyEvent(browser(), ui::VKEY_ESCAPE);
+  EXPECT_FALSE(test_api.IsSessionActive());
+}
diff --git a/chrome/browser/ui/views/passwords/password_generation_popup_view_views.cc b/chrome/browser/ui/views/passwords/password_generation_popup_view_views.cc
index 15ddeb9..d7cce4d 100644
--- a/chrome/browser/ui/views/passwords/password_generation_popup_view_views.cc
+++ b/chrome/browser/ui/views/passwords/password_generation_popup_view_views.cc
@@ -18,6 +18,7 @@
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/password_manager/core/common/password_manager_features.h"
+#include "components/vector_icons/vector_icons.h"
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -45,6 +46,50 @@
 // The default icon size used in the password generation drop down.
 constexpr int kIconSize = 16;
 
+// Adds space between child views. The `view`'s LayoutManager  must be a
+// BoxLayout.
+void AddSpacerWithSize(int spacer_width, bool resize, views::View* view) {
+  auto spacer = std::make_unique<views::View>();
+  spacer->SetPreferredSize(gfx::Size(spacer_width, /*height=*/1));
+  static_cast<views::BoxLayout*>(view->GetLayoutManager())
+      ->SetFlexForView(view->AddChildView(std::move(spacer)),
+                       /*flex=*/resize ? 1 : 0,
+                       /*use_min_size=*/true);
+}
+
+// Adds the password strength string and the warning icon children to the
+// view.
+std::unique_ptr<views::View> CreatePasswordStrengthView(
+    const std::u16string& password_strength_text) {
+  auto password_strength_view = std::make_unique<views::View>();
+
+  auto warning_icon = std::make_unique<views::ImageView>();
+  warning_icon->SetCanProcessEventsWithinSubtree(false);
+  warning_icon->SetImage(
+      ui::ImageModel::FromVectorIcon(vector_icons::kNotificationWarningIcon,
+                                     ui::kColorAlertMediumSeverity, kIconSize));
+  password_strength_view->AddChildView(std::move(warning_icon));
+
+  auto* layout = password_strength_view->SetLayoutManager(
+      std::make_unique<views::BoxLayout>(
+          views::BoxLayout::Orientation::kHorizontal));
+  layout->set_cross_axis_alignment(
+      views::BoxLayout::CrossAxisAlignment::kCenter);
+
+  // Add space between the icon and the password strength string.
+  AddSpacerWithSize(autofill::AutofillPopupBaseView::GetHorizontalPadding(),
+                    false, password_strength_view.get());
+
+  auto* password_strength_label =
+      password_strength_view->AddChildView(std::make_unique<views::Label>(
+          password_strength_text, views::style::CONTEXT_DIALOG_BODY_TEXT,
+          views::style::STYLE_HIGHLIGHTED));
+  password_strength_label->SetMultiLine(true);
+  password_strength_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+
+  return password_strength_view;
+}
+
 }  // namespace
 
 // Class that shows the generated password and associated UI (currently an
@@ -71,16 +116,6 @@
     suggestion_label_->SetBackgroundColor(color);
   }
 
-  void AddSpacerWithSize(int spacer_width,
-                         bool resize,
-                         views::BoxLayout* layout) {
-    auto spacer = std::make_unique<views::View>();
-    spacer->SetPreferredSize(gfx::Size(spacer_width, 1));
-    layout->SetFlexForView(AddChildView(std::move(spacer)),
-                           /*flex=*/resize ? 1 : 0,
-                           /*use_min_size=*/true);
-  }
-
   void reset_controller() { controller_ = nullptr; }
 
  private:
@@ -107,7 +142,7 @@
       std::make_unique<views::ImageView>(ui::ImageModel::FromVectorIcon(
           GooglePasswordManagerVectorIcon(), ui::kColorIcon, kIconSize)));
   AddSpacerWithSize(AutofillPopupBaseView::GetHorizontalPadding(),
-                    /*resize=*/false, layout);
+                    /*resize=*/false, this);
 
   suggestion_label_ = AddChildView(std::make_unique<views::Label>(
       controller_->SuggestedText(), views::style::CONTEXT_DIALOG_BODY_TEXT,
@@ -119,7 +154,7 @@
   AddSpacerWithSize(
       ChromeLayoutProvider::Get()->GetDistanceMetric(
           DISTANCE_BETWEEN_PRIMARY_AND_SECONDARY_LABELS_HORIZONTAL),
-      /*resize=*/true, layout);
+      /*resize=*/true, this);
 
   DCHECK(!password_label_);
   password_label_ = AddChildView(std::make_unique<views::Label>(
@@ -245,14 +280,9 @@
           password_manager::features::kPasswordStrengthIndicator)) {
     // TODO(crbug.com/1345766): Adjust according to the calculated password
     // strength.
-    std::u16string password_strength_text =
-        l10n_util::GetStringUTF16(IDS_PASSWORD_WEAKNESS_INDICATOR);
-    auto* password_strength_label = AddChildView(std::make_unique<views::Label>(
-        password_strength_text, views::style::CONTEXT_DIALOG_BODY_TEXT,
-        views::style::STYLE_HIGHLIGHTED));
-    password_strength_label->SetMultiLine(true);
-    password_strength_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-    password_strength_label->SetBorder(views::CreateEmptyBorder(
+    auto* password_strength_view = AddChildView(CreatePasswordStrengthView(
+        l10n_util::GetStringUTF16(IDS_PASSWORD_WEAKNESS_INDICATOR)));
+    password_strength_view->SetBorder(views::CreateEmptyBorder(
         gfx::Insets::TLBR(kVerticalPadding, kHorizontalMargin, kVerticalPadding,
                           kHorizontalMargin)));
   }
diff --git a/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.cc b/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.cc
index 76767b8..ded0de7b 100644
--- a/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.cc
+++ b/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.cc
@@ -98,11 +98,13 @@
 }
 
 void FeedV2InternalsPageHandler::RefreshForYouFeed() {
-  feed_stream_->ForceRefreshForDebugging(feed::kForYouStream);
+  feed_stream_->ForceRefreshForDebugging(
+      feed::StreamType(feed::StreamKind::kForYou));
 }
 
 void FeedV2InternalsPageHandler::RefreshFollowingFeed() {
-  feed_stream_->ForceRefreshForDebugging(feed::kWebFeedStream);
+  feed_stream_->ForceRefreshForDebugging(
+      feed::StreamType(feed::StreamKind::kFollowing));
 }
 
 void FeedV2InternalsPageHandler::RefreshWebFeedSuggestions() {
@@ -167,8 +169,8 @@
 
 feed_internals::mojom::FeedOrder
 FeedV2InternalsPageHandler::GetFollowingFeedOrder() {
-  feed::ContentOrder order =
-      feed_stream_->GetContentOrderFromPrefs(feed::kWebFeedStream);
+  feed::ContentOrder order = feed_stream_->GetContentOrderFromPrefs(
+      feed::StreamType(feed::StreamKind::kFollowing));
   switch (order) {
     case feed::ContentOrder::kUnspecified:
       return feed_internals::mojom::FeedOrder::kUnspecified;
@@ -193,5 +195,6 @@
       order_to_set = feed::ContentOrder::kReverseChron;
       break;
   }
-  feed_stream_->SetContentOrder(feed::kWebFeedStream, order_to_set);
+  feed_stream_->SetContentOrder(feed::StreamType(feed::StreamKind::kFollowing),
+                                order_to_set);
 }
diff --git a/chrome/browser/ui/webui/net_internals/net_internals_ui.cc b/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
index 6dffce5..05819c3f 100644
--- a/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
+++ b/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
@@ -52,9 +52,8 @@
   content::WebUIDataSource* source =
       content::WebUIDataSource::Create(chrome::kChromeUINetInternalsHost);
   source->UseStringsJs();
-  source->AddBoolean("expectCTEnabled",
-                     base::FeatureList::IsEnabled(
-                         net::TransportSecurityState::kDynamicExpectCTFeature));
+  source->AddBoolean("expectCTEnabled", base::FeatureList::IsEnabled(
+                                            net::kDynamicExpectCTFeature));
   source->AddResourcePaths(
       base::make_span(kNetInternalsResources, kNetInternalsResourcesSize));
   source->SetDefaultResource(IDR_NET_INTERNALS_INDEX_HTML);
diff --git a/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc b/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc
index 24f0202..b65c582 100644
--- a/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc
@@ -348,8 +348,7 @@
 NetInternalsTest::NetInternalsTest()
     : test_server_started_(false) {
   message_handler_ = std::make_unique<MessageHandler>(this);
-  scoped_feature_list_.InitAndEnableFeature(
-      net::TransportSecurityState::kDynamicExpectCTFeature);
+  scoped_feature_list_.InitAndEnableFeature(net::kDynamicExpectCTFeature);
 }
 
 NetInternalsTest::~NetInternalsTest() {
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index bf221a35..4ab0a19 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1664636671-e5addc7c83eab0b8fb266377f63b0d305fda920f.profdata
+chrome-linux-main-1664754885-4ff6e18f4c649ad4b923984dceb765a9afa02cc8.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index a456531..a309a63 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1664609609-48956953d850c814359a28837da50ad2e8155259.profdata
+chrome-mac-arm-main-1664754885-aad491c6e30b67fd7021835eeca79bb40377c239.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 6fe01cd..a262946 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1664636671-1bef16c894bc287512d0f3982556f8f035a92255.profdata
+chrome-mac-main-1664754885-b1c6ce4b14902d942cb84d98252d641c59a8ad0f.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 344f8d0a..dd1247a9 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1664609609-8045c985c72839b45957d42c71c8c87663ad1c0b.profdata
+chrome-win32-main-1664765930-397b06e5facded9995304f335f4dba1d63564a5e.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 8024471..81586295 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1664609609-d5b1774e626944fa7f359b2f4fcd990692678c2c.profdata
+chrome-win64-main-1664765930-e4d57793133d2e6168646f33417196b1592b7efc.profdata
diff --git a/chrome/common/profiler/unwind_util.cc b/chrome/common/profiler/unwind_util.cc
index 96b19b5..32f180d 100644
--- a/chrome/common/profiler/unwind_util.cc
+++ b/chrome/common/profiler/unwind_util.cc
@@ -49,9 +49,14 @@
 }
 #endif  // ANDROID_ARM32_UNWINDING_SUPPORTED
 
+#if ANDROID_ARM32_UNWINDING_SUPPORTED && defined(OFFICIAL_BUILD) && \
+    BUILDFLAG(GOOGLE_CHROME_BRANDING)
 // See `RequestUnwindPrerequisitesInstallation` below.
-extern const base::Feature kInstallAndroidUnwindDfm{
-    "InstallAndroidUnwindDfm", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kInstallAndroidUnwindDfm,
+             "InstallAndroidUnwindDfm",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
+#endif
 
 namespace {
 
diff --git a/chrome/common/profiler/unwind_util_unittest.cc b/chrome/common/profiler/unwind_util_unittest.cc
index b5bcdd6..fb3f7a2 100644
--- a/chrome/common/profiler/unwind_util_unittest.cc
+++ b/chrome/common/profiler/unwind_util_unittest.cc
@@ -17,7 +17,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 // Used to gate unwind prerequisites' installation for some unit tests.
-extern const base::Feature kInstallAndroidUnwindDfm;
+BASE_DECLARE_FEATURE(kInstallAndroidUnwindDfm);
 
 namespace {
 
diff --git a/chromeos/ash/components/dbus/arc/BUILD.gn b/chromeos/ash/components/dbus/arc/BUILD.gn
index 1f424f82..3d4145a 100644
--- a/chromeos/ash/components/dbus/arc/BUILD.gn
+++ b/chromeos/ash/components/dbus/arc/BUILD.gn
@@ -3,7 +3,6 @@
 # found in the LICENSE file.
 
 import("//build/config/chromeos/ui_mode.gni")
-import("//third_party/protobuf/proto_library.gni")
 
 assert(is_chromeos_ash, "Non-ChromeOS builds cannot depend on //chromeos/ash")
 
@@ -11,10 +10,7 @@
   output_name = "ash_dbus_arc"
   defines = [ "IS_ASH_DBUS_ARC_IMPL" ]
 
-  public_deps = [ ":arc_proto" ]
-
   deps = [
-    ":arc_proto",
     "//base",
     "//chromeos/dbus/common",
     "//dbus",
@@ -51,17 +47,3 @@
     "fake_arc_sensor_service_client.h",
   ]
 }
-
-static_library("arc_proto") {
-  public_deps = [ ":arc_proto_lib" ]
-  all_dependent_configs = [ ":arc_proto_config" ]
-}
-
-config("arc_proto_config") {
-  include_dirs = [ "${root_gen_dir}/chromeos/ash/components/dbus" ]
-}
-
-proto_library("arc_proto_lib") {
-  sources = [ "//third_party/cros_system_api/dbus/arc/arc.proto" ]
-  proto_out_dir = "chromeos/ash/components/dbus/arc"
-}
diff --git a/chromeos/ash/components/dbus/concierge/BUILD.gn b/chromeos/ash/components/dbus/concierge/BUILD.gn
index 2b5d4f41..fbb0480 100644
--- a/chromeos/ash/components/dbus/concierge/BUILD.gn
+++ b/chromeos/ash/components/dbus/concierge/BUILD.gn
@@ -9,7 +9,6 @@
 
 component("concierge") {
   defines = [ "IS_CONCIERGE_IMPL" ]
-  public_deps = [ "//chromeos/ash/components/dbus/arc:arc_proto" ]
   deps = [
     ":concierge_proto",
     "//base",
@@ -27,15 +26,10 @@
   ]
 }
 
-config("concierge_config") {
-  include_dirs = [ "${root_gen_dir}/chromeos/ash/components/dbus" ]
-}
-
 proto_library("concierge_proto") {
   sources = [
     "//third_party/cros_system_api/dbus/vm_concierge/concierge_service.proto",
   ]
-  extra_configs = [ ":concierge_config" ]
-  import_dirs = [ "//third_party/cros_system_api/dbus" ]
+
   proto_out_dir = "chromeos/ash/components/dbus/concierge"
 }
diff --git a/chromeos/ash/components/dbus/session_manager/BUILD.gn b/chromeos/ash/components/dbus/session_manager/BUILD.gn
index 97753d94..88ae21b 100644
--- a/chromeos/ash/components/dbus/session_manager/BUILD.gn
+++ b/chromeos/ash/components/dbus/session_manager/BUILD.gn
@@ -14,7 +14,6 @@
 
   deps = [
     "//base",
-    "//chromeos/ash/components/dbus/arc:arc_proto",
     "//chromeos/ash/components/dbus/cryptohome",
     "//chromeos/ash/components/dbus/cryptohome:cryptohome_proto",
     "//chromeos/ash/components/dbus/userdataauth",
@@ -35,6 +34,7 @@
 
 proto_library("login_manager_proto") {
   sources = [
+    "//third_party/cros_system_api/dbus/login_manager/arc.proto",
     "//third_party/cros_system_api/dbus/login_manager/login_screen_storage.proto",
     "//third_party/cros_system_api/dbus/login_manager/policy_descriptor.proto",
   ]
diff --git a/chromeos/ash/components/dbus/session_manager/fake_session_manager_client.cc b/chromeos/ash/components/dbus/session_manager/fake_session_manager_client.cc
index 3783561..07a2b5b 100644
--- a/chromeos/ash/components/dbus/session_manager/fake_session_manager_client.cc
+++ b/chromeos/ash/components/dbus/session_manager/fake_session_manager_client.cc
@@ -686,7 +686,7 @@
 }
 
 void FakeSessionManagerClient::StartArcMiniContainer(
-    const arc::StartArcMiniInstanceRequest& request,
+    const login_manager::StartArcMiniContainerRequest& request,
     chromeos::VoidDBusMethodCallback callback) {
   last_start_arc_mini_container_request_ = request;
 
@@ -700,7 +700,7 @@
 }
 
 void FakeSessionManagerClient::UpgradeArcContainer(
-    const arc::UpgradeArcContainerRequest& request,
+    const login_manager::UpgradeArcContainerRequest& request,
     chromeos::VoidDBusMethodCallback callback) {
   last_upgrade_arc_request_ = request;
 
diff --git a/chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h b/chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h
index f320118..0488aed5 100644
--- a/chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h
+++ b/chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h
@@ -14,7 +14,7 @@
 #include "base/component_export.h"
 #include "base/observer_list.h"
 #include "base/time/time.h"
-#include "chromeos/ash/components/dbus/arc/arc.pb.h"
+#include "chromeos/ash/components/dbus/login_manager/arc.pb.h"
 #include "chromeos/ash/components/dbus/session_manager/session_manager_client.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
@@ -157,10 +157,11 @@
       PsmDeviceActiveSecretCallback callback) override;
 
   void StartArcMiniContainer(
-      const arc::StartArcMiniInstanceRequest& request,
+      const login_manager::StartArcMiniContainerRequest& request,
       chromeos::VoidDBusMethodCallback callback) override;
-  void UpgradeArcContainer(const arc::UpgradeArcContainerRequest& request,
-                           chromeos::VoidDBusMethodCallback callback) override;
+  void UpgradeArcContainer(
+      const login_manager::UpgradeArcContainerRequest& request,
+      chromeos::VoidDBusMethodCallback callback) override;
   void StopArcInstance(const std::string& account_id,
                        bool should_backup_log,
                        chromeos::VoidDBusMethodCallback callback) override;
@@ -237,11 +238,12 @@
   void set_device_local_account_policy(const std::string& account_id,
                                        const std::string& policy_blob);
 
-  const arc::UpgradeArcContainerRequest& last_upgrade_arc_request() const {
+  const login_manager::UpgradeArcContainerRequest& last_upgrade_arc_request()
+      const {
     return last_upgrade_arc_request_;
   }
-  const arc::StartArcMiniInstanceRequest last_start_arc_mini_container_request()
-      const {
+  const login_manager::StartArcMiniContainerRequest
+  last_start_arc_mini_container_request() const {
     return last_start_arc_mini_container_request_;
   }
 
@@ -432,10 +434,11 @@
   std::string request_browser_data_migration_mode_value_ = "invalid";
 
   // Contains last request passed to StartArcMiniContainer
-  arc::StartArcMiniInstanceRequest last_start_arc_mini_container_request_;
+  login_manager::StartArcMiniContainerRequest
+      last_start_arc_mini_container_request_;
 
-  // Contains last request passed to StartArcInstance
-  arc::UpgradeArcContainerRequest last_upgrade_arc_request_;
+  // Contains last requst passed to StartArcInstance
+  login_manager::UpgradeArcContainerRequest last_upgrade_arc_request_;
 
   StubDelegate* delegate_ = nullptr;
 
diff --git a/chromeos/ash/components/dbus/session_manager/session_manager_client.cc b/chromeos/ash/components/dbus/session_manager/session_manager_client.cc
index f84fc65..df05f27 100644
--- a/chromeos/ash/components/dbus/session_manager/session_manager_client.cc
+++ b/chromeos/ash/components/dbus/session_manager/session_manager_client.cc
@@ -28,8 +28,8 @@
 #include "base/strings/stringprintf.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/unguessable_token.h"
-#include "chromeos/ash/components/dbus/arc/arc.pb.h"
 #include "chromeos/ash/components/dbus/cryptohome/rpc.pb.h"
+#include "chromeos/ash/components/dbus/login_manager/arc.pb.h"
 #include "chromeos/ash/components/dbus/login_manager/login_screen_storage.pb.h"
 #include "chromeos/ash/components/dbus/login_manager/policy_descriptor.pb.h"
 #include "chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h"
@@ -635,7 +635,7 @@
   }
 
   void StartArcMiniContainer(
-      const arc::StartArcMiniInstanceRequest& request,
+      const login_manager::StartArcMiniContainerRequest& request,
       chromeos::VoidDBusMethodCallback callback) override {
     DCHECK(!callback.is_null());
     dbus::MethodCall method_call(
@@ -651,8 +651,9 @@
                        weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
   }
 
-  void UpgradeArcContainer(const arc::UpgradeArcContainerRequest& request,
-                           chromeos::VoidDBusMethodCallback callback) override {
+  void UpgradeArcContainer(
+      const login_manager::UpgradeArcContainerRequest& request,
+      chromeos::VoidDBusMethodCallback callback) override {
     DCHECK(!callback.is_null());
     dbus::MethodCall method_call(
         login_manager::kSessionManagerInterface,
diff --git a/chromeos/ash/components/dbus/session_manager/session_manager_client.h b/chromeos/ash/components/dbus/session_manager/session_manager_client.h
index 88c5ab8..2ae1e01 100644
--- a/chromeos/ash/components/dbus/session_manager/session_manager_client.h
+++ b/chromeos/ash/components/dbus/session_manager/session_manager_client.h
@@ -17,11 +17,6 @@
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/cros_system_api/dbus/login_manager/dbus-constants.h"
 
-namespace arc {
-class StartArcMiniInstanceRequest;
-class UpgradeArcContainerRequest;
-}  // namespace arc
-
 namespace cryptohome {
 class AccountIdentifier;
 }
@@ -37,6 +32,8 @@
 namespace login_manager {
 class LoginScreenStorageMetadata;
 class PolicyDescriptor;
+class StartArcMiniContainerRequest;
+class UpgradeArcContainerRequest;
 }  // namespace login_manager
 
 namespace ash {
@@ -449,7 +446,7 @@
   // StartArcMiniContainer starts a container with only a handful of ARC
   // processes for Chrome OS login screen.
   virtual void StartArcMiniContainer(
-      const arc::StartArcMiniInstanceRequest& request,
+      const login_manager::StartArcMiniContainerRequest& request,
       chromeos::VoidDBusMethodCallback callback) = 0;
 
   // UpgradeArcContainer upgrades a mini-container to a full ARC container. On
@@ -458,7 +455,7 @@
   // guarantees over whether this |callback| is invoked or the
   // ArcInstanceStopped signal is received first.
   virtual void UpgradeArcContainer(
-      const arc::UpgradeArcContainerRequest& request,
+      const login_manager::UpgradeArcContainerRequest& request,
       chromeos::VoidDBusMethodCallback callback) = 0;
 
   // Asynchronously stops the ARC instance. When |should_backup_log| is set to
diff --git a/chromeos/ash/components/dbus/spaced/OWNERS b/chromeos/ash/components/dbus/spaced/OWNERS
index 9a7efa8..c15eab78 100644
--- a/chromeos/ash/components/dbus/spaced/OWNERS
+++ b/chromeos/ash/components/dbus/spaced/OWNERS
@@ -1,4 +1,3 @@
-gwendal@chromium.org
 jboulic@chromium.org
 sarthakkukreti@chromium.org
 simmonsjosh@google.com
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt
index 31eb124..f555653 100644
--- a/chromeos/profiles/atom.afdo.newest.txt
+++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-atom-107-5283.0-1663582179-benchmark-107.0.5301.0-r2-redacted.afdo.xz
+chromeos-chrome-amd64-atom-107-5304.10-1664188595-benchmark-107.0.5304.21-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt
index 4537e80e..52bf9898 100644
--- a/chromeos/profiles/bigcore.afdo.newest.txt
+++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-bigcore-107-5293.0-1663580861-benchmark-107.0.5301.0-r2-redacted.afdo.xz
+chromeos-chrome-amd64-bigcore-107-5304.4-1664185734-benchmark-107.0.5304.21-r1-redacted.afdo.xz
diff --git a/chromeos/strings/chromeos_strings_da.xtb b/chromeos/strings/chromeos_strings_da.xtb
index 3b33712f..7bd36555 100644
--- a/chromeos/strings/chromeos_strings_da.xtb
+++ b/chromeos/strings/chromeos_strings_da.xtb
@@ -250,6 +250,7 @@
 <translation id="3484914941826596830">Du må ikke frakoble den eksterne enhed eller slukke din computer, mens firmwaren opdaterer. Du kan minimere dette vindue. Denne opdatering kan tage et par minutter, og din eksterne enhed fungerer muligvis ikke under opdateringen.</translation>
 <translation id="3486220673238053218">definition</translation>
 <translation id="3488065109653206955">Delvist aktiveret</translation>
+<translation id="3510890413042482857">Send <ph name="BEGIN_LINK1" />data om ydeevne<ph name="END_LINK1" /></translation>
 <translation id="3517001332549868749">ChromeOS-opdatering</translation>
 <translation id="3527036260304016759">Handlingen mislykkedes – Ukendt fejl</translation>
 <translation id="3532980081107202182">Ca. <ph name="MIN_REMAINING" /> minutter tilbage</translation>
diff --git a/chromeos/strings/chromeos_strings_eu.xtb b/chromeos/strings/chromeos_strings_eu.xtb
index 0a67207..3202dce 100644
--- a/chromeos/strings/chromeos_strings_eu.xtb
+++ b/chromeos/strings/chromeos_strings_eu.xtb
@@ -157,7 +157,7 @@
 <translation id="2320295602967756579">Gaitu gai iluna</translation>
 <translation id="2323506179655536734">SALTATUTA</translation>
 <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation>
-<translation id="2338501278241028356">Inguruko gailuak ikusteko, aktibatu Bluetooth-a</translation>
+<translation id="2338501278241028356">Inguruko gailuak ikusteko, aktibatu Bluetootha</translation>
 <translation id="2346474577291266260">Bikaina (<ph name="SIGNAL_STRENGTH" />)</translation>
 <translation id="2359808026110333948">Egin aurrera</translation>
 <translation id="2364498172489649528">Gaindituta</translation>
@@ -819,7 +819,7 @@
 <translation id="9039663905644212491">PEAP</translation>
 <translation id="9062831201344759865">DNS bidezko ebazpenak latentzia handia dauka</translation>
 <translation id="9073281213608662541">PAP</translation>
-<translation id="9074739597929991885">Bluetooth-a</translation>
+<translation id="9074739597929991885">Bluetootha</translation>
 <translation id="9082718469794970195">Erabili bideoa</translation>
 <translation id="9087578468327036362">Salatu kontsulta</translation>
 <translation id="9088306295921699330">Oraingo erabilera</translation>
diff --git a/chromeos/strings/chromeos_strings_hy.xtb b/chromeos/strings/chromeos_strings_hy.xtb
index 25b730e..47e4694 100644
--- a/chromeos/strings/chromeos_strings_hy.xtb
+++ b/chromeos/strings/chromeos_strings_hy.xtb
@@ -250,6 +250,7 @@
 <translation id="3484914941826596830">Քանի դեռ ներկառուցված ծրագիրը թարմացվում է, մի՛ անջատեք ձեր համակարգիչը կամ այս արտաքին սարքը համակարգչից։ Դուք կարող եք փոքրացնել այս պատուհանը։ Այս թարմացումը կարող է մի քանի րոպե տևել, և այդ ընթացքում արտաքին սարքը հնարավոր է, որ չաշխատի։</translation>
 <translation id="3486220673238053218">սահմանում</translation>
 <translation id="3488065109653206955">Մասամբ ակտիվացված</translation>
+<translation id="3510890413042482857">Ուղարկել <ph name="BEGIN_LINK1" />արդյունավետության հետագծման տվյալները<ph name="END_LINK1" /></translation>
 <translation id="3517001332549868749">ChromeOS-ի թարմացում</translation>
 <translation id="3527036260304016759">Չհաջողվեց տպել – Անհայտ սխալ</translation>
 <translation id="3532980081107202182">Մնացել է մոտ <ph name="MIN_REMAINING" /> րոպե</translation>
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb
index 7250424..98c1680f 100644
--- a/chromeos/strings/chromeos_strings_th.xtb
+++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -250,6 +250,7 @@
 <translation id="3484914941826596830">ขณะอัปเดตเฟิร์มแวร์ โปรดอย่าถอดปลั๊กอุปกรณ์ภายนอกเครื่องนี้หรือปิดคอมพิวเตอร์ คุณย่อหน้าต่างนี้ให้เล็กสุดได้ การอัปเดตอาจใช้เวลาสักครู่และอุปกรณ์ภายนอกอาจใช้ไม่ได้ในช่วงเวลานี้</translation>
 <translation id="3486220673238053218">คำจำกัดความ</translation>
 <translation id="3488065109653206955">เปิดการใช้งานบางส่วน</translation>
+<translation id="3510890413042482857">ส่ง<ph name="BEGIN_LINK1" />ข้อมูลการติดตามประสิทธิภาพ<ph name="END_LINK1" /></translation>
 <translation id="3517001332549868749">การอัปเดต Chrome OS</translation>
 <translation id="3527036260304016759">ไม่สำเร็จ - ข้อผิดพลาดที่ไม่รู้จัก</translation>
 <translation id="3532980081107202182">เหลือเวลาอีกประมาณ <ph name="MIN_REMAINING" /> นาที</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
index 7082cf5..16de95f 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
@@ -386,7 +386,7 @@
 <translation id="8959122750345127698">Ezin da joan <ph name="URL" /> orrira</translation>
 <translation id="8986362086234534611">Ahaztu</translation>
 <translation id="9019902583201351841">Gurasoek kudeatuta</translation>
-<translation id="9074739597929991885">Bluetooth-a</translation>
+<translation id="9074739597929991885">Bluetootha</translation>
 <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> eta beste <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> eta beste <ph name="NUM_MORE" />}}</translation>
 <translation id="913657688200966289">Aktibatu <ph name="APP_NAME" /> aplikaziorako baimenak <ph name="BEGIN_LINK" />Android-en ezarpenetan<ph name="END_LINK" />.</translation>
 <translation id="9162462602695099906">Orri hau arriskutsua da</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb
index 92a6c24..e1d883d6 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb
@@ -263,6 +263,7 @@
 <translation id="6554732001434021288">Oxirgi tashrif: <ph name="NUM_DAYS" /> kun oldin</translation>
 <translation id="6561560012278703671">Xabarlar tinchroq kelsin (bezovta qiluvchi bildirishnomalar bloklanadi)</translation>
 <translation id="6593061639179217415">Desktop versiya</translation>
+<translation id="6608211702542341247">Bu sayt guruhdagi faoliyatingizni koʻrishi mumkin boʻlgan <ph name="FPS_OWNER" />ning saytlar guruhiga kiradi</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
 <translation id="6612358246767739896">Himoyalangan kontent</translation>
 <translation id="662080504995468778">Qolaman</translation>
diff --git a/components/cast_channel/cast_auth_util.cc b/components/cast_channel/cast_auth_util.cc
index fee2c773..c7297d9 100644
--- a/components/cast_channel/cast_auth_util.cc
+++ b/components/cast_channel/cast_auth_util.cc
@@ -23,6 +23,24 @@
 #include "net/der/parse_values.h"
 
 namespace cast_channel {
+
+// Enforce nonce checking when enabled.
+// If disabled, the nonce value returned from the device is not checked against
+// the one sent to the device. As a result, the nonce can be empty and omitted
+// from the signature. This allows backwards compatibility with legacy Cast
+// receivers.
+BASE_FEATURE(kEnforceNonceChecking,
+             "CastNonceEnforced",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
+// Enforce the use of SHA256 digest for signatures.
+// If disabled, the device may respond with a signature with SHA1 digest even
+// though a signature with SHA256 digest was requested in the challenge. This
+// allows for backwards compatibility with legacy Cast receivers.
+BASE_FEATURE(kEnforceSHA256Checking,
+             "CastSHA256Enforced",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 namespace {
 
 const char kParseErrorPrefix[] = "Failed to parse auth message: ";
@@ -46,23 +64,6 @@
              "CastCertificateRevocation",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// Enforce nonce checking when enabled.
-// If disabled, the nonce value returned from the device is not checked against
-// the one sent to the device. As a result, the nonce can be empty and omitted
-// from the signature. This allows backwards compatibility with legacy Cast
-// receivers.
-BASE_FEATURE(kEnforceNonceChecking,
-             "CastNonceEnforced",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
-// Enforce the use of SHA256 digest for signatures.
-// If disabled, the device may respond with a signature with SHA1 digest even
-// though a signature with SHA256 digest was requested in the challenge. This
-// allows for backwards compatibility with legacy Cast receivers.
-BASE_FEATURE(kEnforceSHA256Checking,
-             "CastSHA256Enforced",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
 namespace cast_crypto = ::cast_certificate;
 
 // Extracts an embedded DeviceAuthMessage payload from an auth challenge reply
diff --git a/components/cast_channel/cast_auth_util.h b/components/cast_channel/cast_auth_util.h
index 5fef66b..77d7124f 100644
--- a/components/cast_channel/cast_auth_util.h
+++ b/components/cast_channel/cast_auth_util.h
@@ -7,6 +7,7 @@
 
 #include <string>
 
+#include "base/feature_list.h"
 #include "base/memory/ref_counted.h"
 #include "base/time/time.h"
 #include "third_party/openscreen/src/cast/common/channel/proto/cast_channel.pb.h"
@@ -25,6 +26,9 @@
 using ::cast::channel::AuthResponse;
 using ::cast::channel::CastMessage;
 
+BASE_DECLARE_FEATURE(kEnforceNonceChecking);
+BASE_DECLARE_FEATURE(kEnforceSHA256Checking);
+
 struct AuthResult {
  public:
   enum ErrorType {
diff --git a/components/cast_channel/cast_auth_util_unittest.cc b/components/cast_channel/cast_auth_util_unittest.cc
index 0884d45d..7e0a7ee 100644
--- a/components/cast_channel/cast_auth_util_unittest.cc
+++ b/components/cast_channel/cast_auth_util_unittest.cc
@@ -123,8 +123,7 @@
 
 TEST_F(CastAuthUtilTest, VerifyUnsupportedDigest) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      base::Feature{"CastSHA256Enforced", base::FEATURE_DISABLED_BY_DEFAULT});
+  scoped_feature_list.InitAndEnableFeature(kEnforceSHA256Checking);
   std::string signed_data;
   AuthResponse auth_response = CreateAuthResponse(&signed_data, SHA1);
   base::Time now = base::Time::Now();
@@ -156,8 +155,7 @@
 
 TEST_F(CastAuthUtilTest, VerifySenderNonceMatch) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      base::Feature{"CastNonceEnforced", base::FEATURE_DISABLED_BY_DEFAULT});
+  scoped_feature_list.InitAndEnableFeature(kEnforceNonceChecking);
   AuthContext context = AuthContext::Create();
   AuthResult result = context.VerifySenderNonce(context.nonce());
   EXPECT_TRUE(result.success());
@@ -165,8 +163,7 @@
 
 TEST_F(CastAuthUtilTest, VerifySenderNonceMismatch) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      base::Feature{"CastNonceEnforced", base::FEATURE_DISABLED_BY_DEFAULT});
+  scoped_feature_list.InitAndEnableFeature(kEnforceNonceChecking);
   AuthContext context = AuthContext::Create();
   std::string received_nonce = "test2";
   EXPECT_NE(received_nonce, context.nonce());
@@ -177,8 +174,7 @@
 
 TEST_F(CastAuthUtilTest, VerifySenderNonceMissing) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      base::Feature{"CastNonceEnforced", base::FEATURE_DISABLED_BY_DEFAULT});
+  scoped_feature_list.InitAndEnableFeature(kEnforceNonceChecking);
   AuthContext context = AuthContext::Create();
   std::string received_nonce;
   EXPECT_FALSE(context.nonce().empty());
diff --git a/components/feed/core/proto/v2/store.proto b/components/feed/core/proto/v2/store.proto
index 352a8330..e8b69ea 100644
--- a/components/feed/core/proto/v2/store.proto
+++ b/components/feed/core/proto/v2/store.proto
@@ -85,7 +85,7 @@
 
   // Metadata about a specific stream.
   message StreamMetadata {
-    string stream_id = 1;
+    string stream_key = 1;
     // Whether the stream data is known to be stale. This can happen in the
     // WebFeed stream if the subscription list changes.
     bool is_known_stale = 3;
diff --git a/components/feed/core/v2/BUILD.gn b/components/feed/core/v2/BUILD.gn
index 9f02977..8c00477 100644
--- a/components/feed/core/v2/BUILD.gn
+++ b/components/feed/core/v2/BUILD.gn
@@ -218,6 +218,7 @@
     "public/logging_parameters_unittest.cc",
     "public/ntp_feed_content_fetcher_unittest.cc",
     "public/public_types_unittest.cc",
+    "public/stream_type_unittest.cc",
     "request_throttler_unittest.cc",
     "scheduling_unittest.cc",
     "stream/info_card_tracker_unittest.cc",
diff --git a/components/feed/core/v2/api_test/feed_api_notice_card_unittest.cc b/components/feed/core/v2/api_test/feed_api_notice_card_unittest.cc
index 9fac0521..c511ff2 100644
--- a/components/feed/core/v2/api_test/feed_api_notice_card_unittest.cc
+++ b/components/feed/core/v2/api_test/feed_api_notice_card_unittest.cc
@@ -80,7 +80,7 @@
     WaitForIdleTaskQueue();
   }
 
-  UnloadModel(kForYouStream);
+  UnloadModel(StreamType(StreamKind::kForYou));
 
   // Trigger another stream refresh that updates the histogram.
   {
diff --git a/components/feed/core/v2/api_test/feed_api_reliability_logging_unittest.cc b/components/feed/core/v2/api_test/feed_api_reliability_logging_unittest.cc
index 47812e66..febceb72c 100644
--- a/components/feed/core/v2/api_test/feed_api_reliability_logging_unittest.cc
+++ b/components/feed/core/v2/api_test/feed_api_reliability_logging_unittest.cc
@@ -310,13 +310,13 @@
 
 TEST_F(FeedApiReliabilityLoggingTest, CacheRead_Stale) {
   store_->OverwriteStream(
-      kForYouStream,
+      StreamType(StreamKind::kForYou),
       MakeTypicalInitialModelState(
-          /*first_cluster_id=*/0,
-          kTestTimeEpoch -
-              GetFeedConfig().GetStalenessThreshold(
-                  kForYouStream, /*is_web_feed_subscriber=*/true) -
-              base::Minutes(1)),
+          /*first_cluster_id=*/0, kTestTimeEpoch -
+                                      GetFeedConfig().GetStalenessThreshold(
+                                          StreamType(StreamKind::kForYou),
+                                          /*is_web_feed_subscriber=*/true) -
+                                      base::Minutes(1)),
       base::DoNothing());
 
   // Store is stale, so we should fallback to a network request.
@@ -344,13 +344,13 @@
 TEST_F(FeedApiReliabilityLoggingTest, CacheRead_StaleWithNetworkError) {
   network_.http_status_code = net::HttpStatusCode::HTTP_FORBIDDEN;
   store_->OverwriteStream(
-      kForYouStream,
+      StreamType(StreamKind::kForYou),
       MakeTypicalInitialModelState(
-          /*first_cluster_id=*/0,
-          kTestTimeEpoch -
-              GetFeedConfig().GetStalenessThreshold(
-                  kForYouStream, /*is_web_feed_subscriber=*/true) -
-              base::Minutes(1)),
+          /*first_cluster_id=*/0, kTestTimeEpoch -
+                                      GetFeedConfig().GetStalenessThreshold(
+                                          StreamType(StreamKind::kForYou),
+                                          /*is_web_feed_subscriber=*/true) -
+                                      base::Minutes(1)),
       base::DoNothing());
 
   // Store is stale, so we should fallback to a network request.
@@ -376,8 +376,8 @@
 }
 
 TEST_F(FeedApiReliabilityLoggingTest, CacheRead_Okay) {
-  store_->OverwriteStream(kForYouStream, MakeTypicalInitialModelState(),
-                          base::DoNothing());
+  store_->OverwriteStream(StreamType(StreamKind::kForYou),
+                          MakeTypicalInitialModelState(), base::DoNothing());
   WaitForIdleTaskQueue();
 
   TestForYouSurface surface(stream_.get());
diff --git a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc
index a554520..37d4cc7 100644
--- a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc
+++ b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc
@@ -74,7 +74,7 @@
   EXPECT_EQ(feedwire::FeedQuery::SCHEDULED_REFRESH,
             network_.query_request_sent->feed_request().feed_query().reason());
   EXPECT_TRUE(response_translator_.InjectedResponseConsumed());
-  EXPECT_FALSE(stream_->GetModel(kForYouStream));
+  EXPECT_FALSE(stream_->GetModel(StreamType(StreamKind::kForYou)));
   TestForYouSurface surface(stream_.get());
   WaitForIdleTaskQueue();
   EXPECT_EQ("loading -> [user@foo] 2 slices", surface.DescribeUpdates());
@@ -120,7 +120,8 @@
   stream_->ExecuteRefreshTask(RefreshTaskId::kRefreshForYouFeed);
   WaitForIdleTaskQueue();
 
-  EXPECT_EQ(metrics_reporter_->Stream(kForYouStream).background_refresh_status,
+  EXPECT_EQ(metrics_reporter_->Stream(StreamType(StreamKind::kForYou))
+                .background_refresh_status,
             LoadStreamStatus::kModelAlreadyLoaded);
 }
 
@@ -195,17 +196,19 @@
   {
     auto model = CreateStreamModel();
     model->ExecuteOperations(MakeTypicalStreamOperations());
-    stream_->LoadModelForTesting(kForYouStream, std::move(model));
+    stream_->LoadModelForTesting(StreamType(StreamKind::kForYou),
+                                 std::move(model));
   }
   TestForYouSurface surface(stream_.get());
   // Remove #1, add #2.
   stream_->ExecuteOperations(
-      kForYouStream, {
-                         MakeOperation(MakeRemove(MakeClusterId(1))),
-                         MakeOperation(MakeCluster(2, MakeRootId())),
-                         MakeOperation(MakeContentNode(2, MakeClusterId(2))),
-                         MakeOperation(MakeContent(2)),
-                     });
+      StreamType(StreamKind::kForYou),
+      {
+          MakeOperation(MakeRemove(MakeClusterId(1))),
+          MakeOperation(MakeCluster(2, MakeRootId())),
+          MakeOperation(MakeContentNode(2, MakeClusterId(2))),
+          MakeOperation(MakeContent(2)),
+      });
   ASSERT_TRUE(surface.update);
   const feedui::StreamUpdate& initial_state = surface.initial_state.value();
   const feedui::StreamUpdate& update = surface.update.value();
@@ -224,24 +227,27 @@
   {
     auto model = CreateStreamModel();
     model->ExecuteOperations(MakeTypicalStreamOperations());
-    stream_->LoadModelForTesting(kForYouStream, std::move(model));
+    stream_->LoadModelForTesting(StreamType(StreamKind::kForYou),
+                                 std::move(model));
   }
   TestForYouSurface surface(stream_.get());
   // Add #2.
   stream_->ExecuteOperations(
-      kForYouStream, {
-                         MakeOperation(MakeCluster(2, MakeRootId())),
-                         MakeOperation(MakeContentNode(2, MakeClusterId(2))),
-                         MakeOperation(MakeContent(2)),
-                     });
+      StreamType(StreamKind::kForYou),
+      {
+          MakeOperation(MakeCluster(2, MakeRootId())),
+          MakeOperation(MakeContentNode(2, MakeClusterId(2))),
+          MakeOperation(MakeContent(2)),
+      });
 
   // Clear the last update and add #3.
   stream_->ExecuteOperations(
-      kForYouStream, {
-                         MakeOperation(MakeCluster(3, MakeRootId())),
-                         MakeOperation(MakeContentNode(3, MakeClusterId(3))),
-                         MakeOperation(MakeContent(3)),
-                     });
+      StreamType(StreamKind::kForYou),
+      {
+          MakeOperation(MakeCluster(3, MakeRootId())),
+          MakeOperation(MakeContentNode(3, MakeClusterId(3))),
+          MakeOperation(MakeContent(3)),
+      });
 
   // The last update should have only one new piece of content.
   // This verifies the current content set is tracked properly.
@@ -263,7 +269,7 @@
   WaitForIdleTaskQueue();
 
   // Remove both pieces of content.
-  stream_->ExecuteOperations(kForYouStream,
+  stream_->ExecuteOperations(StreamType(StreamKind::kForYou),
                              {
                                  MakeOperation(MakeRemove(MakeClusterId(0))),
                                  MakeOperation(MakeRemove(MakeClusterId(1))),
@@ -277,7 +283,8 @@
   {
     auto model = CreateStreamModel();
     model->ExecuteOperations(MakeTypicalStreamOperations());
-    stream_->LoadModelForTesting(kForYouStream, std::move(model));
+    stream_->LoadModelForTesting(StreamType(StreamKind::kForYou),
+                                 std::move(model));
   }
   TestForYouSurface surface(stream_.get());
   EXPECT_TRUE(surface.initial_state);
@@ -285,7 +292,7 @@
   surface.Clear();
 
   // Arbitrary stream change. Surface should not see the update.
-  stream_->ExecuteOperations(kForYouStream,
+  stream_->ExecuteOperations(StreamType(StreamKind::kForYou),
                              {
                                  MakeOperation(MakeRemove(MakeClusterId(1))),
                              });
@@ -630,7 +637,7 @@
 
 TEST_F(FeedApiTest, LoadFromNetworkBecauseStoreIsStale_NetworkStaleAge) {
   base::TimeDelta default_staleness_threshold =
-      GetFeedConfig().GetStalenessThreshold(kForYouStream,
+      GetFeedConfig().GetStalenessThreshold(StreamType(StreamKind::kForYou),
                                             /*is_web_feed_subscriber=*/true);
   base::TimeDelta server_staleness_threshold = default_staleness_threshold / 2;
 
@@ -747,7 +754,7 @@
   const base::TimeDelta kContentAge =
       GetFeedConfig().content_expiration_threshold + base::Minutes(1);
   store_->OverwriteStream(
-      kForYouStream,
+      StreamType(StreamKind::kForYou),
       MakeTypicalInitialModelState(
           /*first_cluster_id=*/0, kTestTimeEpoch - kContentAge),
       base::DoNothing());
@@ -773,7 +780,7 @@
   const base::TimeDelta kContentAge =
       GetFeedConfig().stale_content_threshold + base::Minutes(1);
   store_->OverwriteStream(
-      kForYouStream,
+      StreamType(StreamKind::kForYou),
       MakeTypicalInitialModelState(
           /*first_cluster_id=*/0, kTestTimeEpoch - kContentAge),
       base::DoNothing());
@@ -931,7 +938,7 @@
             kSessionId);
 
   // The model should still be in the signed-out state.
-  EXPECT_FALSE(stream_->GetModel(kForYouStream)->signed_in());
+  EXPECT_FALSE(stream_->GetModel(StreamType(StreamKind::kForYou))->signed_in());
 
   // Force a refresh of the feed by clearing the cache. The request for the
   // first page should revert back to signed-in. The response data will denote
@@ -946,7 +953,7 @@
   EXPECT_NE(AccountInfo{}, network_.last_account_info);
 
   // The model should now be in the signed-in state.
-  EXPECT_TRUE(stream_->GetModel(kForYouStream)->signed_in());
+  EXPECT_TRUE(stream_->GetModel(StreamType(StreamKind::kForYou))->signed_in());
   EXPECT_TRUE(stream_->GetMetadata().session_id().token().empty());
 
   EXPECT_EQ("2 slices +spinner -> 4 slices -> loading -> [user@foo] 2 slices",
@@ -983,8 +990,8 @@
   LoadStreamStatus status = LoadStreamStatus::kNoStatus;
   for (; status == LoadStreamStatus::kNoStatus;
        status = stream_
-                    ->ShouldMakeFeedQueryRequest(kForYouStream,
-                                                 LoadType::kInitialLoad)
+                    ->ShouldMakeFeedQueryRequest(
+                        StreamType(StreamKind::kForYou), LoadType::kInitialLoad)
                     .load_stream_status) {
   }
 
@@ -995,7 +1002,7 @@
   // Fill the store with stream data that is just barely fresh, and verify it
   // loads.
   store_->OverwriteStream(
-      kForYouStream,
+      StreamType(StreamKind::kForYou),
       MakeTypicalInitialModelState(
           /*first_cluster_id=*/0, kTestTimeEpoch -
                                       GetFeedConfig().stale_content_threshold +
@@ -1008,7 +1015,8 @@
   EXPECT_FALSE(network_.query_request_sent);
   // Verify the model is filled correctly.
   EXPECT_STRINGS_EQUAL(ModelStateFor(MakeTypicalInitialModelState()),
-                       stream_->GetModel(kForYouStream)->DumpStateForTesting());
+                       stream_->GetModel(StreamType(StreamKind::kForYou))
+                           ->DumpStateForTesting());
 }
 
 TEST_F(FeedApiTest, LoadStreamFromStoreValidatesUser) {
@@ -1016,7 +1024,8 @@
   {
     auto state = MakeTypicalInitialModelState();
     state->stream_data.set_email("other@gmail.com");
-    store_->OverwriteStream(kForYouStream, std::move(state), base::DoNothing());
+    store_->OverwriteStream(StreamType(StreamKind::kForYou), std::move(state),
+                            base::DoNothing());
   }
 
   TestForYouSurface surface(stream_.get());
@@ -1026,8 +1035,8 @@
 }
 
 TEST_F(FeedApiTest, LoadingSpinnerIsSentInitially) {
-  store_->OverwriteStream(kForYouStream, MakeTypicalInitialModelState(),
-                          base::DoNothing());
+  store_->OverwriteStream(StreamType(StreamKind::kForYou),
+                          MakeTypicalInitialModelState(), base::DoNothing());
   TestForYouSurface surface(stream_.get());
 
   ASSERT_EQ("loading", surface.DescribeUpdates());
@@ -1109,8 +1118,8 @@
 }
 
 TEST_F(FeedApiTest, ReportSliceViewedIdentifiesCorrectIndex) {
-  store_->OverwriteStream(kForYouStream, MakeTypicalInitialModelState(),
-                          base::DoNothing());
+  store_->OverwriteStream(StreamType(StreamKind::kForYou),
+                          MakeTypicalInitialModelState(), base::DoNothing());
   TestForYouSurface surface(stream_.get());
   WaitForIdleTaskQueue();
 
@@ -1121,8 +1130,8 @@
 }
 
 TEST_F(FeedApiTest, ReportOpenInNewTabAction) {
-  store_->OverwriteStream(kForYouStream, MakeTypicalInitialModelState(),
-                          base::DoNothing());
+  store_->OverwriteStream(StreamType(StreamKind::kForYou),
+                          MakeTypicalInitialModelState(), base::DoNothing());
   TestForYouSurface surface(stream_.get());
   WaitForIdleTaskQueue();
 
@@ -1138,8 +1147,8 @@
 }
 
 TEST_F(FeedApiTest, ReportOpenInNewTabInGroupAction) {
-  store_->OverwriteStream(kForYouStream, MakeTypicalInitialModelState(),
-                          base::DoNothing());
+  store_->OverwriteStream(StreamType(StreamKind::kForYou),
+                          MakeTypicalInitialModelState(), base::DoNothing());
   TestForYouSurface surface(stream_.get());
   WaitForIdleTaskQueue();
 
@@ -1157,7 +1166,7 @@
 TEST_F(FeedApiTest, HasUnreadContentAfterLoadFromNetwork) {
   response_translator_.InjectResponse(MakeTypicalInitialModelState());
   TestUnreadContentObserver observer;
-  stream_->AddUnreadContentObserver(kForYouStream, &observer);
+  stream_->AddUnreadContentObserver(StreamType(StreamKind::kForYou), &observer);
   TestForYouSurface surface(stream_.get());
 
   WaitForIdleTaskQueue();
@@ -1177,7 +1186,7 @@
   // After initialization, the observer will be informed about unread content.
   CreateStream(/*wait_for_initialization*/ false);
   TestUnreadContentObserver observer;
-  stream_->AddUnreadContentObserver(kForYouStream, &observer);
+  stream_->AddUnreadContentObserver(StreamType(StreamKind::kForYou), &observer);
   WaitForIdleTaskQueue();
 
   EXPECT_EQ(std::vector<bool>({true}), observer.calls);
@@ -1185,7 +1194,7 @@
 
 TEST_F(FeedApiTest, NetworkFetchWithNoNewContentDoesNotProvideUnreadContent) {
   TestUnreadContentObserver observer;
-  stream_->AddUnreadContentObserver(kForYouStream, &observer);
+  stream_->AddUnreadContentObserver(StreamType(StreamKind::kForYou), &observer);
   // Load content from the network, and view it.
   {
     response_translator_.InjectResponse(MakeTypicalInitialModelState());
@@ -1212,8 +1221,9 @@
 TEST_F(FeedApiTest, RemovedUnreadContentObserverDoesNotReceiveCalls) {
   response_translator_.InjectResponse(MakeTypicalInitialModelState());
   TestUnreadContentObserver observer;
-  stream_->AddUnreadContentObserver(kForYouStream, &observer);
-  stream_->RemoveUnreadContentObserver(kForYouStream, &observer);
+  stream_->AddUnreadContentObserver(StreamType(StreamKind::kForYou), &observer);
+  stream_->RemoveUnreadContentObserver(StreamType(StreamKind::kForYou),
+                                       &observer);
   TestForYouSurface surface(stream_.get());
 
   WaitForIdleTaskQueue();
@@ -1225,7 +1235,8 @@
   response_translator_.InjectResponse(MakeTypicalInitialModelState());
   {
     TestUnreadContentObserver observer;
-    stream_->AddUnreadContentObserver(kForYouStream, &observer);
+    stream_->AddUnreadContentObserver(StreamType(StreamKind::kForYou),
+                                      &observer);
   }
   TestForYouSurface surface(stream_.get());
 
@@ -1233,11 +1244,11 @@
 }
 
 TEST_F(FeedApiTest, HasUnreadContentAfterLoadFromStore) {
-  store_->OverwriteStream(kForYouStream, MakeTypicalInitialModelState(),
-                          base::DoNothing());
+  store_->OverwriteStream(StreamType(StreamKind::kForYou),
+                          MakeTypicalInitialModelState(), base::DoNothing());
   TestForYouSurface surface(stream_.get());
   TestUnreadContentObserver observer;
-  stream_->AddUnreadContentObserver(kForYouStream, &observer);
+  stream_->AddUnreadContentObserver(StreamType(StreamKind::kForYou), &observer);
 
   WaitForIdleTaskQueue();
 
@@ -1273,7 +1284,8 @@
 // Also verify the unread content observer events.
 TEST_F(FeedApiTest, FollowForcesRefresh) {
   TestUnreadContentObserver unread_observer;
-  stream_->AddUnreadContentObserver(kWebFeedStream, &unread_observer);
+  stream_->AddUnreadContentObserver(StreamType(StreamKind::kFollowing),
+                                    &unread_observer);
 
   // Load the web feed stream and view it.
   network_.InjectListWebFeedsResponse({MakeWireWebFeed("cats")});
@@ -1311,7 +1323,7 @@
   response_translator_.InjectResponse(MakeTypicalInitialModelState());
   TestForYouSurface surface(stream_.get());
   TestUnreadContentObserver observer;
-  stream_->AddUnreadContentObserver(kForYouStream, &observer);
+  stream_->AddUnreadContentObserver(StreamType(StreamKind::kForYou), &observer);
   WaitForIdleTaskQueue();
 
   stream_->ReportFeedViewed(surface.GetStreamType(), surface.GetSurfaceId());
@@ -1323,7 +1335,8 @@
   CreateStream();
 
   TestUnreadContentObserver observer2;
-  stream_->AddUnreadContentObserver(kForYouStream, &observer2);
+  stream_->AddUnreadContentObserver(StreamType(StreamKind::kForYou),
+                                    &observer2);
   TestForYouSurface surface2(stream_.get());
   WaitForIdleTaskQueue();
 
@@ -1394,7 +1407,7 @@
   ASSERT_EQ(absl::optional<bool>(true), callback.GetResult());
 
   surface.Detach();
-  UnloadModel(kForYouStream);
+  UnloadModel(StreamType(StreamKind::kForYou));
 
   // Load page 3.
   surface.Attach(stream_.get());
@@ -1410,7 +1423,7 @@
   // Verify stored state is equivalent to in-memory model.
   EXPECT_STRINGS_EQUAL(
       stream_->GetModel(surface.GetStreamType())->DumpStateForTesting(),
-      ModelStateFor(kForYouStream, store_.get()));
+      ModelStateFor(StreamType(StreamKind::kForYou), store_.get()));
 }
 
 TEST_F(FeedApiTest, LoadMoreSendsTokens) {
@@ -1513,7 +1526,7 @@
   // Verify stored state is equivalent to in-memory model.
   EXPECT_STRINGS_EQUAL(
       stream_->GetModel(surface.GetStreamType())->DumpStateForTesting(),
-      ModelStateFor(kForYouStream, store_.get()));
+      ModelStateFor(StreamType(StreamKind::kForYou), store_.get()));
 
   // Verify the new state has been pushed to |surface|.
   ASSERT_EQ("2 slices +spinner -> 2 slices", surface.DescribeUpdates());
@@ -1568,7 +1581,7 @@
   // The stream's user attributes are set, so activity logging is enabled.
   EXPECT_TRUE(surface.update->logging_parameters().logging_enabled());
   // This network response has content.
-  EXPECT_TRUE(stream_->HasUnreadContent(kForYouStream));
+  EXPECT_TRUE(stream_->HasUnreadContent(StreamType(StreamKind::kForYou)));
 }
 
 TEST_F(FeedApiTest, ReadNetworkResponseWithNoContent) {
@@ -1580,7 +1593,7 @@
   ASSERT_EQ("loading -> loading -> no-cards", surface.DescribeUpdates());
 
   // This network response has no content.
-  EXPECT_FALSE(stream_->HasUnreadContent(kForYouStream));
+  EXPECT_FALSE(stream_->HasUnreadContent(StreamType(StreamKind::kForYou)));
 }
 
 TEST_F(FeedApiTest, ClearAllAfterLoadResultsInRefresh) {
@@ -2202,7 +2215,9 @@
   EXPECT_FALSE(stream_->GetModel(surface.GetStreamType()));
   const bool is_for_next_page = false;  // No model so no first page yet.
   const std::string new_instance_id =
-      stream_->GetRequestMetadata(kForYouStream, is_for_next_page)
+      stream_
+          ->GetRequestMetadata(StreamType(StreamKind::kForYou),
+                               is_for_next_page)
           .client_instance_id;
   ASSERT_NE("", new_instance_id);
   ASSERT_NE(first_instance_id, new_instance_id);
@@ -2443,6 +2458,7 @@
 }
 
 TEST_F(FeedApiTest, LoadMultipleStreams) {
+  // TODO(crbug.com/1369777) Add support for channel feed.
   response_translator_.InjectResponse(MakeTypicalInitialModelState());
   response_translator_.InjectResponse(MakeTypicalInitialModelState());
   // WebFeed stream is only fetched when there's a subscription.
@@ -2479,8 +2495,8 @@
   WaitForModelToAutoUnload();
   WaitForIdleTaskQueue();
 
-  EXPECT_TRUE(stream_->GetModel(kWebFeedStream));
-  EXPECT_FALSE(stream_->GetModel(kForYouStream));
+  EXPECT_TRUE(stream_->GetModel(StreamType(StreamKind::kFollowing)));
+  EXPECT_FALSE(stream_->GetModel(StreamType(StreamKind::kForYou)));
 }
 
 TEST_F(FeedApiTest, ExperimentsAreClearedOnClearAll) {
@@ -2551,7 +2567,7 @@
 
   // Verify the new data was stored.
   std::unique_ptr<StreamModelUpdateRequest> stored_data =
-      StoredModelData(kForYouStream, store_.get());
+      StoredModelData(StreamType(StreamKind::kForYou), store_.get());
   ASSERT_TRUE(stored_data);
   EXPECT_EQ("new-shared-data",
             stored_data->shared_states[0].shared_state_data());
@@ -2563,27 +2579,27 @@
   TestForYouSurface surface(stream_.get());
   WaitForIdleTaskQueue();
   EXPECT_EQ("loading -> [user@foo] 2 slices", surface.DescribeUpdates());
-  ASSERT_TRUE(stream_->HasUnreadContent(kForYouStream));
+  ASSERT_TRUE(stream_->HasUnreadContent(StreamType(StreamKind::kForYou)));
   stream_->ReportFeedViewed(surface.GetStreamType(), surface.GetSurfaceId());
 
-  EXPECT_FALSE(stream_->HasUnreadContent(kForYouStream));
+  EXPECT_FALSE(stream_->HasUnreadContent(StreamType(StreamKind::kForYou)));
 }
 
 TEST_F(FeedApiTest, HasUnreadContentRemainsFalseIfFeedViewedBeforeRefresh) {
   response_translator_.InjectResponse(MakeTypicalInitialModelState());
   TestForYouSurface surface(stream_.get());
   WaitForIdleTaskQueue();
-  ASSERT_TRUE(stream_->HasUnreadContent(kForYouStream));
+  ASSERT_TRUE(stream_->HasUnreadContent(StreamType(StreamKind::kForYou)));
   stream_->ReportFeedViewed(surface.GetStreamType(), surface.GetSurfaceId());
 
   response_translator_.InjectResponse(MakeTypicalRefreshModelState());
-  stream_->ManualRefresh(kForYouStream, base::DoNothing());
+  stream_->ManualRefresh(StreamType(StreamKind::kForYou), base::DoNothing());
 
   WaitForIdleTaskQueue();
 
   EXPECT_EQ("loading -> [user@foo] 2 slices -> 3 slices",
             surface.DescribeUpdates());
-  EXPECT_FALSE(stream_->HasUnreadContent(kForYouStream));
+  EXPECT_FALSE(stream_->HasUnreadContent(StreamType(StreamKind::kForYou)));
 }
 
 TEST_F(FeedApiTest,
@@ -2621,9 +2637,9 @@
   EXPECT_EQ("loading -> [user@foo] 2 slices", surface.DescribeUpdates());
   EXPECT_EQ(LoadStreamStatus::kLoadedFromNetwork,
             metrics_reporter_->load_stream_status);
-  EXPECT_EQ(
-      LoadStreamStatus::kNotAWebFeedSubscriber,
-      metrics_reporter_->Stream(kWebFeedStream).background_refresh_status);
+  EXPECT_EQ(LoadStreamStatus::kNotAWebFeedSubscriber,
+            metrics_reporter_->Stream(StreamType(StreamKind::kFollowing))
+                .background_refresh_status);
 }
 
 TEST_F(
@@ -2655,9 +2671,9 @@
   EXPECT_FALSE(stream_->WasUrlRecentlyNavigatedFromFeed(url1));
   EXPECT_FALSE(stream_->WasUrlRecentlyNavigatedFromFeed(url2));
 
-  stream_->ReportOpenAction(url1, kForYouStream, "slice",
+  stream_->ReportOpenAction(url1, StreamType(StreamKind::kForYou), "slice",
                             OpenActionType::kDefault);
-  stream_->ReportOpenAction(url2, kForYouStream, "slice",
+  stream_->ReportOpenAction(url2, StreamType(StreamKind::kForYou), "slice",
                             OpenActionType::kNewTab);
 
   EXPECT_TRUE(stream_->WasUrlRecentlyNavigatedFromFeed(url1));
@@ -2671,7 +2687,7 @@
     urls.emplace_back("https://someurl" + base::NumberToString(i));
 
   for (const GURL& url : urls)
-    stream_->ReportOpenAction(url, kForYouStream, "slice",
+    stream_->ReportOpenAction(url, StreamType(StreamKind::kForYou), "slice",
                               OpenActionType::kDefault);
 
   EXPECT_FALSE(stream_->WasUrlRecentlyNavigatedFromFeed(urls[0]));
@@ -2786,7 +2802,7 @@
   // Verify stored state is equivalent to in-memory model.
   EXPECT_STRINGS_EQUAL(
       stream_->GetModel(surface.GetStreamType())->DumpStateForTesting(),
-      ModelStateFor(kForYouStream, store_.get()));
+      ModelStateFor(StreamType(StreamKind::kForYou), store_.get()));
   // Verify another feed is not affected.
   EXPECT_EQ("", surface2.DescribeUpdates());
 }
@@ -2812,7 +2828,7 @@
   // Verify stored state is equivalent to in-memory model.
   EXPECT_STRINGS_EQUAL(
       stream_->GetModel(surface.GetStreamType())->DumpStateForTesting(),
-      ModelStateFor(kWebFeedStream, store_.get()));
+      ModelStateFor(StreamType(StreamKind::kFollowing), store_.get()));
   // Verify another feed is not affected.
   EXPECT_EQ("", surface2.DescribeUpdates());
 }
@@ -2863,7 +2879,7 @@
   // Verify stored state is equivalent to in-memory model.
   EXPECT_STRINGS_EQUAL(
       stream_->GetModel(surface.GetStreamType())->DumpStateForTesting(),
-      ModelStateFor(kForYouStream, store_.get()));
+      ModelStateFor(StreamType(StreamKind::kForYou), store_.get()));
 }
 
 TEST_F(FeedApiTest, ManualRefreshSuccessAfterPreviousLoadFailure) {
@@ -2882,7 +2898,7 @@
   // Verify stored state is equivalent to in-memory model.
   EXPECT_STRINGS_EQUAL(
       stream_->GetModel(surface.GetStreamType())->DumpStateForTesting(),
-      ModelStateFor(kForYouStream, store_.get()));
+      ModelStateFor(StreamType(StreamKind::kForYou), store_.get()));
 }
 
 TEST_F(FeedApiTest, ManualRefreshFailesWhenLoadingInProgress) {
@@ -2968,7 +2984,8 @@
 
   base::HistogramTester histograms;
   response_translator_.InjectResponse(MakeTypicalInitialModelState());
-  stream_->SetContentOrder(kWebFeedStream, ContentOrder::kReverseChron);
+  stream_->SetContentOrder(StreamType(StreamKind::kFollowing),
+                           ContentOrder::kReverseChron);
   WaitForIdleTaskQueue();
 
   EXPECT_EQ("loading -> [user@foo] 2 slices -> loading -> 2 slices",
@@ -2977,7 +2994,7 @@
       feedwire::FeedQuery::ContentOrder::FeedQuery_ContentOrder_RECENT,
       network_.query_request_sent->feed_request().feed_query().order_by());
   EXPECT_EQ(ContentOrder::kReverseChron,
-            stream_->GetContentOrder(kWebFeedStream));
+            stream_->GetContentOrder(StreamType(StreamKind::kFollowing)));
   histograms.ExpectUniqueSample(
       "ContentSuggestions.Feed.WebFeed.RefreshContentOrder",
       ContentOrder::kReverseChron, 1);
@@ -2992,14 +3009,16 @@
   TestWebFeedSurface surface(stream_.get());
   WaitForIdleTaskQueue();
 
-  stream_->SetContentOrder(kWebFeedStream, ContentOrder::kGrouped);
+  stream_->SetContentOrder(StreamType(StreamKind::kFollowing),
+                           ContentOrder::kGrouped);
   WaitForIdleTaskQueue();
 
   EXPECT_EQ("loading -> [user@foo] 2 slices", surface.DescribeUpdates());
   // "Raw prefs" order value should have been updated.
   EXPECT_EQ(ContentOrder::kGrouped,
             feed::prefs::GetWebFeedContentOrder(profile_prefs_));
-  EXPECT_EQ(ContentOrder::kGrouped, stream_->GetContentOrder(kWebFeedStream));
+  EXPECT_EQ(ContentOrder::kGrouped,
+            stream_->GetContentOrder(StreamType(StreamKind::kFollowing)));
 }
 
 TEST_F(FeedApiTest, ContentOrderIsFinchControllable) {
@@ -3019,7 +3038,7 @@
       feedwire::FeedQuery::ContentOrder::FeedQuery_ContentOrder_RECENT,
       network_.query_request_sent->feed_request().feed_query().order_by());
   EXPECT_EQ(ContentOrder::kReverseChron,
-            stream_->GetContentOrder(kWebFeedStream));
+            stream_->GetContentOrder(StreamType(StreamKind::kFollowing)));
 }
 
 TEST_F(FeedApiTest, ContentOrderPrefOverridesFinch) {
@@ -3040,7 +3059,8 @@
   EXPECT_EQ(
       feedwire::FeedQuery::ContentOrder::FeedQuery_ContentOrder_GROUPED,
       network_.query_request_sent->feed_request().feed_query().order_by());
-  EXPECT_EQ(ContentOrder::kGrouped, stream_->GetContentOrder(kWebFeedStream));
+  EXPECT_EQ(ContentOrder::kGrouped,
+            stream_->GetContentOrder(StreamType(StreamKind::kFollowing)));
 }
 
 // This is a regression test for crbug.com/1249772.
@@ -3059,7 +3079,7 @@
   WaitForIdleTaskQueue();
   stream_->ReportFeedViewed(surface.GetStreamType(), surface.GetSurfaceId());
   TestUnreadContentObserver observer;
-  stream_->AddUnreadContentObserver(kForYouStream, &observer);
+  stream_->AddUnreadContentObserver(StreamType(StreamKind::kForYou), &observer);
   account_info_ = TestAccountInfo();
   stream_->OnSignedIn();
   response_translator_.InjectResponse(MakeTypicalRefreshModelState());
@@ -3098,8 +3118,9 @@
 
   // Assert.
   EXPECT_EQ(1, stream_->GetMetadata().followed_from_web_page_menu_count());
-  EXPECT_EQ(1, stream_->GetRequestMetadata(kWebFeedStream, false)
-                   .followed_from_web_page_menu_count);
+  EXPECT_EQ(
+      1, stream_->GetRequestMetadata(StreamType(StreamKind::kFollowing), false)
+             .followed_from_web_page_menu_count);
 
   // We should report exactly 1 case of followed from the menu in the feed
   // request.
@@ -3133,11 +3154,15 @@
   // Perform actions on one info card and verify the histograms.
   base::Time first_view_timestamp2 = base::Time::Now() + timestamp_adjustment;
   base::Time last_view_timestamp2 = first_view_timestamp2;
-  stream_->ReportInfoCardTrackViewStarted(kForYouStream, kTestInfoCardType2);
-  stream_->ReportInfoCardViewed(kForYouStream, kTestInfoCardType2,
+  stream_->ReportInfoCardTrackViewStarted(StreamType(StreamKind::kForYou),
+                                          kTestInfoCardType2);
+  stream_->ReportInfoCardViewed(StreamType(StreamKind::kForYou),
+                                kTestInfoCardType2,
                                 kMinimumViewIntervalSeconds);
-  stream_->ReportInfoCardClicked(kForYouStream, kTestInfoCardType2);
-  stream_->ReportInfoCardClicked(kForYouStream, kTestInfoCardType2);
+  stream_->ReportInfoCardClicked(StreamType(StreamKind::kForYou),
+                                 kTestInfoCardType2);
+  stream_->ReportInfoCardClicked(StreamType(StreamKind::kForYou),
+                                 kTestInfoCardType2);
   histograms.ExpectUniqueSample("ContentSuggestions.Feed.InfoCard.Started",
                                 kTestInfoCardType2, 1);
   histograms.ExpectBucketCount("ContentSuggestions.Feed.InfoCard.Viewed",
@@ -3149,17 +3174,22 @@
 
   // Perform actions on another info card and verify the histograms.
   base::Time first_view_timestamp1 = base::Time::Now() + timestamp_adjustment;
-  stream_->ReportInfoCardViewed(kForYouStream, kTestInfoCardType1,
+  stream_->ReportInfoCardViewed(StreamType(StreamKind::kForYou),
+                                kTestInfoCardType1,
                                 kMinimumViewIntervalSeconds);
   task_environment_.AdvanceClock(base::Seconds(kMinimumViewIntervalSeconds));
-  stream_->ReportInfoCardViewed(kForYouStream, kTestInfoCardType1,
+  stream_->ReportInfoCardViewed(StreamType(StreamKind::kForYou),
+                                kTestInfoCardType1,
                                 kMinimumViewIntervalSeconds);
   task_environment_.AdvanceClock(base::Seconds(kMinimumViewIntervalSeconds));
   base::Time last_view_timestamp1 = base::Time::Now() + timestamp_adjustment;
-  stream_->ReportInfoCardViewed(kForYouStream, kTestInfoCardType1,
+  stream_->ReportInfoCardViewed(StreamType(StreamKind::kForYou),
+                                kTestInfoCardType1,
                                 kMinimumViewIntervalSeconds);
-  stream_->ReportInfoCardClicked(kForYouStream, kTestInfoCardType1);
-  stream_->ReportInfoCardDismissedExplicitly(kForYouStream, kTestInfoCardType1);
+  stream_->ReportInfoCardClicked(StreamType(StreamKind::kForYou),
+                                 kTestInfoCardType1);
+  stream_->ReportInfoCardDismissedExplicitly(StreamType(StreamKind::kForYou),
+                                             kTestInfoCardType1);
   histograms.ExpectBucketCount("ContentSuggestions.Feed.InfoCard.Started",
                                kTestInfoCardType1, 0);
   histograms.ExpectBucketCount("ContentSuggestions.Feed.InfoCard.Viewed",
@@ -3175,7 +3205,7 @@
   // sent in the initial page load when stream model is not loaded yet.
   response_translator_.InjectResponse(MakeTypicalRefreshModelState());
   CreateStream();
-  stream_->ManualRefresh(kForYouStream, base::DoNothing());
+  stream_->ManualRefresh(StreamType(StreamKind::kForYou), base::DoNothing());
   WaitForIdleTaskQueue();
 
   // Verify the info card tracking states. There should be 2 states with
@@ -3339,13 +3369,14 @@
 
   // Simulate content being viewed. This shouldn't schedule a refresh itself,
   // but it's required in order for scrolling to schedule a refresh.
-  stream_->ReportFeedViewed(kForYouStream, surface.GetSurfaceId());
+  stream_->ReportFeedViewed(StreamType(StreamKind::kForYou),
+                            surface.GetSurfaceId());
   EXPECT_EQ(base::Seconds(0),
             refresh_scheduler_
                 .scheduled_run_times[RefreshTaskId::kRefreshForYouFeed]);
 
   // Scrolling should cause a refresh to be scheduled.
-  stream_->ReportStreamScrolled(kForYouStream, 1);
+  stream_->ReportStreamScrolled(StreamType(StreamKind::kForYou), 1);
   EXPECT_EQ(base::Minutes(30),
             refresh_scheduler_
                 .scheduled_run_times[RefreshTaskId::kRefreshForYouFeed]);
@@ -3353,7 +3384,7 @@
   refresh_scheduler_.Clear();
 
   // Scrolling shouldn't schedule a refresh for the next few minutes.
-  stream_->ReportStreamScrolled(kForYouStream, 1);
+  stream_->ReportStreamScrolled(StreamType(StreamKind::kForYou), 1);
   // Scheduler shouldn't have been called yet.
   EXPECT_EQ(base::Seconds(0),
             refresh_scheduler_
@@ -3361,7 +3392,7 @@
 
   refresh_scheduler_.Clear();
   task_environment_.FastForwardBy(base::Minutes(5) + base::Seconds(1));
-  stream_->ReportStreamScrolled(kForYouStream, 1);
+  stream_->ReportStreamScrolled(StreamType(StreamKind::kForYou), 1);
   EXPECT_EQ(base::Minutes(30),
             refresh_scheduler_
                 .scheduled_run_times[RefreshTaskId::kRefreshForYouFeed]);
@@ -3378,7 +3409,8 @@
   WaitForIdleTaskQueue();
 
   // Opening should cause a refresh to be scheduled.
-  stream_->ReportOpenAction(GURL("http://example.com"), kForYouStream, "",
+  stream_->ReportOpenAction(GURL("http://example.com"),
+                            StreamType(StreamKind::kForYou), "",
                             OpenActionType::kDefault);
   EXPECT_EQ(base::Minutes(30),
             refresh_scheduler_
@@ -3396,7 +3428,8 @@
   WaitForIdleTaskQueue();
 
   // Should cause a refresh to be scheduled.
-  stream_->ReportOpenAction(GURL("http://example.com"), kForYouStream, "",
+  stream_->ReportOpenAction(GURL("http://example.com"),
+                            StreamType(StreamKind::kForYou), "",
                             OpenActionType::kNewTab);
   EXPECT_EQ(base::Minutes(30),
             refresh_scheduler_
@@ -3415,18 +3448,19 @@
 
   // Simulate content being viewed. This shouldn't schedule a refresh itself,
   // but it's required in order for later interaction to schedule a refresh.
-  stream_->ReportFeedViewed(kForYouStream, surface.GetSurfaceId());
+  stream_->ReportFeedViewed(StreamType(StreamKind::kForYou),
+                            surface.GetSurfaceId());
   EXPECT_EQ(base::Seconds(0),
             refresh_scheduler_
                 .scheduled_run_times[RefreshTaskId::kRefreshForYouFeed]);
 
   // Should cause a refresh to be scheduled.
-  stream_->ReportStreamScrolled(kForYouStream, 1);
+  stream_->ReportStreamScrolled(StreamType(StreamKind::kForYou), 1);
   refresh_scheduler_.Clear();
   // Manual refresh resets the anti-jank timestamp, so the next
   // ReportStreamScrolled() should update the schedule.
-  stream_->ManualRefresh(kForYouStream, base::DoNothing());
-  stream_->ReportStreamScrolled(kForYouStream, 1);
+  stream_->ManualRefresh(StreamType(StreamKind::kForYou), base::DoNothing());
+  stream_->ReportStreamScrolled(StreamType(StreamKind::kForYou), 1);
   EXPECT_EQ(base::Minutes(30),
             refresh_scheduler_
                 .scheduled_run_times[RefreshTaskId::kRefreshForYouFeed]);
@@ -3441,7 +3475,8 @@
       kFeedCloseRefresh, {{"require_interaction", "false"}});
   TestForYouSurface surface(stream_.get());
   WaitForIdleTaskQueue();
-  stream_->ReportFeedViewed(kForYouStream, surface.GetSurfaceId());
+  stream_->ReportFeedViewed(StreamType(StreamKind::kForYou),
+                            surface.GetSurfaceId());
   // The schedule should have been updated.
   EXPECT_EQ(base::Minutes(30),
             refresh_scheduler_
@@ -3449,7 +3484,8 @@
 
   // Only a surface's first view should cause the schedule to be set.
   refresh_scheduler_.Clear();
-  stream_->ReportFeedViewed(kForYouStream, surface.GetSurfaceId());
+  stream_->ReportFeedViewed(StreamType(StreamKind::kForYou),
+                            surface.GetSurfaceId());
   // Zero means the scheudle wasn't updated.
   EXPECT_EQ(base::Seconds(0),
             refresh_scheduler_
@@ -3461,7 +3497,8 @@
   refresh_scheduler_.Clear();
   TestForYouSurface surface2(stream_.get());
   WaitForIdleTaskQueue();
-  stream_->ReportFeedViewed(kForYouStream, surface2.GetSurfaceId());
+  stream_->ReportFeedViewed(StreamType(StreamKind::kForYou),
+                            surface2.GetSurfaceId());
   // The schedule should have been updated.
   EXPECT_EQ(base::Minutes(30),
             refresh_scheduler_
@@ -3475,7 +3512,8 @@
   WaitForIdleTaskQueue();
   surface.Attach(stream_.get());
   WaitForIdleTaskQueue();
-  stream_->ReportFeedViewed(kForYouStream, surface.GetSurfaceId());
+  stream_->ReportFeedViewed(StreamType(StreamKind::kForYou),
+                            surface.GetSurfaceId());
   // The schedule should have been updated.
   EXPECT_EQ(base::Minutes(30),
             refresh_scheduler_
@@ -3509,10 +3547,11 @@
 
   // Simulate content being viewed. This shouldn't schedule a refresh itself,
   // but it's required in order for later interaction to schedule a refresh.
-  stream_->ReportFeedViewed(kForYouStream, surface.GetSurfaceId());
+  stream_->ReportFeedViewed(StreamType(StreamKind::kForYou),
+                            surface.GetSurfaceId());
 
   // Should cause a refresh to be scheduled.
-  stream_->ReportStreamScrolled(kForYouStream, 1);
+  stream_->ReportStreamScrolled(StreamType(StreamKind::kForYou), 1);
   EXPECT_EQ(base::Minutes(30),
             refresh_scheduler_
                 .scheduled_run_times[RefreshTaskId::kRefreshForYouFeed]);
@@ -3528,7 +3567,8 @@
   TestForYouSurface surface(stream_.get());
   WaitForIdleTaskQueue();
   // Update the schedule.
-  stream_->ReportFeedViewed(kForYouStream, surface.GetSurfaceId());
+  stream_->ReportFeedViewed(StreamType(StreamKind::kForYou),
+                            surface.GetSurfaceId());
   EXPECT_EQ(base::Minutes(30),
             refresh_scheduler_
                 .scheduled_run_times[RefreshTaskId::kRefreshForYouFeed]);
@@ -3582,7 +3622,8 @@
   WaitForIdleTaskQueue();
 
   // Opening should cause a refresh to be scheduled.
-  stream_->ReportOpenAction(GURL("http://example.com"), kForYouStream, "",
+  stream_->ReportOpenAction(GURL("http://example.com"),
+                            StreamType(StreamKind::kForYou), "",
                             OpenActionType::kDefault);
   EXPECT_EQ(base::Minutes(30),
             refresh_scheduler_
@@ -3612,7 +3653,8 @@
 // Keep instantiations at the bottom.
 INSTANTIATE_TEST_SUITE_P(FeedApiTest,
                          FeedStreamTestForAllStreamTypes,
-                         ::testing::Values(kForYouStream, kWebFeedStream),
+                         ::testing::Values(StreamType(StreamKind::kForYou),
+                                           StreamType(StreamKind::kFollowing)),
                          ::testing::PrintToStringParamName());
 INSTANTIATE_TEST_SUITE_P(FeedApiTest,
                          FeedNetworkEndpointTest,
diff --git a/components/feed/core/v2/api_test/feed_api_subscriptions_unittest.cc b/components/feed/core/v2/api_test/feed_api_subscriptions_unittest.cc
index b4c712b8..f8e6392a 100644
--- a/components/feed/core/v2/api_test/feed_api_subscriptions_unittest.cc
+++ b/components/feed/core/v2/api_test/feed_api_subscriptions_unittest.cc
@@ -212,7 +212,8 @@
       PrintToString(callback.RunAndGetResult().web_feed_metadata));
   EXPECT_EQ(1, callback.RunAndGetResult().subscription_count);
   EXPECT_EQ("follow-ct", stream_->GetMetadata().consistency_token());
-  EXPECT_TRUE(feedstore::IsKnownStale(stream_->GetMetadata(), kWebFeedStream));
+  EXPECT_TRUE(feedstore::IsKnownStale(stream_->GetMetadata(),
+                                      StreamType(StreamKind::kFollowing)));
   ASSERT_THAT(
       network_.GetApiRequestSent<FollowWebFeedDiscoverApi>()->page_rss_uris(),
       testing::ElementsAre("http://rss1/", "http://rss2/"));
@@ -504,7 +505,8 @@
   base::HistogramTester histograms;
   network_.InjectFollowResponse(MakeFailedResponse());
   CallbackReceiver<WebFeedSubscriptions::FollowWebFeedResult> callback;
-  EXPECT_FALSE(feedstore::IsKnownStale(stream_->GetMetadata(), kWebFeedStream));
+  EXPECT_FALSE(feedstore::IsKnownStale(stream_->GetMetadata(),
+                                       StreamType(StreamKind::kFollowing)));
 
   subscriptions().FollowWebFeed(MakeWebFeedPageInformation("http://cats.com"),
                                 WebFeedChangeReason::WEB_PAGE_MENU,
@@ -513,7 +515,8 @@
   EXPECT_EQ(WebFeedSubscriptionRequestStatus::kFailedUnknownError,
             callback.RunAndGetResult().request_status);
   EXPECT_EQ("{}", PrintToString(CheckAllSubscriptions()));
-  EXPECT_FALSE(feedstore::IsKnownStale(stream_->GetMetadata(), kWebFeedStream));
+  EXPECT_FALSE(feedstore::IsKnownStale(stream_->GetMetadata(),
+                                       StreamType(StreamKind::kFollowing)));
   histograms.ExpectUniqueSample(
       "ContentSuggestions.Feed.WebFeed.FollowUriResult",
       WebFeedSubscriptionRequestStatus::kFailedUnknownError, 1);
@@ -529,7 +532,7 @@
                                 follow_callback.Bind());
   follow_callback.RunUntilCalled();
   // Un-mark stream as stale, to verify unsubscribe also marks stream as stale.
-  stream_->SetStreamStale(kWebFeedStream, false);
+  stream_->SetStreamStale(StreamType(StreamKind::kFollowing), false);
   CallbackReceiver<WebFeedSubscriptions::UnfollowWebFeedResult>
       unfollow_callback;
   network_.InjectResponse(SuccessfulUnfollowResponse());
@@ -552,7 +555,8 @@
   EXPECT_EQ(0, unfollow_callback.RunAndGetResult().subscription_count);
   EXPECT_EQ("unfollow-ct", stream_->GetMetadata().consistency_token());
   EXPECT_EQ("{}", PrintToString(CheckAllSubscriptions()));
-  EXPECT_TRUE(feedstore::IsKnownStale(stream_->GetMetadata(), kWebFeedStream));
+  EXPECT_TRUE(feedstore::IsKnownStale(stream_->GetMetadata(),
+                                      StreamType(StreamKind::kFollowing)));
   histograms.ExpectUniqueSample(
       "ContentSuggestions.Feed.WebFeed.UnfollowResult",
       WebFeedSubscriptionRequestStatus::kSuccess, 1);
@@ -604,7 +608,7 @@
       unfollow_callback;
   network_.InjectUnfollowResponse(MakeFailedResponse());
   // Un-mark stream as stale, to verify unsubscribe also marks stream as stale.
-  stream_->SetStreamStale(kWebFeedStream, false);
+  stream_->SetStreamStale(StreamType(StreamKind::kFollowing), false);
   subscriptions().UnfollowWebFeed(
       follow_callback.GetResult()->web_feed_metadata.web_feed_id,
       /*is_durable_request=*/false, WebFeedChangeReason::WEB_PAGE_MENU,
@@ -618,7 +622,8 @@
       "{ WebFeedMetadata{ id=id_cats title=Title cats "
       "publisher_url=https://cats.com/ status=kSubscribed } }",
       PrintToString(CheckAllSubscriptions()));
-  EXPECT_FALSE(feedstore::IsKnownStale(stream_->GetMetadata(), kWebFeedStream));
+  EXPECT_FALSE(feedstore::IsKnownStale(stream_->GetMetadata(),
+                                       StreamType(StreamKind::kFollowing)));
 }
 
 TEST_F(FeedApiSubscriptionsTest, UnfollowWhileOffline) {
diff --git a/components/feed/core/v2/api_test/feed_api_test.cc b/components/feed/core/v2/api_test/feed_api_test.cc
index feaa8c2..6cf6b67 100644
--- a/components/feed/core/v2/api_test/feed_api_test.cc
+++ b/components/feed/core/v2/api_test/feed_api_test.cc
@@ -329,9 +329,11 @@
 }
 
 TestForYouSurface::TestForYouSurface(FeedStream* stream)
-    : TestSurfaceBase(kForYouStream, stream) {}
+    : TestSurfaceBase(StreamType(StreamKind::kForYou), stream) {}
 TestWebFeedSurface::TestWebFeedSurface(FeedStream* stream)
-    : TestSurfaceBase(kWebFeedStream, stream) {}
+    : TestSurfaceBase(StreamType(StreamKind::kFollowing), stream) {}
+TestChannelSurface::TestChannelSurface(FeedStream* stream)
+    : TestSurfaceBase(StreamType(StreamKind::kChannel), stream) {}
 
 TestReliabilityLoggingBridge::TestReliabilityLoggingBridge() = default;
 TestReliabilityLoggingBridge::~TestReliabilityLoggingBridge() = default;
diff --git a/components/feed/core/v2/api_test/feed_api_test.h b/components/feed/core/v2/api_test/feed_api_test.h
index f19bb543..f078057 100644
--- a/components/feed/core/v2/api_test/feed_api_test.h
+++ b/components/feed/core/v2/api_test/feed_api_test.h
@@ -179,6 +179,10 @@
  public:
   explicit TestWebFeedSurface(FeedStream* stream = nullptr);
 };
+class TestChannelSurface : public TestSurfaceBase {
+ public:
+  explicit TestChannelSurface(FeedStream* stream = nullptr);
+};
 
 class TestImageFetcher : public ImageFetcher {
  public:
diff --git a/components/feed/core/v2/feed_store.cc b/components/feed/core/v2/feed_store.cc
index d0e5f84..4f93999 100644
--- a/components/feed/core/v2/feed_store.cc
+++ b/components/feed/core/v2/feed_store.cc
@@ -59,7 +59,7 @@
   return base::StrCat({"S/", stream_id});
 }
 std::string StreamDataKey(const StreamType& stream_type) {
-  return StreamDataKey(feedstore::StreamId(stream_type));
+  return StreamDataKey(feedstore::StreamKey(stream_type));
 }
 std::string ContentKey(const base::StringPiece stream_type,
                        const feedwire::ContentId& content_id) {
@@ -68,7 +68,7 @@
 }
 std::string ContentKey(const StreamType& stream_type,
                        const feedwire::ContentId& content_id) {
-  return ContentKey(feedstore::StreamId(stream_type), content_id);
+  return ContentKey(feedstore::StreamKey(stream_type), content_id);
 }
 std::string SharedStateKey(const base::StringPiece stream_type,
                            const feedwire::ContentId& content_id) {
@@ -77,7 +77,7 @@
 }
 std::string SharedStateKey(const StreamType& stream_type,
                            const feedwire::ContentId& content_id) {
-  return SharedStateKey(feedstore::StreamId(stream_type), content_id);
+  return SharedStateKey(feedstore::StreamKey(stream_type), content_id);
 }
 std::string LocalActionKey(int64_t id) {
   return kLocalActionPrefix + base::NumberToString(id);
@@ -98,7 +98,7 @@
 class StreamKeyMatcher {
  public:
   explicit StreamKeyMatcher(const StreamType& stream_type) {
-    stream_id_ = std::string(feedstore::StreamId(stream_type));
+    stream_id_ = std::string(feedstore::StreamKey(stream_type));
     stream_id_plus_slash_ = stream_id_ + '/';
   }
 
@@ -131,7 +131,7 @@
   switch (record.data_case()) {
     case feedstore::Record::kStreamData: {
       const std::string stream_id = record.stream_data().stream_id();
-      return stream_id.empty() ? StreamDataKey(kForYouStream)
+      return stream_id.empty() ? StreamDataKey(StreamType(StreamKind::kForYou))
                                : StreamDataKey(stream_id);
     }
     case feedstore::Record::kStreamStructures:
@@ -245,7 +245,7 @@
     int32_t structure_set_sequence_number,
     const StreamType& stream_type,
     std::unique_ptr<StreamModelUpdateRequest> update_request) {
-  base::StringPiece stream_id = feedstore::StreamId(stream_type);
+  std::string stream_id = feedstore::StreamKey(stream_type);
   auto updates = std::make_unique<
       std::vector<std::pair<std::string, feedstore::Record>>>();
   update_request->stream_data.set_stream_id(std::string(stream_id));
@@ -256,11 +256,11 @@
   }
   for (feedstore::StreamSharedState& shared_state :
        update_request->shared_states) {
-    shared_state.set_stream_id(std::string(stream_id));
+    shared_state.set_stream_id(stream_id);
     updates->push_back(MakeKeyAndRecord(std::move(shared_state)));
   }
   feedstore::StreamStructureSet stream_structure_set;
-  stream_structure_set.set_stream_id(std::string(stream_id));
+  stream_structure_set.set_stream_id(stream_id);
   stream_structure_set.set_sequence_number(structure_set_sequence_number);
   for (feedstore::StreamStructure& structure :
        update_request->stream_structures) {
@@ -391,7 +391,7 @@
   database_->LoadEntriesWithFilter(
       base::BindRepeating(
           filter, StreamDataKey(stream_type),
-          base::StrCat({"T/", feedstore::StreamId(stream_type), "/"})),
+          base::StrCat({"T/", feedstore::StreamKey(stream_type), "/"})),
       CreateReadOptions(),
       /*target_prefix=*/"",
       base::BindOnce(&FeedStore::OnLoadStreamFinished, GetWeakPtr(),
@@ -413,12 +413,12 @@
         case feedstore::Record::kStreamData:
           result.stream_data = std::move(*record.mutable_stream_data());
           DLOG_IF(ERROR, result.stream_data.stream_id() !=
-                             feedstore::StreamId(stream_type))
+                             feedstore::StreamKey(stream_type))
               << "Read a record with the wrong stream_id";
           break;
         case feedstore::Record::kStreamStructures:
           DLOG_IF(ERROR, record.stream_structures().stream_id() !=
-                             feedstore::StreamId(stream_type))
+                             feedstore::StreamKey(stream_type))
               << "Read a record with the wrong stream_id";
           result.stream_structures.push_back(
               std::move(*record.mutable_stream_structures()));
@@ -504,7 +504,7 @@
     const StreamType& stream_type,
     int32_t sequence_number,
     std::vector<feedstore::DataOperation> operations) {
-  base::StringPiece stream_id = feedstore::StreamId(stream_type);
+  std::string stream_id = feedstore::StreamKey(stream_type);
   std::vector<feedstore::Record> records;
   feedstore::Record structures_record;
   feedstore::StreamStructureSet& structure_set =
@@ -518,7 +518,7 @@
       records.push_back(std::move(record));
     }
   }
-  structure_set.set_stream_id(std::string(feedstore::StreamId(stream_type)));
+  structure_set.set_stream_id(std::string(feedstore::StreamKey(stream_type)));
   structure_set.set_sequence_number(sequence_number);
 
   records.push_back(std::move(structures_record));
@@ -710,8 +710,8 @@
 
 void FeedStore::ReadStartupData(
     base::OnceCallback<void(StartupData)> callback) {
-  ReadMany({StreamDataKey(kWebFeedStream), StreamDataKey(kForYouStream),
-            kMetadataKey},
+  ReadMany({StreamDataKey(StreamType(StreamKind::kFollowing)),
+            StreamDataKey(StreamType(StreamKind::kForYou)), kMetadataKey},
            base::BindOnce(&FeedStore::OnReadStartupDataFinished, GetWeakPtr(),
                           std::move(callback)));
 }
diff --git a/components/feed/core/v2/feed_store_unittest.cc b/components/feed/core/v2/feed_store_unittest.cc
index f785e31..8d2c440 100644
--- a/components/feed/core/v2/feed_store_unittest.cc
+++ b/components/feed/core/v2/feed_store_unittest.cc
@@ -127,8 +127,8 @@
   CallbackReceiver<bool> receiver;
   // TODO(harringtond): find a long term fix for assumptions about
   // kTestTimeEpoch value.
-  store_->OverwriteStream(kForYouStream, MakeTypicalInitialModelState(),
-                          receiver.Bind());
+  store_->OverwriteStream(StreamType(StreamKind::kForYou),
+                          MakeTypicalInitialModelState(), receiver.Bind());
   fake_db_->UpdateCallback(true);
 
   ASSERT_TRUE(receiver.GetResult());
@@ -251,8 +251,8 @@
   CallbackReceiver<bool> receiver;
   // TODO(harringtond): find a long term fix for assumptions about
   // kTestTimeEpoch value.
-  store_->OverwriteStream(kWebFeedStream, MakeTypicalInitialModelState(),
-                          receiver.Bind());
+  store_->OverwriteStream(StreamType(StreamKind::kFollowing),
+                          MakeTypicalInitialModelState(), receiver.Bind());
   fake_db_->UpdateCallback(true);
 
   ASSERT_TRUE(receiver.GetResult());
@@ -389,8 +389,8 @@
   db_entries_["m"].mutable_local_action()->set_id(6);
 
   CallbackReceiver<bool> receiver;
-  store_->OverwriteStream(kForYouStream, MakeTypicalInitialModelState(),
-                          receiver.Bind());
+  store_->OverwriteStream(StreamType(StreamKind::kForYou),
+                          MakeTypicalInitialModelState(), receiver.Bind());
   fake_db_->UpdateCallback(true);
 
   ASSERT_TRUE(receiver.GetResult());
@@ -403,12 +403,12 @@
 
 TEST_F(FeedStoreTest, LoadStreamSuccess) {
   MakeFeedStore({});
-  store_->OverwriteStream(kForYouStream, MakeTypicalInitialModelState(),
-                          base::DoNothing());
+  store_->OverwriteStream(StreamType(StreamKind::kForYou),
+                          MakeTypicalInitialModelState(), base::DoNothing());
   fake_db_->UpdateCallback(true);
 
   CallbackReceiver<LoadStreamResult> receiver;
-  store_->LoadStream(kForYouStream, receiver.Bind());
+  store_->LoadStream(StreamType(StreamKind::kForYou), receiver.Bind());
   fake_db_->LoadCallback(true);
 
   ASSERT_TRUE(receiver.GetResult());
@@ -419,12 +419,12 @@
 
 TEST_F(FeedStoreTest, LoadStreamFail) {
   MakeFeedStore({});
-  store_->OverwriteStream(kForYouStream, MakeTypicalInitialModelState(),
-                          base::DoNothing());
+  store_->OverwriteStream(StreamType(StreamKind::kForYou),
+                          MakeTypicalInitialModelState(), base::DoNothing());
   fake_db_->UpdateCallback(true);
 
   CallbackReceiver<LoadStreamResult> receiver;
-  store_->LoadStream(kForYouStream, receiver.Bind());
+  store_->LoadStream(StreamType(StreamKind::kForYou), receiver.Bind());
   fake_db_->LoadCallback(false);
 
   ASSERT_TRUE(receiver.GetResult());
@@ -435,7 +435,7 @@
   MakeFeedStore({});
 
   CallbackReceiver<LoadStreamResult> receiver;
-  store_->LoadStream(kForYouStream, receiver.Bind());
+  store_->LoadStream(StreamType(StreamKind::kForYou), receiver.Bind());
   fake_db_->LoadCallback(true);
 
   ASSERT_TRUE(receiver.GetResult());
@@ -444,12 +444,12 @@
 
 TEST_F(FeedStoreTest, LoadStreamIgnoresADifferentStreamType) {
   MakeFeedStore({});
-  store_->OverwriteStream(kForYouStream, MakeTypicalInitialModelState(),
-                          base::DoNothing());
+  store_->OverwriteStream(StreamType(StreamKind::kForYou),
+                          MakeTypicalInitialModelState(), base::DoNothing());
   fake_db_->UpdateCallback(true);
 
   CallbackReceiver<LoadStreamResult> receiver;
-  store_->LoadStream(kWebFeedStream, receiver.Bind());
+  store_->LoadStream(StreamType(StreamKind::kFollowing), receiver.Bind());
   fake_db_->LoadCallback(true);
 
   ASSERT_TRUE(receiver.GetResult());
@@ -460,7 +460,8 @@
 TEST_F(FeedStoreTest, WriteOperations) {
   MakeFeedStore({});
   CallbackReceiver<LoadStreamResult> receiver;
-  store_->WriteOperations(kForYouStream, /*sequence_number=*/5,
+  store_->WriteOperations(StreamType(StreamKind::kForYou),
+                          /*sequence_number=*/5,
                           {MakeOperation(MakeCluster(2, MakeRootId())),
                            MakeOperation(MakeCluster(6, MakeRootId()))});
   fake_db_->UpdateCallback(true);
@@ -505,8 +506,9 @@
                    std::vector<feedstore::StreamSharedState>>
       cr;
 
-  store_->ReadContent(kForYouStream, {MakeContentContentId(0)},
-                      {MakeSharedStateContentId(0)}, cr.Bind());
+  store_->ReadContent(StreamType(StreamKind::kForYou),
+                      {MakeContentContentId(0)}, {MakeSharedStateContentId(0)},
+                      cr.Bind());
   fake_db_->LoadCallback(true);
 
   ASSERT_NE(cr.GetResult<0>(), absl::nullopt);
@@ -540,7 +542,8 @@
       cr;
 
   // Successful read
-  store_->ReadContent(kForYouStream, content_ids, shared_state_ids, cr.Bind());
+  store_->ReadContent(StreamType(StreamKind::kForYou), content_ids,
+                      shared_state_ids, cr.Bind());
   fake_db_->LoadCallback(true);
 
   ASSERT_NE(cr.GetResult<0>(), absl::nullopt);
@@ -560,7 +563,8 @@
 
   // Failed read
   cr.Clear();
-  store_->ReadContent(kForYouStream, content_ids, shared_state_ids, cr.Bind());
+  store_->ReadContent(StreamType(StreamKind::kForYou), content_ids,
+                      shared_state_ids, cr.Bind());
   fake_db_->LoadCallback(false);
 
   ASSERT_NE(cr.GetResult<0>(), absl::nullopt);
@@ -638,8 +642,8 @@
 TEST_F(FeedStoreTest, ClearAllSuccess) {
   // Write at least one record of each type.
   MakeFeedStore({});
-  store_->OverwriteStream(kForYouStream, MakeTypicalInitialModelState(),
-                          base::DoNothing());
+  store_->OverwriteStream(StreamType(StreamKind::kForYou),
+                          MakeTypicalInitialModelState(), base::DoNothing());
   fake_db_->UpdateCallback(true);
   store_->WriteActions({MakeAction(0)}, base::DoNothing());
   fake_db_->UpdateCallback(true);
diff --git a/components/feed/core/v2/feed_stream.cc b/components/feed/core/v2/feed_stream.cc
index c523ff2..11698ece 100644
--- a/components/feed/core/v2/feed_stream.cc
+++ b/components/feed/core/v2/feed_stream.cc
@@ -248,7 +248,7 @@
   for (const feedstore::StreamData& stream_data :
        result.startup_data.stream_data) {
     StreamType stream_type =
-        feedstore::StreamTypeFromId(stream_data.stream_id());
+        feedstore::StreamTypeFromKey(stream_data.stream_id());
     if (stream_type.IsValid()) {
       GetStream(stream_type).content_ids =
           feedstore::GetContentIds(stream_data);
@@ -264,7 +264,7 @@
   for (const feedstore::StreamData& stream_data :
        result.startup_data.stream_data) {
     StreamType stream_type =
-        feedstore::StreamTypeFromId(stream_data.stream_id());
+        feedstore::StreamTypeFromKey(stream_data.stream_id());
     if (stream_type.IsValid())
       MaybeNotifyHasUnreadContent(stream_type);
   }
@@ -328,10 +328,11 @@
       // Checking for users without follows.
       // TODO(b/229143375) - We should rate limit fetches if the server side is
       // turned off for this locale, and continually fails.
-      if (!HasUnreadContent(kWebFeedStream)) {
+      StreamType following_type = StreamType(StreamKind::kFollowing);
+      if (!HasUnreadContent(following_type)) {
         LoadStreamTask::Options options;
         options.load_type = LoadType::kBackgroundRefresh;
-        options.stream_type = kWebFeedStream;
+        options.stream_type = following_type;
         options.abort_if_unread_content = true;
         task_queue_.AddTask(
             FROM_HERE,
@@ -682,12 +683,8 @@
 }
 
 void FeedStream::InvalidateContentCacheFor(StreamKind stream_kind) {
-  if (StreamKind::kForYou == stream_kind) {
-    SetStreamStale(kForYouStream, true);
-  }
-  if (StreamKind::kFollowing == stream_kind) {
-    SetStreamStale(kWebFeedStream, true);
-  }
+  if (stream_kind != StreamKind::kUnknown)
+    SetStreamStale(StreamType(stream_kind), true);
 }
 
 DebugStreamData FeedStream::GetDebugStreamData() {
@@ -723,7 +720,7 @@
 }
 
 std::string FeedStream::DumpStateForDebugging() {
-  Stream& stream = GetStream(kForYouStream);
+  Stream& stream = GetStream(StreamType(StreamKind::kForYou));
   std::stringstream ss;
   if (stream.model) {
     ss << "model loaded, " << stream.model->GetContentList().size()
@@ -960,6 +957,7 @@
 RequestMetadata FeedStream::GetRequestMetadata(const StreamType& stream_type,
                                                bool is_for_next_page) const {
   const Stream* stream = FindStream(stream_type);
+  // TODO(crbug.com/1370127) handle null channel streams
   DCHECK(stream);
   RequestMetadata result;
   if (is_for_next_page) {
@@ -1006,8 +1004,8 @@
   // In the interim, only send signed-out FeedQuery requests.
   signed_out_for_you_refreshes_until_ =
       base::TimeTicks::Now() + kSuppressRefreshDuration;
-  // We don't really need to delete kWebFeedStream data here, but clearing all
-  // data because it's easy.
+  // We don't really need to delete StreamType(StreamKind::kFollowing) data
+  // here, but clearing all data because it's easy.
   ClearAll();
 }
 
@@ -1138,8 +1136,8 @@
 }
 
 void FeedStream::ClearAll() {
-  metrics_reporter_->OnClearAll(base::Time::Now() -
-                                GetLastFetchTime(kForYouStream));
+  metrics_reporter_->OnClearAll(
+      base::Time::Now() - GetLastFetchTime(StreamType(StreamKind::kForYou)));
   clear_all_in_progress_ = true;
   task_queue_.AddTask(FROM_HERE, std::make_unique<ClearAllTask>(this));
 }
diff --git a/components/feed/core/v2/feedstore_util.cc b/components/feed/core/v2/feedstore_util.cc
index d657a55..59acdf7d 100644
--- a/components/feed/core/v2/feedstore_util.cc
+++ b/components/feed/core/v2/feedstore_util.cc
@@ -16,22 +16,25 @@
 using feed::LocalActionId;
 using feed::StreamType;
 
-base::StringPiece StreamId(const StreamType& stream_type) {
+std::string StreamKey(const StreamType& stream_type) {
   if (stream_type.IsForYou())
-    return kForYouStreamId;
+    return kForYouStreamKey;
   if (stream_type.IsWebFeed())
-    return kFollowStreamId;
+    return kFollowStreamKey;
   DCHECK(stream_type.IsChannelFeed());
-  return kChannelStreamId;
+  std::string encoding;
+  base::Base64Encode(stream_type.GetWebFeedId(), &encoding);
+  return encoding;
 }
 
-StreamType StreamTypeFromId(base::StringPiece id) {
-  if (id == kForYouStreamId)
-    return feed::kForYouStream;
-  if (id == kFollowStreamId)
-    return feed::kWebFeedStream;
-  if (id == kChannelStreamId)
-    return feed::kChannelStream;
+StreamType StreamTypeFromKey(std::string key) {
+  if (key == kForYouStreamKey)
+    return StreamType(feed::StreamKind::kForYou);
+  if (key == kFollowStreamKey)
+    return StreamType(feed::StreamKind::kFollowing);
+  std::string channel_key;
+  if (base::Base64Decode(key, &channel_key))
+    return StreamType(feed::StreamKind::kChannel, channel_key);
   return {};
 }
 
@@ -116,9 +119,9 @@
 const Metadata::StreamMetadata* FindMetadataForStream(
     const Metadata& metadata,
     const StreamType& stream_type) {
-  base::StringPiece id = StreamId(stream_type);
+  std::string key = StreamKey(stream_type);
   for (const auto& sm : metadata.stream_metadata()) {
-    if (sm.stream_id() == id)
+    if (sm.stream_key() == key)
       return &sm;
   }
   return nullptr;
@@ -131,7 +134,7 @@
   if (existing)
     return *const_cast<Metadata::StreamMetadata*>(existing);
   Metadata::StreamMetadata* sm = metadata.add_stream_metadata();
-  sm->set_stream_id(std::string(StreamId(stream_type)));
+  sm->set_stream_key(std::string(StreamKey(stream_type)));
   return *sm;
 }
 
diff --git a/components/feed/core/v2/feedstore_util.h b/components/feed/core/v2/feedstore_util.h
index a2ae422..7c61b4c 100644
--- a/components/feed/core/v2/feedstore_util.h
+++ b/components/feed/core/v2/feedstore_util.h
@@ -20,12 +20,11 @@
 namespace feedstore {
 class Metadata;
 
-constexpr base::StringPiece kForYouStreamId{"i"};
-constexpr base::StringPiece kFollowStreamId{"w"};
-constexpr base::StringPiece kChannelStreamId{"c"};
+const char kForYouStreamKey[] = "i";
+const char kFollowStreamKey[] = "w";
 
-base::StringPiece StreamId(const feed::StreamType& stream_type);
-feed::StreamType StreamTypeFromId(base::StringPiece id);
+std::string StreamKey(const feed::StreamType& stream_type);
+feed::StreamType StreamTypeFromKey(std::string key);
 
 ///////////////////////////////////////////////////
 // Functions that operate on feedstore proto types.
diff --git a/components/feed/core/v2/feedstore_util_unittest.cc b/components/feed/core/v2/feedstore_util_unittest.cc
index 96fc6cef..35707055 100644
--- a/components/feed/core/v2/feedstore_util_unittest.cc
+++ b/components/feed/core/v2/feedstore_util_unittest.cc
@@ -5,6 +5,7 @@
 #include "components/feed/core/v2/feedstore_util.h"
 
 #include <string>
+#include "base/test/gtest_util.h"
 #include "base/test/task_environment.h"
 #include "components/feed/core/v2/config.h"
 #include "components/feed/core/v2/test/test_util.h"
@@ -67,5 +68,27 @@
   EXPECT_EQ(feed::LocalActionId(2), GetNextActionId(metadata));
 }
 
+using feed::StreamKind;
+using feed::StreamType;
+TEST(feedstore_util_test, StreamTypeFromKey) {
+  StreamType for_you = StreamType(StreamKind::kForYou);
+  StreamType following = StreamType(StreamKind::kFollowing);
+  StreamType channel = StreamType(StreamKind::kChannel);
+  StreamType channel_a = StreamType(StreamKind::kChannel, "A");
+  StreamType unknown = StreamType();
+
+  EXPECT_EQ(StreamKey(for_you), kForYouStreamKey);
+  EXPECT_EQ(StreamKey(following), kFollowStreamKey);
+  EXPECT_DCHECK_DEATH(StreamKey(unknown));
+
+  EXPECT_TRUE(StreamTypeFromKey(StreamKey(channel)).IsChannelFeed());
+  EXPECT_TRUE(StreamTypeFromKey(StreamKey(channel_a)).IsChannelFeed());
+
+  EXPECT_EQ(StreamTypeFromKey(StreamKey(channel_a)).GetWebFeedId(), "A");
+
+  EXPECT_TRUE(StreamTypeFromKey(StreamKey(following)).IsWebFeed());
+  EXPECT_TRUE(StreamTypeFromKey(StreamKey(for_you)).IsForYou());
+}
+
 }  // namespace
 }  // namespace feedstore
diff --git a/components/feed/core/v2/metrics_reporter.cc b/components/feed/core/v2/metrics_reporter.cc
index df8f810..d631d62 100644
--- a/components/feed/core/v2/metrics_reporter.cc
+++ b/components/feed/core/v2/metrics_reporter.cc
@@ -35,7 +35,9 @@
 
 namespace feed {
 namespace {
-const StreamType kStreamTypes[] = {kForYouStream, kWebFeedStream};
+StreamKind kStreamKinds[] = {StreamKind::kForYou, StreamKind::kFollowing,
+                             StreamKind::kChannel};
+// TODO(crbug.com/1369777) Add kChannel streams to metrics reporting below
 using feed::FeedEngagementType;
 using feed::FeedUserActionType;
 const int kMaxSuggestionsTotal = 50;
@@ -322,8 +324,8 @@
 
 void MetricsReporter::FinalizeVisit() {
   bool has_engagement = false;
-  for (const StreamType& stream_type : kStreamTypes) {
-    StreamStats& data = ForStream(stream_type);
+  for (const StreamKind& stream_type : kStreamKinds) {
+    StreamStats& data = ForStream(StreamType(stream_type));
     if (!data.engaged_simple_reported)
       continue;
     has_engagement = true;
@@ -948,7 +950,9 @@
     const StreamType& stream_type) {
   if (stream_type.IsForYou())
     return for_you_stats_;
-  DCHECK(stream_type.IsWebFeed());
+  if (stream_type.IsWebFeed())
+    return web_feed_stats_;
+  DCHECK(stream_type.IsChannelFeed());
   return web_feed_stats_;
 }
 
diff --git a/components/feed/core/v2/metrics_reporter_unittest.cc b/components/feed/core/v2/metrics_reporter_unittest.cc
index a8c0747..a82a9cbb 100644
--- a/components/feed/core/v2/metrics_reporter_unittest.cc
+++ b/components/feed/core/v2/metrics_reporter_unittest.cc
@@ -27,7 +27,7 @@
 namespace feed {
 // Using the "unspecified" stream type to represent the combined streams when
 // checking engagement metrics.
-constexpr StreamType kCombinedStreams = StreamType();
+StreamType kCombinedStreams = StreamType();
 
 constexpr SurfaceId kSurfaceId = SurfaceId(5);
 const base::TimeDelta kEpsilon = base::Milliseconds(1);
@@ -99,9 +99,9 @@
 };
 
 TEST_F(MetricsReporterTest, SliceViewedReportsSuggestionShown) {
-  reporter_->ContentSliceViewed(kForYouStream, 5, 7);
+  reporter_->ContentSliceViewed(StreamType(StreamKind::kForYou), 5, 7);
   histogram_.ExpectUniqueSample("NewTabPage.ContentSuggestions.Shown", 5, 1);
-  reporter_->ContentSliceViewed(kWebFeedStream, 5, 7);
+  reporter_->ContentSliceViewed(StreamType(StreamKind::kFollowing), 5, 7);
   histogram_.ExpectUniqueSample("ContentSuggestions.Feed.WebFeed.Shown", 5, 1);
   histogram_.ExpectTotalCount("ContentSuggestions.Feed.ReachedEndOfFeed", 0);
   histogram_.ExpectTotalCount(
@@ -109,25 +109,25 @@
 }
 
 TEST_F(MetricsReporterTest, LastSliceViewedReportsReachedEndOfFeed) {
-  reporter_->ContentSliceViewed(kForYouStream, 5, 6);
+  reporter_->ContentSliceViewed(StreamType(StreamKind::kForYou), 5, 6);
   histogram_.ExpectUniqueSample("ContentSuggestions.Feed.ReachedEndOfFeed", 6,
                                 1);
 }
 
 TEST_F(MetricsReporterTest, WebFeed_LastSliceViewedReportsReachedEndOfFeed) {
-  reporter_->ContentSliceViewed(kWebFeedStream, 5, 6);
+  reporter_->ContentSliceViewed(StreamType(StreamKind::kFollowing), 5, 6);
   histogram_.ExpectUniqueSample(
       "ContentSuggestions.Feed.WebFeed.ReachedEndOfFeed", 6, 1);
 }
 
 TEST_F(MetricsReporterTest, ScrollingSmall) {
-  reporter_->StreamScrolled(kForYouStream, 100);
+  reporter_->StreamScrolled(StreamType(StreamKind::kForYou), 100);
 
   std::map<FeedEngagementType, int> want({
       {FeedEngagementType::kFeedScrolled, 1},
       {FeedEngagementType::kFeedEngagedSimple, 1},
   });
-  EXPECT_EQ(want, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want, ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want, ReportedEngagementType(kCombinedStreams));
   histogram_.ExpectTotalCount("ContentSuggestions.Feed.FollowCount.Engaged2",
                               0);
@@ -140,14 +140,14 @@
 }
 
 TEST_F(MetricsReporterTest, ScrollingCanTriggerEngaged) {
-  reporter_->StreamScrolled(kForYouStream, 161);
+  reporter_->StreamScrolled(StreamType(StreamKind::kForYou), 161);
 
   std::map<FeedEngagementType, int> want({
       {FeedEngagementType::kFeedScrolled, 1},
       {FeedEngagementType::kFeedEngaged, 1},
       {FeedEngagementType::kFeedEngagedSimple, 1},
   });
-  EXPECT_EQ(want, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want, ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want, ReportedEngagementType(kCombinedStreams));
   histogram_.ExpectUniqueSample("ContentSuggestions.Feed.FollowCount.Engaged2",
                                 kSubscriptionCount, 1);
@@ -162,19 +162,20 @@
 }
 
 TEST_F(MetricsReporterTest, OpeningContentIsInteracting) {
-  reporter_->OpenAction(kForYouStream, 5, OpenActionType::kDefault);
+  reporter_->OpenAction(StreamType(StreamKind::kForYou), 5,
+                        OpenActionType::kDefault);
 
   std::map<FeedEngagementType, int> want({
       {FeedEngagementType::kFeedEngaged, 1},
       {FeedEngagementType::kFeedInteracted, 1},
       {FeedEngagementType::kFeedEngagedSimple, 1},
   });
-  EXPECT_EQ(want, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want, ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want, ReportedEngagementType(kCombinedStreams));
 }
 
 TEST_F(MetricsReporterTest, RemovingContentIsInteracting) {
-  reporter_->OtherUserAction(kForYouStream,
+  reporter_->OtherUserAction(StreamType(StreamKind::kForYou),
                              FeedUserActionType::kTappedHideStory);
 
   std::map<FeedEngagementType, int> want({
@@ -182,12 +183,12 @@
       {FeedEngagementType::kFeedInteracted, 1},
       {FeedEngagementType::kFeedEngagedSimple, 1},
   });
-  EXPECT_EQ(want, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want, ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want, ReportedEngagementType(kCombinedStreams));
 }
 
 TEST_F(MetricsReporterTest, NotInterestedInIsInteracting) {
-  reporter_->OtherUserAction(kForYouStream,
+  reporter_->OtherUserAction(StreamType(StreamKind::kForYou),
                              FeedUserActionType::kTappedNotInterestedIn);
 
   std::map<FeedEngagementType, int> want({
@@ -195,12 +196,12 @@
       {FeedEngagementType::kFeedInteracted, 1},
       {FeedEngagementType::kFeedEngagedSimple, 1},
   });
-  EXPECT_EQ(want, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want, ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want, ReportedEngagementType(kCombinedStreams));
 }
 
 TEST_F(MetricsReporterTest, ManageInterestsInIsInteracting) {
-  reporter_->OtherUserAction(kForYouStream,
+  reporter_->OtherUserAction(StreamType(StreamKind::kForYou),
                              FeedUserActionType::kTappedManageInterests);
 
   std::map<FeedEngagementType, int> want({
@@ -208,16 +209,17 @@
       {FeedEngagementType::kFeedInteracted, 1},
       {FeedEngagementType::kFeedEngagedSimple, 1},
   });
-  EXPECT_EQ(want, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want, ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want, ReportedEngagementType(kCombinedStreams));
 }
 
 TEST_F(MetricsReporterTest, VisitsCanLastMoreThanFiveMinutes) {
-  reporter_->StreamScrolled(kForYouStream, 1);
+  reporter_->StreamScrolled(StreamType(StreamKind::kForYou), 1);
   task_environment_.FastForwardBy(base::Minutes(5) - kEpsilon);
-  reporter_->OpenAction(kForYouStream, 0, OpenActionType::kDefault);
+  reporter_->OpenAction(StreamType(StreamKind::kForYou), 0,
+                        OpenActionType::kDefault);
   task_environment_.FastForwardBy(base::Minutes(5) - kEpsilon);
-  reporter_->StreamScrolled(kForYouStream, 1);
+  reporter_->StreamScrolled(StreamType(StreamKind::kForYou), 1);
 
   std::map<FeedEngagementType, int> want({
       {FeedEngagementType::kFeedEngaged, 1},
@@ -225,16 +227,18 @@
       {FeedEngagementType::kFeedScrolled, 1},
       {FeedEngagementType::kFeedEngagedSimple, 1},
   });
-  EXPECT_EQ(want, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want, ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want, ReportedEngagementType(kCombinedStreams));
 }
 
 TEST_F(MetricsReporterTest, NewVisitAfterInactivity) {
-  reporter_->OpenAction(kForYouStream, 0, OpenActionType::kDefault);
-  reporter_->StreamScrolled(kForYouStream, 1);
+  reporter_->OpenAction(StreamType(StreamKind::kForYou), 0,
+                        OpenActionType::kDefault);
+  reporter_->StreamScrolled(StreamType(StreamKind::kForYou), 1);
   task_environment_.FastForwardBy(base::Minutes(5) + kEpsilon);
-  reporter_->OpenAction(kForYouStream, 0, OpenActionType::kDefault);
-  reporter_->StreamScrolled(kForYouStream, 1);
+  reporter_->OpenAction(StreamType(StreamKind::kForYou), 0,
+                        OpenActionType::kDefault);
+  reporter_->StreamScrolled(StreamType(StreamKind::kForYou), 1);
 
   std::map<FeedEngagementType, int> want({
       {FeedEngagementType::kFeedEngaged, 2},
@@ -242,15 +246,17 @@
       {FeedEngagementType::kFeedEngagedSimple, 2},
       {FeedEngagementType::kFeedScrolled, 2},
   });
-  EXPECT_EQ(want, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want, ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want, ReportedEngagementType(kCombinedStreams));
 }
 
 TEST_F(MetricsReporterTest, InteractedWithBothFeeds) {
-  reporter_->StreamScrolled(kForYouStream, 1);
-  reporter_->OpenAction(kForYouStream, 0, OpenActionType::kDefault);
-  reporter_->StreamScrolled(kWebFeedStream, 1);
-  reporter_->OpenAction(kWebFeedStream, 0, OpenActionType::kDefault);
+  reporter_->StreamScrolled(StreamType(StreamKind::kForYou), 1);
+  reporter_->OpenAction(StreamType(StreamKind::kForYou), 0,
+                        OpenActionType::kDefault);
+  reporter_->StreamScrolled(StreamType(StreamKind::kFollowing), 1);
+  reporter_->OpenAction(StreamType(StreamKind::kFollowing), 0,
+                        OpenActionType::kDefault);
 
   std::map<FeedEngagementType, int> want_1({
       {FeedEngagementType::kFeedEngaged, 1},
@@ -258,8 +264,8 @@
       {FeedEngagementType::kFeedEngagedSimple, 1},
       {FeedEngagementType::kFeedScrolled, 1},
   });
-  EXPECT_EQ(want_1, ReportedEngagementType(kWebFeedStream));
-  EXPECT_EQ(want_1, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want_1, ReportedEngagementType(StreamType(StreamKind::kFollowing)));
+  EXPECT_EQ(want_1, ReportedEngagementType(StreamType(StreamKind::kForYou)));
 
   std::map<FeedEngagementType, int> want_1c({
       {FeedEngagementType::kFeedEngaged, 1},
@@ -281,10 +287,11 @@
       1);
 
   task_environment_.FastForwardBy(base::Minutes(5) + kEpsilon);
-  reporter_->OpenAction(kForYouStream, 0, OpenActionType::kDefault);
-  reporter_->StreamScrolled(kForYouStream, 1);
+  reporter_->OpenAction(StreamType(StreamKind::kForYou), 0,
+                        OpenActionType::kDefault);
+  reporter_->StreamScrolled(StreamType(StreamKind::kForYou), 1);
 
-  EXPECT_EQ(want_1, ReportedEngagementType(kWebFeedStream));
+  EXPECT_EQ(want_1, ReportedEngagementType(StreamType(StreamKind::kFollowing)));
 
   std::map<FeedEngagementType, int> want_2({
       {FeedEngagementType::kFeedEngaged, 2},
@@ -292,7 +299,7 @@
       {FeedEngagementType::kFeedEngagedSimple, 2},
       {FeedEngagementType::kFeedScrolled, 2},
   });
-  EXPECT_EQ(want_2, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want_2, ReportedEngagementType(StreamType(StreamKind::kForYou)));
 
   std::map<FeedEngagementType, int> want_2c({
       {FeedEngagementType::kFeedEngaged, 2},
@@ -315,13 +322,13 @@
 }
 
 TEST_F(MetricsReporterTest, ReportsLoadStreamStatus) {
-  reporter_->OnLoadStream(kForYouStream, LoadStreamStatus::kDataInStoreIsStale,
-                          LoadStreamStatus::kLoadedFromNetwork,
-                          /*is_initial_load=*/true,
-                          /*loaded_new_content_from_network=*/true,
-                          /*stored_content_age=*/base::Days(5), kContentStats,
-                          ContentOrder::kGrouped,
-                          std::make_unique<LoadLatencyTimes>());
+  reporter_->OnLoadStream(
+      StreamType(StreamKind::kForYou), LoadStreamStatus::kDataInStoreIsStale,
+      LoadStreamStatus::kLoadedFromNetwork,
+      /*is_initial_load=*/true,
+      /*loaded_new_content_from_network=*/true,
+      /*stored_content_age=*/base::Days(5), kContentStats,
+      ContentOrder::kGrouped, std::make_unique<LoadLatencyTimes>());
 
   histogram_.ExpectUniqueSample(
       "ContentSuggestions.Feed.LoadStreamStatus.Initial",
@@ -339,13 +346,13 @@
 }
 
 TEST_F(MetricsReporterTest, ReportsLoadStreamStatusWhenDisabled) {
-  reporter_->OnLoadStream(kForYouStream, LoadStreamStatus::kDataInStoreIsStale,
-                          LoadStreamStatus::kLoadNotAllowedDisabled,
-                          /*is_initial_load=*/true,
-                          /*loaded_new_content_from_network=*/false,
-                          /*stored_content_age=*/base::Days(5), kContentStats,
-                          ContentOrder::kGrouped,
-                          std::make_unique<LoadLatencyTimes>());
+  reporter_->OnLoadStream(
+      StreamType(StreamKind::kForYou), LoadStreamStatus::kDataInStoreIsStale,
+      LoadStreamStatus::kLoadNotAllowedDisabled,
+      /*is_initial_load=*/true,
+      /*loaded_new_content_from_network=*/false,
+      /*stored_content_age=*/base::Days(5), kContentStats,
+      ContentOrder::kGrouped, std::make_unique<LoadLatencyTimes>());
 
   histogram_.ExpectUniqueSample(
       "ContentSuggestions.Feed.LoadStreamStatus.Initial",
@@ -356,13 +363,13 @@
 }
 
 TEST_F(MetricsReporterTest, WebFeed_ReportsLoadStreamStatus) {
-  reporter_->OnLoadStream(kWebFeedStream, LoadStreamStatus::kDataInStoreIsStale,
-                          LoadStreamStatus::kLoadedFromNetwork,
-                          /*is_initial_load=*/true,
-                          /*loaded_new_content_from_network=*/true,
-                          /*stored_content_age=*/base::Days(5), kContentStats,
-                          ContentOrder::kGrouped,
-                          std::make_unique<LoadLatencyTimes>());
+  reporter_->OnLoadStream(
+      StreamType(StreamKind::kFollowing), LoadStreamStatus::kDataInStoreIsStale,
+      LoadStreamStatus::kLoadedFromNetwork,
+      /*is_initial_load=*/true,
+      /*loaded_new_content_from_network=*/true,
+      /*stored_content_age=*/base::Days(5), kContentStats,
+      ContentOrder::kGrouped, std::make_unique<LoadLatencyTimes>());
 
   histogram_.ExpectUniqueSample(
       "ContentSuggestions.Feed.WebFeed.LoadStreamStatus.Initial",
@@ -390,13 +397,13 @@
 }
 
 TEST_F(MetricsReporterTest, WebFeed_ReportsLoadStreamStatus_ReverseChron) {
-  reporter_->OnLoadStream(kWebFeedStream, LoadStreamStatus::kDataInStoreIsStale,
-                          LoadStreamStatus::kLoadedFromNetwork,
-                          /*is_initial_load=*/true,
-                          /*loaded_new_content_from_network=*/true,
-                          /*stored_content_age=*/base::Days(5), kContentStats,
-                          ContentOrder::kReverseChron,
-                          std::make_unique<LoadLatencyTimes>());
+  reporter_->OnLoadStream(
+      StreamType(StreamKind::kFollowing), LoadStreamStatus::kDataInStoreIsStale,
+      LoadStreamStatus::kLoadedFromNetwork,
+      /*is_initial_load=*/true,
+      /*loaded_new_content_from_network=*/true,
+      /*stored_content_age=*/base::Days(5), kContentStats,
+      ContentOrder::kReverseChron, std::make_unique<LoadLatencyTimes>());
 
   histogram_.ExpectUniqueSample(
       "ContentSuggestions.Feed.WebFeed.LoadedCardCount",
@@ -409,13 +416,13 @@
 }
 
 TEST_F(MetricsReporterTest, WebFeed_ReportsNoContentShown) {
-  reporter_->OnLoadStream(kWebFeedStream, LoadStreamStatus::kDataInStoreIsStale,
-                          LoadStreamStatus::kLoadedFromNetwork,
-                          /*is_initial_load=*/true,
-                          /*loaded_new_content_from_network=*/true,
-                          /*stored_content_age=*/base::Days(5), ContentStats(),
-                          ContentOrder::kGrouped,
-                          std::make_unique<LoadLatencyTimes>());
+  reporter_->OnLoadStream(
+      StreamType(StreamKind::kFollowing), LoadStreamStatus::kDataInStoreIsStale,
+      LoadStreamStatus::kLoadedFromNetwork,
+      /*is_initial_load=*/true,
+      /*loaded_new_content_from_network=*/true,
+      /*stored_content_age=*/base::Days(5), ContentStats(),
+      ContentOrder::kGrouped, std::make_unique<LoadLatencyTimes>());
 
   histogram_.ExpectUniqueSample(
       "ContentSuggestions.Feed.WebFeed.FollowCount.NoContentShown",
@@ -423,25 +430,25 @@
 }
 
 TEST_F(MetricsReporterTest, OnLoadStreamDoesNotReportLoadedCardCountOnFailure) {
-  reporter_->OnLoadStream(kForYouStream, LoadStreamStatus::kDataInStoreIsStale,
-                          LoadStreamStatus::kDataInStoreIsExpired,
-                          /*is_initial_load=*/true,
-                          /*loaded_new_content_from_network=*/false,
-                          /*stored_content_age=*/base::Days(5), kContentStats,
-                          ContentOrder::kGrouped,
-                          std::make_unique<LoadLatencyTimes>());
+  reporter_->OnLoadStream(
+      StreamType(StreamKind::kForYou), LoadStreamStatus::kDataInStoreIsStale,
+      LoadStreamStatus::kDataInStoreIsExpired,
+      /*is_initial_load=*/true,
+      /*loaded_new_content_from_network=*/false,
+      /*stored_content_age=*/base::Days(5), kContentStats,
+      ContentOrder::kGrouped, std::make_unique<LoadLatencyTimes>());
 
   histogram_.ExpectTotalCount("ContentSuggestions.Feed.LoadedCardCount", 0);
 }
 
 TEST_F(MetricsReporterTest, ReportsLoadStreamStatusForManualRefresh) {
-  reporter_->OnLoadStream(kForYouStream, LoadStreamStatus::kDataInStoreIsStale,
-                          LoadStreamStatus::kLoadedFromNetwork,
-                          /*is_initial_load=*/false,
-                          /*loaded_new_content_from_network=*/true,
-                          /*stored_content_age=*/base::Days(5), kContentStats,
-                          ContentOrder::kGrouped,
-                          std::make_unique<LoadLatencyTimes>());
+  reporter_->OnLoadStream(
+      StreamType(StreamKind::kForYou), LoadStreamStatus::kDataInStoreIsStale,
+      LoadStreamStatus::kLoadedFromNetwork,
+      /*is_initial_load=*/false,
+      /*loaded_new_content_from_network=*/true,
+      /*stored_content_age=*/base::Days(5), kContentStats,
+      ContentOrder::kGrouped, std::make_unique<LoadLatencyTimes>());
 
   histogram_.ExpectUniqueSample(
       "ContentSuggestions.Feed.LoadStreamStatus.Initial",
@@ -455,13 +462,13 @@
 }
 
 TEST_F(MetricsReporterTest, ReportsLoadStreamStatusIgnoresNoStatusFromStore) {
-  reporter_->OnLoadStream(kForYouStream, LoadStreamStatus::kNoStatus,
-                          LoadStreamStatus::kLoadedFromNetwork,
-                          /*is_initial_load=*/true,
-                          /*loaded_new_content_from_network=*/true,
-                          /*stored_content_age=*/base::TimeDelta(),
-                          kContentStats, ContentOrder::kGrouped,
-                          std::make_unique<LoadLatencyTimes>());
+  reporter_->OnLoadStream(
+      StreamType(StreamKind::kForYou), LoadStreamStatus::kNoStatus,
+      LoadStreamStatus::kLoadedFromNetwork,
+      /*is_initial_load=*/true,
+      /*loaded_new_content_from_network=*/true,
+      /*stored_content_age=*/base::TimeDelta(), kContentStats,
+      ContentOrder::kGrouped, std::make_unique<LoadLatencyTimes>());
 
   histogram_.ExpectUniqueSample(
       "ContentSuggestions.Feed.LoadStreamStatus.Initial",
@@ -474,13 +481,13 @@
 }
 
 TEST_F(MetricsReporterTest, ReportsContentAgeBlockingRefresh) {
-  reporter_->OnLoadStream(kForYouStream, LoadStreamStatus::kDataInStoreIsStale,
-                          LoadStreamStatus::kLoadedFromNetwork,
-                          /*is_initial_load=*/true,
-                          /*loaded_new_content_from_network=*/true,
-                          /*stored_content_age=*/base::Days(5), kContentStats,
-                          ContentOrder::kGrouped,
-                          std::make_unique<LoadLatencyTimes>());
+  reporter_->OnLoadStream(
+      StreamType(StreamKind::kForYou), LoadStreamStatus::kDataInStoreIsStale,
+      LoadStreamStatus::kLoadedFromNetwork,
+      /*is_initial_load=*/true,
+      /*loaded_new_content_from_network=*/true,
+      /*stored_content_age=*/base::Days(5), kContentStats,
+      ContentOrder::kGrouped, std::make_unique<LoadLatencyTimes>());
 
   histogram_.ExpectUniqueTimeSample(
       "ContentSuggestions.Feed.ContentAgeOnLoad.BlockingRefresh", base::Days(5),
@@ -488,13 +495,13 @@
 }
 
 TEST_F(MetricsReporterTest, ReportsContentAgeNoRefresh) {
-  reporter_->OnLoadStream(kForYouStream, LoadStreamStatus::kDataInStoreIsStale,
-                          LoadStreamStatus::kLoadedFromStore,
-                          /*is_initial_load=*/true,
-                          /*loaded_new_content_from_network=*/false,
-                          /*stored_content_age=*/base::Days(5), kContentStats,
-                          ContentOrder::kGrouped,
-                          std::make_unique<LoadLatencyTimes>());
+  reporter_->OnLoadStream(
+      StreamType(StreamKind::kForYou), LoadStreamStatus::kDataInStoreIsStale,
+      LoadStreamStatus::kLoadedFromStore,
+      /*is_initial_load=*/true,
+      /*loaded_new_content_from_network=*/false,
+      /*stored_content_age=*/base::Days(5), kContentStats,
+      ContentOrder::kGrouped, std::make_unique<LoadLatencyTimes>());
 
   histogram_.ExpectUniqueTimeSample(
       "ContentSuggestions.Feed.ContentAgeOnLoad.NotRefreshed", base::Days(5),
@@ -503,18 +510,18 @@
 
 TEST_F(MetricsReporterTest, DoNotReportContentAgeWhenNotPositive) {
   reporter_->OnLoadStream(
-      kForYouStream, LoadStreamStatus::kDataInStoreIsStale,
+      StreamType(StreamKind::kForYou), LoadStreamStatus::kDataInStoreIsStale,
       LoadStreamStatus::kLoadedFromStore, /*is_initial_load=*/true,
       /*loaded_new_content_from_network=*/false,
       /*stored_content_age=*/-base::Seconds(1), kContentStats,
       ContentOrder::kGrouped, std::make_unique<LoadLatencyTimes>());
-  reporter_->OnLoadStream(kForYouStream, LoadStreamStatus::kDataInStoreIsStale,
-                          LoadStreamStatus::kLoadedFromStore,
-                          /*is_initial_load=*/true,
-                          /*loaded_new_content_from_network=*/false,
-                          /*stored_content_age=*/base::TimeDelta(),
-                          kContentStats, ContentOrder::kGrouped,
-                          std::make_unique<LoadLatencyTimes>());
+  reporter_->OnLoadStream(
+      StreamType(StreamKind::kForYou), LoadStreamStatus::kDataInStoreIsStale,
+      LoadStreamStatus::kLoadedFromStore,
+      /*is_initial_load=*/true,
+      /*loaded_new_content_from_network=*/false,
+      /*stored_content_age=*/base::TimeDelta(), kContentStats,
+      ContentOrder::kGrouped, std::make_unique<LoadLatencyTimes>());
   histogram_.ExpectTotalCount(
       "ContentSuggestions.Feed.ContentAgeOnLoad.NotRefreshed", 0);
   histogram_.ExpectTotalCount(
@@ -528,13 +535,13 @@
     latencies->StepComplete(LoadLatencyTimes::kLoadFromStore);
     task_environment_.FastForwardBy(base::Milliseconds(50));
     latencies->StepComplete(LoadLatencyTimes::kUploadActions);
-    reporter_->OnLoadStream(kForYouStream, LoadStreamStatus::kNoStatus,
-                            LoadStreamStatus::kLoadedFromNetwork,
-                            /*is_initial_load=*/true,
-                            /*loaded_new_content_from_network=*/true,
-                            /*stored_content_age=*/base::TimeDelta(),
-                            kContentStats, ContentOrder::kGrouped,
-                            std::move(latencies));
+    reporter_->OnLoadStream(
+        StreamType(StreamKind::kForYou), LoadStreamStatus::kNoStatus,
+        LoadStreamStatus::kLoadedFromNetwork,
+        /*is_initial_load=*/true,
+        /*loaded_new_content_from_network=*/true,
+        /*stored_content_age=*/base::TimeDelta(), kContentStats,
+        ContentOrder::kGrouped, std::move(latencies));
   }
   task_environment_.FastForwardBy(base::Milliseconds(300));
   reporter_->FeedViewed(kSurfaceId);
@@ -552,8 +559,8 @@
 }
 
 TEST_F(MetricsReporterTest, ReportsLoadMoreStatus) {
-  reporter_->OnLoadMore(kForYouStream, LoadStreamStatus::kLoadedFromNetwork,
-                        kContentStats);
+  reporter_->OnLoadMore(StreamType(StreamKind::kForYou),
+                        LoadStreamStatus::kLoadedFromNetwork, kContentStats);
 
   histogram_.ExpectUniqueSample(
       "ContentSuggestions.Feed.LoadStreamStatus.LoadMore",
@@ -561,7 +568,7 @@
 }
 
 TEST_F(MetricsReporterTest, ReportsBackgroundRefreshStatus) {
-  reporter_->OnBackgroundRefresh(kForYouStream,
+  reporter_->OnBackgroundRefresh(StreamType(StreamKind::kForYou),
                                  LoadStreamStatus::kLoadedFromNetwork);
 
   histogram_.ExpectUniqueSample(
@@ -570,7 +577,7 @@
 }
 
 TEST_F(MetricsReporterTest, WebFeed_ReportsBackgroundRefreshStatus) {
-  reporter_->OnBackgroundRefresh(kWebFeedStream,
+  reporter_->OnBackgroundRefresh(StreamType(StreamKind::kFollowing),
                                  LoadStreamStatus::kLoadedFromNetwork);
 
   histogram_.ExpectUniqueSample(
@@ -579,14 +586,15 @@
 }
 
 TEST_F(MetricsReporterTest, OpenAction) {
-  reporter_->OpenAction(kForYouStream, 5, OpenActionType::kDefault);
+  reporter_->OpenAction(StreamType(StreamKind::kForYou), 5,
+                        OpenActionType::kDefault);
 
   std::map<FeedEngagementType, int> want({
       {FeedEngagementType::kFeedEngaged, 1},
       {FeedEngagementType::kFeedInteracted, 1},
       {FeedEngagementType::kFeedEngagedSimple, 1},
   });
-  EXPECT_EQ(want, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want, ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want, ReportedEngagementType(kCombinedStreams));
   EXPECT_EQ(1, user_actions_.GetActionCount(
                    "ContentSuggestions.Feed.CardAction.Open"));
@@ -606,14 +614,15 @@
 }
 
 TEST_F(MetricsReporterTest, OpenActionWebFeed) {
-  reporter_->OpenAction(kWebFeedStream, 5, OpenActionType::kDefault);
+  reporter_->OpenAction(StreamType(StreamKind::kFollowing), 5,
+                        OpenActionType::kDefault);
 
   std::map<FeedEngagementType, int> want({
       {FeedEngagementType::kFeedEngaged, 1},
       {FeedEngagementType::kFeedInteracted, 1},
       {FeedEngagementType::kFeedEngagedSimple, 1},
   });
-  EXPECT_EQ(want, ReportedEngagementType(kWebFeedStream));
+  EXPECT_EQ(want, ReportedEngagementType(StreamType(StreamKind::kFollowing)));
   EXPECT_EQ(want, ReportedEngagementType(kCombinedStreams));
   EXPECT_EQ(1, user_actions_.GetActionCount(
                    "ContentSuggestions.Feed.CardAction.Open"));
@@ -634,14 +643,15 @@
 }
 
 TEST_F(MetricsReporterTest, OpenInNewTabAction) {
-  reporter_->OpenAction(kForYouStream, 5, OpenActionType::kNewTab);
+  reporter_->OpenAction(StreamType(StreamKind::kForYou), 5,
+                        OpenActionType::kNewTab);
 
   std::map<FeedEngagementType, int> want({
       {FeedEngagementType::kFeedEngaged, 1},
       {FeedEngagementType::kFeedInteracted, 1},
       {FeedEngagementType::kFeedEngagedSimple, 1},
   });
-  EXPECT_EQ(want, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want, ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want, ReportedEngagementType(kCombinedStreams));
   EXPECT_EQ(1, user_actions_.GetActionCount(
                    "ContentSuggestions.Feed.CardAction.OpenInNewTab"));
@@ -651,14 +661,15 @@
 }
 
 TEST_F(MetricsReporterTest, OpenInNewTabInGroupAction) {
-  reporter_->OpenAction(kForYouStream, 5, OpenActionType::kNewTabInGroup);
+  reporter_->OpenAction(StreamType(StreamKind::kForYou), 5,
+                        OpenActionType::kNewTabInGroup);
 
   std::map<FeedEngagementType, int> want({
       {FeedEngagementType::kFeedEngaged, 1},
       {FeedEngagementType::kFeedInteracted, 1},
       {FeedEngagementType::kFeedEngagedSimple, 1},
   });
-  EXPECT_EQ(want, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want, ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want, ReportedEngagementType(kCombinedStreams));
   EXPECT_EQ(1, user_actions_.GetActionCount(
                    "ContentSuggestions.Feed.CardAction.OpenInNewTabInGroup"));
@@ -669,7 +680,7 @@
 }
 
 TEST_F(MetricsReporterTest, OpenInNewIncognitoTabAction) {
-  reporter_->OtherUserAction(kForYouStream,
+  reporter_->OtherUserAction(StreamType(StreamKind::kForYou),
                              FeedUserActionType::kTappedOpenInNewIncognitoTab);
 
   std::map<FeedEngagementType, int> want({
@@ -677,7 +688,7 @@
       {FeedEngagementType::kFeedInteracted, 1},
       {FeedEngagementType::kFeedEngagedSimple, 1},
   });
-  EXPECT_EQ(want, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want, ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want, ReportedEngagementType(kCombinedStreams));
   EXPECT_EQ(1, user_actions_.GetActionCount(
                    "ContentSuggestions.Feed.CardAction.OpenInNewIncognitoTab"));
@@ -688,7 +699,7 @@
 }
 
 TEST_F(MetricsReporterTest, SendFeedbackAction) {
-  reporter_->OtherUserAction(kForYouStream,
+  reporter_->OtherUserAction(StreamType(StreamKind::kForYou),
                              FeedUserActionType::kTappedSendFeedback);
 
   std::map<FeedEngagementType, int> want({
@@ -696,7 +707,7 @@
       {FeedEngagementType::kFeedInteracted, 1},
       {FeedEngagementType::kFeedEngagedSimple, 1},
   });
-  EXPECT_EQ(want, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want, ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want, ReportedEngagementType(kCombinedStreams));
   EXPECT_EQ(1, user_actions_.GetActionCount(
                    "ContentSuggestions.Feed.CardAction.SendFeedback"));
@@ -705,7 +716,7 @@
 }
 
 TEST_F(MetricsReporterTest, DownloadAction) {
-  reporter_->OtherUserAction(kForYouStream,
+  reporter_->OtherUserAction(StreamType(StreamKind::kForYou),
                              FeedUserActionType::kTappedDownload);
 
   std::map<FeedEngagementType, int> want({
@@ -713,7 +724,7 @@
       {FeedEngagementType::kFeedInteracted, 1},
       {FeedEngagementType::kFeedEngagedSimple, 1},
   });
-  EXPECT_EQ(want, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want, ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want, ReportedEngagementType(kCombinedStreams));
   EXPECT_EQ(1, user_actions_.GetActionCount(
                    "ContentSuggestions.Feed.CardAction.Download"));
@@ -722,7 +733,7 @@
 }
 
 TEST_F(MetricsReporterTest, LearnMoreAction) {
-  reporter_->OtherUserAction(kForYouStream,
+  reporter_->OtherUserAction(StreamType(StreamKind::kForYou),
                              FeedUserActionType::kTappedLearnMore);
 
   std::map<FeedEngagementType, int> want({
@@ -730,7 +741,7 @@
       {FeedEngagementType::kFeedInteracted, 1},
       {FeedEngagementType::kFeedEngagedSimple, 1},
   });
-  EXPECT_EQ(want, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want, ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want, ReportedEngagementType(kCombinedStreams));
   EXPECT_EQ(1, user_actions_.GetActionCount(
                    "ContentSuggestions.Feed.CardAction.LearnMore"));
@@ -739,7 +750,7 @@
 }
 
 TEST_F(MetricsReporterTest, RemoveAction) {
-  reporter_->OtherUserAction(kForYouStream,
+  reporter_->OtherUserAction(StreamType(StreamKind::kForYou),
                              FeedUserActionType::kTappedHideStory);
 
   std::map<FeedEngagementType, int> want({
@@ -747,7 +758,7 @@
       {FeedEngagementType::kFeedInteracted, 1},
       {FeedEngagementType::kFeedEngagedSimple, 1},
   });
-  EXPECT_EQ(want, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want, ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want, ReportedEngagementType(kCombinedStreams));
   EXPECT_EQ(1, user_actions_.GetActionCount(
                    "ContentSuggestions.Feed.CardAction.HideStory"));
@@ -756,7 +767,7 @@
 }
 
 TEST_F(MetricsReporterTest, NotInterestedInAction) {
-  reporter_->OtherUserAction(kForYouStream,
+  reporter_->OtherUserAction(StreamType(StreamKind::kForYou),
                              FeedUserActionType::kTappedNotInterestedIn);
 
   std::map<FeedEngagementType, int> want({
@@ -764,7 +775,7 @@
       {FeedEngagementType::kFeedInteracted, 1},
       {FeedEngagementType::kFeedEngagedSimple, 1},
   });
-  EXPECT_EQ(want, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want, ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want, ReportedEngagementType(kCombinedStreams));
   EXPECT_EQ(1, user_actions_.GetActionCount(
                    "ContentSuggestions.Feed.CardAction.NotInterestedIn"));
@@ -773,7 +784,7 @@
 }
 
 TEST_F(MetricsReporterTest, ManageInterestsAction) {
-  reporter_->OtherUserAction(kForYouStream,
+  reporter_->OtherUserAction(StreamType(StreamKind::kForYou),
                              FeedUserActionType::kTappedManageInterests);
 
   std::map<FeedEngagementType, int> want({
@@ -781,7 +792,7 @@
       {FeedEngagementType::kFeedInteracted, 1},
       {FeedEngagementType::kFeedEngagedSimple, 1},
   });
-  EXPECT_EQ(want, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want, ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want, ReportedEngagementType(kCombinedStreams));
   EXPECT_EQ(1, user_actions_.GetActionCount(
                    "ContentSuggestions.Feed.CardAction.ManageInterests"));
@@ -790,11 +801,12 @@
 }
 
 TEST_F(MetricsReporterTest, ContextMenuOpened) {
-  reporter_->OtherUserAction(kForYouStream,
+  reporter_->OtherUserAction(StreamType(StreamKind::kForYou),
                              FeedUserActionType::kOpenedContextMenu);
 
   std::map<FeedEngagementType, int> want_empty;
-  EXPECT_EQ(want_empty, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want_empty,
+            ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want_empty, ReportedEngagementType(kCombinedStreams));
   EXPECT_EQ(1, user_actions_.GetActionCount(
                    "ContentSuggestions.Feed.CardAction.ContextMenu"));
@@ -803,17 +815,18 @@
 }
 
 TEST_F(MetricsReporterTest, SurfaceOpened) {
-  reporter_->SurfaceOpened(kForYouStream, kSurfaceId);
+  reporter_->SurfaceOpened(StreamType(StreamKind::kForYou), kSurfaceId);
 
   std::map<FeedEngagementType, int> want_empty;
-  EXPECT_EQ(want_empty, ReportedEngagementType(kForYouStream));
+  EXPECT_EQ(want_empty,
+            ReportedEngagementType(StreamType(StreamKind::kForYou)));
   EXPECT_EQ(want_empty, ReportedEngagementType(kCombinedStreams));
   histogram_.ExpectUniqueSample("ContentSuggestions.Feed.UserActions",
                                 FeedUserActionType::kOpenedFeedSurface, 1);
 }
 
 TEST_F(MetricsReporterTest, OpenFeedSuccessDuration) {
-  reporter_->SurfaceOpened(kForYouStream, kSurfaceId);
+  reporter_->SurfaceOpened(StreamType(StreamKind::kForYou), kSurfaceId);
   task_environment_.FastForwardBy(base::Seconds(9));
   reporter_->FeedViewed(kSurfaceId);
 
@@ -823,7 +836,7 @@
 }
 
 TEST_F(MetricsReporterTest, WebFeed_OpenFeedSuccessDuration) {
-  reporter_->SurfaceOpened(kWebFeedStream, kSurfaceId);
+  reporter_->SurfaceOpened(StreamType(StreamKind::kFollowing), kSurfaceId);
   task_environment_.FastForwardBy(base::Seconds(9));
   reporter_->FeedViewed(kSurfaceId);
 
@@ -833,7 +846,7 @@
 }
 
 TEST_F(MetricsReporterTest, OpenFeedLoadTimeout) {
-  reporter_->SurfaceOpened(kForYouStream, kSurfaceId);
+  reporter_->SurfaceOpened(StreamType(StreamKind::kForYou), kSurfaceId);
   task_environment_.FastForwardBy(base::Seconds(16));
 
   histogram_.ExpectUniqueTimeSample(
@@ -844,7 +857,7 @@
 }
 
 TEST_F(MetricsReporterTest, WebFeed_OpenFeedLoadTimeout) {
-  reporter_->SurfaceOpened(kWebFeedStream, kSurfaceId);
+  reporter_->SurfaceOpened(StreamType(StreamKind::kFollowing), kSurfaceId);
   task_environment_.FastForwardBy(base::Seconds(16));
 
   histogram_.ExpectUniqueTimeSample(
@@ -856,7 +869,7 @@
 }
 
 TEST_F(MetricsReporterTest, OpenFeedCloseBeforeLoad) {
-  reporter_->SurfaceOpened(kForYouStream, kSurfaceId);
+  reporter_->SurfaceOpened(StreamType(StreamKind::kForYou), kSurfaceId);
   task_environment_.FastForwardBy(base::Seconds(14));
   reporter_->SurfaceClosed(kSurfaceId);
 
@@ -868,7 +881,7 @@
 }
 
 TEST_F(MetricsReporterTest, WebFeed_OpenFeedCloseBeforeLoad) {
-  reporter_->SurfaceOpened(kWebFeedStream, kSurfaceId);
+  reporter_->SurfaceOpened(StreamType(StreamKind::kFollowing), kSurfaceId);
   task_environment_.FastForwardBy(base::Seconds(14));
   reporter_->SurfaceClosed(kSurfaceId);
 
@@ -881,7 +894,8 @@
 }
 
 TEST_F(MetricsReporterTest, OpenCardSuccessDuration) {
-  reporter_->OpenAction(kForYouStream, 0, OpenActionType::kDefault);
+  reporter_->OpenAction(StreamType(StreamKind::kForYou), 0,
+                        OpenActionType::kDefault);
   task_environment_.FastForwardBy(base::Seconds(19));
   reporter_->PageLoaded();
 
@@ -891,7 +905,8 @@
 }
 
 TEST_F(MetricsReporterTest, WebFeed_OpenCardSuccessDuration) {
-  reporter_->OpenAction(kWebFeedStream, 0, OpenActionType::kDefault);
+  reporter_->OpenAction(StreamType(StreamKind::kFollowing), 0,
+                        OpenActionType::kDefault);
   task_environment_.FastForwardBy(base::Seconds(19));
   reporter_->PageLoaded();
 
@@ -901,7 +916,8 @@
 }
 
 TEST_F(MetricsReporterTest, OpenCardTimeout) {
-  reporter_->OpenAction(kForYouStream, 0, OpenActionType::kDefault);
+  reporter_->OpenAction(StreamType(StreamKind::kForYou), 0,
+                        OpenActionType::kDefault);
   task_environment_.FastForwardBy(base::Seconds(21));
   reporter_->PageLoaded();
 
@@ -912,7 +928,8 @@
 }
 
 TEST_F(MetricsReporterTest, WebFeed_OpenCardTimeout) {
-  reporter_->OpenAction(kWebFeedStream, 0, OpenActionType::kDefault);
+  reporter_->OpenAction(StreamType(StreamKind::kFollowing), 0,
+                        OpenActionType::kDefault);
   task_environment_.FastForwardBy(base::Seconds(21));
   reporter_->PageLoaded();
 
@@ -924,9 +941,12 @@
 }
 
 TEST_F(MetricsReporterTest, OpenCardFailureTwiceAndThenSucceed) {
-  reporter_->OpenAction(kForYouStream, 0, OpenActionType::kDefault);
-  reporter_->OpenAction(kForYouStream, 1, OpenActionType::kDefault);
-  reporter_->OpenAction(kForYouStream, 2, OpenActionType::kDefault);
+  reporter_->OpenAction(StreamType(StreamKind::kForYou), 0,
+                        OpenActionType::kDefault);
+  reporter_->OpenAction(StreamType(StreamKind::kForYou), 1,
+                        OpenActionType::kDefault);
+  reporter_->OpenAction(StreamType(StreamKind::kForYou), 2,
+                        OpenActionType::kDefault);
   reporter_->PageLoaded();
 
   histogram_.ExpectUniqueSample(
@@ -936,9 +956,12 @@
 }
 
 TEST_F(MetricsReporterTest, WebFeed_OpenCardFailureTwiceAndThenSucceed) {
-  reporter_->OpenAction(kWebFeedStream, 0, OpenActionType::kDefault);
-  reporter_->OpenAction(kWebFeedStream, 1, OpenActionType::kDefault);
-  reporter_->OpenAction(kWebFeedStream, 2, OpenActionType::kDefault);
+  reporter_->OpenAction(StreamType(StreamKind::kFollowing), 0,
+                        OpenActionType::kDefault);
+  reporter_->OpenAction(StreamType(StreamKind::kFollowing), 1,
+                        OpenActionType::kDefault);
+  reporter_->OpenAction(StreamType(StreamKind::kFollowing), 2,
+                        OpenActionType::kDefault);
   reporter_->PageLoaded();
 
   histogram_.ExpectUniqueSample(
@@ -949,7 +972,8 @@
 }
 
 TEST_F(MetricsReporterTest, OpenCardCloseChromeFailure) {
-  reporter_->OpenAction(kForYouStream, 0, OpenActionType::kDefault);
+  reporter_->OpenAction(StreamType(StreamKind::kForYou), 0,
+                        OpenActionType::kDefault);
   reporter_->OnEnterBackground();
 
   histogram_.ExpectUniqueSample(
@@ -959,11 +983,13 @@
 }
 
 TEST_F(MetricsReporterTest, TimeSpentInFeedCountsOnlyForegroundTime) {
-  reporter_->OpenAction(kForYouStream, 0, OpenActionType::kDefault);
+  reporter_->OpenAction(StreamType(StreamKind::kForYou), 0,
+                        OpenActionType::kDefault);
   task_environment_.FastForwardBy(base::Seconds(1));
   reporter_->OnEnterBackground();
   task_environment_.FastForwardBy(base::Seconds(2));
-  reporter_->OpenAction(kForYouStream, 0, OpenActionType::kDefault);
+  reporter_->OpenAction(StreamType(StreamKind::kForYou), 0,
+                        OpenActionType::kDefault);
   task_environment_.FastForwardBy(base::Seconds(3));
   reporter_->OnEnterBackground();
 
@@ -976,7 +1002,8 @@
 }
 
 TEST_F(MetricsReporterTest, TimeSpentInFeedLimitsIdleTime) {
-  reporter_->OpenAction(kForYouStream, 0, OpenActionType::kDefault);
+  reporter_->OpenAction(StreamType(StreamKind::kForYou), 0,
+                        OpenActionType::kDefault);
   task_environment_.FastForwardBy(base::Seconds(31));
   reporter_->OnEnterBackground();
 
@@ -993,7 +1020,8 @@
   // interaction due to the interaction timeout. The 49th |OpenAction()| call
   // triggers reporting the UMA for the previous day.
   for (int i = 0; i < 49; ++i) {
-    reporter_->OpenAction(kForYouStream, 0, OpenActionType::kDefault);
+    reporter_->OpenAction(StreamType(StreamKind::kForYou), 0,
+                          OpenActionType::kDefault);
     task_environment_.FastForwardBy(base::Hours(1));
   }
 
@@ -1006,7 +1034,8 @@
   // destroyed and recreated. The 49th |OpenAction()| call triggers reporting
   // the UMA for the previous day.
   for (int i = 0; i < 49; ++i) {
-    reporter_->OpenAction(kForYouStream, 0, OpenActionType::kDefault);
+    reporter_->OpenAction(StreamType(StreamKind::kForYou), 0,
+                          OpenActionType::kDefault);
     task_environment_.FastForwardBy(base::Hours(1));
     reporter_->OnEnterBackground();
     RecreateMetricsReporter();
@@ -1019,7 +1048,7 @@
 TEST_F(MetricsReporterTest, TimeSpentInFeedTracksWholeScrollTime) {
   reporter_->StreamScrollStart();
   task_environment_.FastForwardBy(base::Seconds(2));
-  reporter_->StreamScrolled(kForYouStream, 1);
+  reporter_->StreamScrolled(StreamType(StreamKind::kForYou), 1);
   task_environment_.FastForwardBy(base::Seconds(1));
   reporter_->OnEnterBackground();
 
@@ -1032,13 +1061,15 @@
 }
 
 TEST_F(MetricsReporterTest, TurnOnAction) {
-  reporter_->OtherUserAction(kForYouStream, FeedUserActionType::kTappedTurnOn);
+  reporter_->OtherUserAction(StreamType(StreamKind::kForYou),
+                             FeedUserActionType::kTappedTurnOn);
   histogram_.ExpectUniqueSample("ContentSuggestions.Feed.UserActions",
                                 FeedUserActionType::kTappedTurnOn, 1);
 }
 
 TEST_F(MetricsReporterTest, TurnOffAction) {
-  reporter_->OtherUserAction(kForYouStream, FeedUserActionType::kTappedTurnOff);
+  reporter_->OtherUserAction(StreamType(StreamKind::kForYou),
+                             FeedUserActionType::kTappedTurnOff);
   histogram_.ExpectUniqueSample("ContentSuggestions.Feed.UserActions",
                                 FeedUserActionType::kTappedTurnOff, 1);
 }
@@ -1222,23 +1253,23 @@
 }
 
 TEST_F(MetricsReporterTest, ReportInfoCard) {
-  reporter_->OnInfoCardTrackViewStarted(kForYouStream, 0);
+  reporter_->OnInfoCardTrackViewStarted(StreamType(StreamKind::kForYou), 0);
   histogram_.ExpectUniqueSample("ContentSuggestions.Feed.InfoCard.Started", 0,
                                 1);
 
-  reporter_->OnInfoCardViewed(kForYouStream, 0);
+  reporter_->OnInfoCardViewed(StreamType(StreamKind::kForYou), 0);
   histogram_.ExpectUniqueSample("ContentSuggestions.Feed.InfoCard.Viewed", 0,
                                 1);
 
-  reporter_->OnInfoCardClicked(kWebFeedStream, 1);
+  reporter_->OnInfoCardClicked(StreamType(StreamKind::kFollowing), 1);
   histogram_.ExpectUniqueSample(
       "ContentSuggestions.Feed.WebFeed.InfoCard.Clicked", 1, 1);
 
-  reporter_->OnInfoCardDismissedExplicitly(kForYouStream, 0);
+  reporter_->OnInfoCardDismissedExplicitly(StreamType(StreamKind::kForYou), 0);
   histogram_.ExpectUniqueSample("ContentSuggestions.Feed.InfoCard.Dismissed", 0,
                                 1);
 
-  reporter_->OnInfoCardStateReset(kWebFeedStream, 1);
+  reporter_->OnInfoCardStateReset(StreamType(StreamKind::kFollowing), 1);
   histogram_.ExpectUniqueSample(
       "ContentSuggestions.Feed.WebFeed.InfoCard.Reset", 1, 1);
 }
diff --git a/components/feed/core/v2/proto_util.cc b/components/feed/core/v2/proto_util.cc
index 77cb7dcd..c282e2a 100644
--- a/components/feed/core/v2/proto_util.cc
+++ b/components/feed/core/v2/proto_util.cc
@@ -213,10 +213,10 @@
   // Set the feed entry point based on the stream type.
   feedwire::FeedEntryPointData& entry_point =
       *query.mutable_feed_entry_point_data();
-  if (stream_type == kForYouStream) {
+  if (stream_type.IsForYou()) {
     entry_point.set_feed_entry_point_source_value(
         feedwire::FeedEntryPointSource::CHROME_DISCOVER_FEED);
-  } else if (stream_type == kWebFeedStream) {
+  } else if (stream_type.IsWebFeed()) {
     entry_point.set_feed_entry_point_source_value(
         feedwire::FeedEntryPointSource::CHROME_FOLLOWING_FEED);
   }
@@ -376,8 +376,8 @@
     const std::string& consistency_token,
     const std::string& next_page_token) {
   return CreateFeedQueryRequest(
-      kForYouStream, feedwire::FeedQuery::NEXT_PAGE_SCROLL, request_metadata,
-      consistency_token, next_page_token);
+      StreamType(StreamKind::kForYou), feedwire::FeedQuery::NEXT_PAGE_SCROLL,
+      request_metadata, consistency_token, next_page_token);
 }
 
 }  // namespace feed
diff --git a/components/feed/core/v2/proto_util_unittest.cc b/components/feed/core/v2/proto_util_unittest.cc
index 7aeb3375..309e63b 100644
--- a/components/feed/core/v2/proto_util_unittest.cc
+++ b/components/feed/core/v2/proto_util_unittest.cc
@@ -67,7 +67,7 @@
 
 TEST(ProtoUtilTest, DefaultCapabilities) {
   feedwire::FeedRequest request =
-      CreateFeedQueryRefreshRequest(kForYouStream,
+      CreateFeedQueryRefreshRequest(StreamType(StreamKind::kForYou),
                                     feedwire::FeedQuery::MANUAL_REFRESH,
                                     /*request_metadata=*/{},
                                     /*consistency_token=*/std::string())
@@ -95,7 +95,7 @@
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures({kInterestFeedV2Hearts}, {});
   feedwire::FeedRequest request =
-      CreateFeedQueryRefreshRequest(kForYouStream,
+      CreateFeedQueryRefreshRequest(StreamType(StreamKind::kForYou),
                                     feedwire::FeedQuery::MANUAL_REFRESH,
                                     /*request_metadata=*/{},
                                     /*consistency_token=*/std::string())
@@ -113,7 +113,7 @@
   OverrideConfigWithFinchForTesting();
 
   feedwire::FeedRequest request =
-      CreateFeedQueryRefreshRequest(kForYouStream,
+      CreateFeedQueryRefreshRequest(StreamType(StreamKind::kForYou),
                                     feedwire::FeedQuery::MANUAL_REFRESH,
                                     /*request_metadata=*/{},
                                     /*consistency_token=*/std::string())
@@ -131,7 +131,8 @@
   RequestMetadata request_metadata;
   request_metadata.notice_card_acknowledged = true;
   feedwire::Request request = CreateFeedQueryRefreshRequest(
-      kForYouStream, feedwire::FeedQuery::MANUAL_REFRESH, request_metadata,
+      StreamType(StreamKind::kForYou), feedwire::FeedQuery::MANUAL_REFRESH,
+      request_metadata,
       /*consistency_token=*/std::string());
 
   EXPECT_TRUE(request.feed_request()
@@ -144,7 +145,8 @@
   RequestMetadata request_metadata;
   request_metadata.notice_card_acknowledged = false;
   feedwire::Request request = CreateFeedQueryRefreshRequest(
-      kForYouStream, feedwire::FeedQuery::MANUAL_REFRESH, request_metadata,
+      StreamType(StreamKind::kForYou), feedwire::FeedQuery::MANUAL_REFRESH,
+      request_metadata,
       /*consistency_token=*/std::string());
 
   EXPECT_FALSE(request.feed_request()
@@ -165,7 +167,8 @@
   state1.set_explicitly_dismissed_count(1);
   request_metadata.info_card_tracking_states = {state1, state2};
   feedwire::Request request = CreateFeedQueryRefreshRequest(
-      kForYouStream, feedwire::FeedQuery::MANUAL_REFRESH, request_metadata,
+      StreamType(StreamKind::kForYou), feedwire::FeedQuery::MANUAL_REFRESH,
+      request_metadata,
       /*consistency_token=*/std::string());
 
   ASSERT_EQ(2, request.feed_request()
@@ -187,9 +190,10 @@
   request_metadata.autoplay_enabled = true;
 
   feedwire::FeedRequest request =
-      CreateFeedQueryRefreshRequest(
-          kForYouStream, feedwire::FeedQuery::MANUAL_REFRESH, request_metadata,
-          /*consistency_token=*/std::string())
+      CreateFeedQueryRefreshRequest(StreamType(StreamKind::kForYou),
+                                    feedwire::FeedQuery::MANUAL_REFRESH,
+                                    request_metadata,
+                                    /*consistency_token=*/std::string())
           .feed_request();
 
   ASSERT_THAT(request.client_capability(),
@@ -202,7 +206,7 @@
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures({kFeedStamp}, {});
   feedwire::FeedRequest request =
-      CreateFeedQueryRefreshRequest(kForYouStream,
+      CreateFeedQueryRefreshRequest(StreamType(StreamKind::kForYou),
                                     feedwire::FeedQuery::MANUAL_REFRESH,
                                     /*request_metadata=*/{},
                                     /*consistency_token=*/std::string())
@@ -221,7 +225,7 @@
   scoped_feature_list.InitWithFeatures({reading_list::switches::kReadLater},
                                        {});
   feedwire::FeedRequest request =
-      CreateFeedQueryRefreshRequest(kForYouStream,
+      CreateFeedQueryRefreshRequest(StreamType(StreamKind::kForYou),
                                     feedwire::FeedQuery::MANUAL_REFRESH,
                                     /*request_metadata=*/{},
                                     /*consistency_token=*/std::string())
@@ -238,7 +242,7 @@
   scoped_feature_list.InitWithFeatures({},
                                        {reading_list::switches::kReadLater});
   feedwire::FeedRequest request =
-      CreateFeedQueryRefreshRequest(kForYouStream,
+      CreateFeedQueryRefreshRequest(StreamType(StreamKind::kForYou),
                                     feedwire::FeedQuery::MANUAL_REFRESH,
                                     /*request_metadata=*/{},
                                     /*consistency_token=*/std::string())
@@ -255,7 +259,7 @@
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures({kShareCrowButton}, {});
   feedwire::FeedRequest request =
-      CreateFeedQueryRefreshRequest(kForYouStream,
+      CreateFeedQueryRefreshRequest(StreamType(StreamKind::kForYou),
                                     feedwire::FeedQuery::MANUAL_REFRESH,
                                     /*request_metadata=*/{},
                                     /*consistency_token=*/std::string())
@@ -270,7 +274,7 @@
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures({kInfoCardAcknowledgementTracking}, {});
   feedwire::FeedRequest request =
-      CreateFeedQueryRefreshRequest(kForYouStream,
+      CreateFeedQueryRefreshRequest(StreamType(StreamKind::kForYou),
                                     feedwire::FeedQuery::MANUAL_REFRESH,
                                     /*request_metadata=*/{},
                                     /*consistency_token=*/std::string())
@@ -286,9 +290,10 @@
   request_metadata.tab_group_enabled_state = TabGroupEnabledState::kReplaced;
 
   feedwire::FeedRequest request =
-      CreateFeedQueryRefreshRequest(
-          kForYouStream, feedwire::FeedQuery::MANUAL_REFRESH, request_metadata,
-          /*consistency_token=*/std::string())
+      CreateFeedQueryRefreshRequest(StreamType(StreamKind::kForYou),
+                                    feedwire::FeedQuery::MANUAL_REFRESH,
+                                    request_metadata,
+                                    /*consistency_token=*/std::string())
           .feed_request();
 
   ASSERT_THAT(request.client_capability(),
@@ -302,9 +307,10 @@
   request_metadata.tab_group_enabled_state = TabGroupEnabledState::kBoth;
 
   feedwire::FeedRequest request =
-      CreateFeedQueryRefreshRequest(
-          kForYouStream, feedwire::FeedQuery::MANUAL_REFRESH, request_metadata,
-          /*consistency_token=*/std::string())
+      CreateFeedQueryRefreshRequest(StreamType(StreamKind::kForYou),
+                                    feedwire::FeedQuery::MANUAL_REFRESH,
+                                    request_metadata,
+                                    /*consistency_token=*/std::string())
           .feed_request();
 
   ASSERT_THAT(request.client_capability(),
@@ -317,7 +323,7 @@
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures({kFeedVideoInlinePlayback}, {});
   feedwire::FeedRequest request =
-      CreateFeedQueryRefreshRequest(kForYouStream,
+      CreateFeedQueryRefreshRequest(StreamType(StreamKind::kForYou),
                                     feedwire::FeedQuery::MANUAL_REFRESH,
                                     /*request_metadata=*/{},
                                     /*consistency_token=*/std::string())
diff --git a/components/feed/core/v2/public/stream_type.cc b/components/feed/core/v2/public/stream_type.cc
index 8a6000f9..0a64292 100644
--- a/components/feed/core/v2/public/stream_type.cc
+++ b/components/feed/core/v2/public/stream_type.cc
@@ -15,7 +15,7 @@
     case StreamKind::kFollowing:
       return "WebFeed";
     case StreamKind::kChannel:
-      return "Channel";
+      return "Channel_" + web_feed_id_;
   }
 }
 
@@ -23,9 +23,9 @@
 StreamType StreamType::ForTaskId(RefreshTaskId task_id) {
   switch (task_id) {
     case RefreshTaskId::kRefreshForYouFeed:
-      return kForYouStream;
+      return StreamType(StreamKind::kForYou);
     case RefreshTaskId::kRefreshWebFeed:
-      return kWebFeedStream;
+      return StreamType(StreamKind::kFollowing);
   }
 }
 
diff --git a/components/feed/core/v2/public/stream_type.h b/components/feed/core/v2/public/stream_type.h
index 1da1fa9..934b51f 100644
--- a/components/feed/core/v2/public/stream_type.h
+++ b/components/feed/core/v2/public/stream_type.h
@@ -15,16 +15,29 @@
 // Note: currently there are two options, but this leaves room for more
 // parameters.
 class StreamType {
+  // TODO(crbug.com/1369784) rename to StreamID.
  public:
-  constexpr StreamType() = default;
-  constexpr explicit StreamType(StreamKind k) : kind_(k) {}
-  bool operator<(const StreamType& rhs) const { return kind_ < rhs.kind_; }
-  bool operator==(const StreamType& rhs) const { return kind_ == rhs.kind_; }
+  StreamType() = default;
+  virtual ~StreamType() = default;
+  explicit StreamType(StreamKind k, std::string s = "")
+      : kind_(k), web_feed_id_(s) {}
+  bool operator<(const StreamType& rhs) const {
+    if (kind_ == rhs.kind_) {
+      if (kind_ != StreamKind::kChannel)
+        return false;
+      return web_feed_id_.compare(rhs.web_feed_id_) < 0;
+    }
+    return kind_ < rhs.kind_;
+  }
+  bool operator==(const StreamType& rhs) const {
+    return (kind_ == rhs.kind_) && (web_feed_id_ == rhs.web_feed_id_);
+  }
   bool IsForYou() const { return kind_ == StreamKind::kForYou; }
   bool IsWebFeed() const { return kind_ == StreamKind::kFollowing; }
   bool IsChannelFeed() const { return kind_ == StreamKind::kChannel; }
   bool IsValid() const { return kind_ != StreamKind::kUnknown; }
   StreamKind GetType() const { return kind_; }
+  std::string GetWebFeedId() const { return web_feed_id_; }
 
   // Returns a human-readable value, for debugging/DCHECK prints.
   std::string ToString() const;
@@ -37,12 +50,10 @@
 
  private:
   StreamKind kind_ = StreamKind::kUnknown;
+  // Identifies the feed ID in the case that the feed is a ChannelFeed.
+  std::string web_feed_id_;
 };
 
-constexpr StreamType kForYouStream(StreamKind::kForYou);
-constexpr StreamType kWebFeedStream(StreamKind::kFollowing);
-constexpr StreamType kChannelStream(StreamKind::kChannel);
-
 inline std::ostream& operator<<(std::ostream& os,
                                 const StreamType& stream_type) {
   return os << stream_type.ToString();
diff --git a/components/feed/core/v2/public/stream_type_unittest.cc b/components/feed/core/v2/public/stream_type_unittest.cc
new file mode 100644
index 0000000..240ee14
--- /dev/null
+++ b/components/feed/core/v2/public/stream_type_unittest.cc
@@ -0,0 +1,79 @@
+// 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 "components/feed/core/v2/public/stream_type.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace feed {
+
+class StreamTypeTest : public testing::Test {
+ public:
+  StreamTypeTest() = default;
+  StreamTypeTest(StreamTypeTest&) = delete;
+  StreamTypeTest& operator=(const StreamTypeTest&) = delete;
+  ~StreamTypeTest() override = default;
+
+  void SetUp() override { testing::Test::SetUp(); }
+};
+
+TEST_F(StreamTypeTest, ComparatorTest) {
+  StreamType for_you = StreamType(StreamKind::kForYou);
+  StreamType following = StreamType(StreamKind::kFollowing);
+  StreamType channel_a = StreamType(StreamKind::kChannel, "A");
+  StreamType channel_b = StreamType(StreamKind::kChannel, "B");
+  StreamType channel = StreamType(StreamKind::kChannel);
+
+  ASSERT_TRUE(for_you < following);
+  ASSERT_TRUE(following < channel_a);
+  ASSERT_TRUE(channel_a < channel_b);
+  ASSERT_TRUE(for_you < channel_b);
+  ASSERT_TRUE(channel_b == channel_b);
+  ASSERT_FALSE(channel_a < channel);
+  ASSERT_FALSE(channel < for_you);
+  ASSERT_FALSE(for_you < for_you);
+  ASSERT_FALSE(channel_b < channel_b);
+}
+
+TEST_F(StreamTypeTest, IdentityTest) {
+  StreamType for_you = StreamType(StreamKind::kForYou);
+  StreamType following = StreamType(StreamKind::kFollowing);
+  StreamType channel = StreamType(StreamKind::kChannel);
+  StreamType unknown = StreamType();
+
+  ASSERT_TRUE(for_you.IsForYou());
+  ASSERT_FALSE(for_you.IsWebFeed());
+  ASSERT_FALSE(for_you.IsChannelFeed());
+  ASSERT_TRUE(for_you.IsValid());
+
+  ASSERT_FALSE(following.IsForYou());
+  ASSERT_TRUE(following.IsWebFeed());
+  ASSERT_FALSE(following.IsChannelFeed());
+  ASSERT_TRUE(following.IsValid());
+
+  ASSERT_FALSE(channel.IsForYou());
+  ASSERT_FALSE(channel.IsWebFeed());
+  ASSERT_TRUE(channel.IsChannelFeed());
+  ASSERT_TRUE(channel.IsValid());
+
+  ASSERT_FALSE(unknown.IsForYou());
+  ASSERT_FALSE(unknown.IsWebFeed());
+  ASSERT_FALSE(unknown.IsChannelFeed());
+  ASSERT_FALSE(unknown.IsValid());
+}
+
+TEST_F(StreamTypeTest, StringTest) {
+  StreamType for_you = StreamType(StreamKind::kForYou);
+  StreamType following = StreamType(StreamKind::kFollowing);
+  StreamType channel = StreamType(StreamKind::kChannel);
+  StreamType channel_a = StreamType(StreamKind::kChannel, "A");
+  StreamType unknown = StreamType();
+
+  ASSERT_EQ(for_you.ToString(), "ForYou");
+  ASSERT_EQ(following.ToString(), "WebFeed");
+  ASSERT_EQ(channel.ToString(), "Channel_");
+  ASSERT_EQ(channel_a.ToString(), "Channel_A");
+  ASSERT_EQ(unknown.ToString(), "Unknown");
+}
+}  // namespace feed
diff --git a/components/feed/core/v2/scheduling.cc b/components/feed/core/v2/scheduling.cc
index d5e2ff16..b3340c50 100644
--- a/components/feed/core/v2/scheduling.cc
+++ b/components/feed/core/v2/scheduling.cc
@@ -137,7 +137,7 @@
   base::TimeDelta content_expiration_threshold =
       GetFeedConfig().content_expiration_threshold;
   if (base::FeatureList::IsEnabled(kWebFeedOnboarding) &&
-      !is_web_feed_subscriber && stream_type == kWebFeedStream) {
+      !is_web_feed_subscriber && stream_type.IsWebFeed()) {
     content_expiration_threshold =
         GetFeedConfig().subscriptionless_content_expiration_threshold;
   }
diff --git a/components/feed/core/v2/scheduling_unittest.cc b/components/feed/core/v2/scheduling_unittest.cc
index 7cbf9c1..3916178 100644
--- a/components/feed/core/v2/scheduling_unittest.cc
+++ b/components/feed/core/v2/scheduling_unittest.cc
@@ -154,13 +154,15 @@
 
     metadata_ = feedstore::Metadata();
     feedstore::Metadata::StreamMetadata* sm = metadata_.add_stream_metadata();
-    sm->set_stream_id(std::string(feedstore::StreamId(kForYouStream)));
+    sm->set_stream_key(
+        std::string(feedstore::StreamKey(StreamType(StreamKind::kForYou))));
   }
 
  protected:
   void set_content_lifetime(int64_t stale_age_ms, int64_t invalid_age_ms) {
     feedstore::Metadata::StreamMetadata::ContentLifetime* content_lifetime =
-        MetadataForStream(metadata_, kForYouStream).mutable_content_lifetime();
+        MetadataForStream(metadata_, StreamType(StreamKind::kForYou))
+            .mutable_content_lifetime();
     content_lifetime->set_stale_age_ms(stale_age_ms);
     content_lifetime->set_invalid_age_ms(invalid_age_ms);
   }
@@ -181,32 +183,36 @@
 };
 
 TEST_F(ContentLifetimeTest, ShouldWaitForNewContent_DefaultThreshold) {
-  EXPECT_FALSE(ShouldWaitForNewContent(metadata_, kForYouStream,
-                                       kDefaultStaleContentThreshold,
-                                       /*is_web_feed_subscriber=*/true));
+  EXPECT_FALSE(ShouldWaitForNewContent(
+      metadata_, StreamType(StreamKind::kForYou), kDefaultStaleContentThreshold,
+      /*is_web_feed_subscriber=*/true));
   EXPECT_TRUE(ShouldWaitForNewContent(
-      metadata_, kForYouStream, WithEpsilon(kDefaultStaleContentThreshold),
-      true));
-  EXPECT_TRUE(ShouldWaitForNewContent(metadata_, kForYouStream, base::Hours(5),
-                                      /*is_web_feed_subscriber=*/true));
-  EXPECT_FALSE(ShouldWaitForNewContent(metadata_, kForYouStream, base::Hours(3),
-                                       /*is_web_feed_subscriber=*/true));
+      metadata_, StreamType(StreamKind::kForYou),
+      WithEpsilon(kDefaultStaleContentThreshold), true));
+  EXPECT_TRUE(ShouldWaitForNewContent(
+      metadata_, StreamType(StreamKind::kForYou), base::Hours(5),
+      /*is_web_feed_subscriber=*/true));
+  EXPECT_FALSE(ShouldWaitForNewContent(
+      metadata_, StreamType(StreamKind::kForYou), base::Hours(3),
+      /*is_web_feed_subscriber=*/true));
   // If the web feed onboarding feature is turned off, then we should return
   // true even if the user is not subscribed.
-  EXPECT_TRUE(ShouldWaitForNewContent(metadata_, kForYouStream, base::Days(8),
-                                      /*is_web_feed_subscriber=*/false));
-  EXPECT_TRUE(ShouldWaitForNewContent(metadata_, kForYouStream, base::Days(6),
-                                      /*is_web_feed_subscriber=*/false));
+  EXPECT_TRUE(ShouldWaitForNewContent(
+      metadata_, StreamType(StreamKind::kForYou), base::Days(8),
+      /*is_web_feed_subscriber=*/false));
+  EXPECT_TRUE(ShouldWaitForNewContent(
+      metadata_, StreamType(StreamKind::kForYou), base::Days(6),
+      /*is_web_feed_subscriber=*/false));
 }
 
 TEST_F(ContentLifetimeTest, ShouldWaitForNewContent_ServerThreshold_Valid) {
   set_stale_age(base::Minutes(60));
-  EXPECT_TRUE(ShouldWaitForNewContent(metadata_, kForYouStream,
-                                      base::Minutes(61),
-                                      /*is_web_feed_subscriber=*/true));
-  EXPECT_FALSE(ShouldWaitForNewContent(metadata_, kForYouStream,
-                                       base::Minutes(59),
-                                       /*is_web_feed_subscriber=*/true));
+  EXPECT_TRUE(ShouldWaitForNewContent(
+      metadata_, StreamType(StreamKind::kForYou), base::Minutes(61),
+      /*is_web_feed_subscriber=*/true));
+  EXPECT_FALSE(ShouldWaitForNewContent(
+      metadata_, StreamType(StreamKind::kForYou), base::Minutes(59),
+      /*is_web_feed_subscriber=*/true));
 }
 
 TEST_F(ContentLifetimeTest, ShouldWaitForNewContent_WithNoSubscriptions) {
@@ -215,90 +221,97 @@
   std::vector<base::Feature> enabled_features = {kWebFeedOnboarding},
                              disabled_features = {};
   features.InitWithFeatures(enabled_features, disabled_features);
-  EXPECT_FALSE(ShouldWaitForNewContent(metadata_, kWebFeedStream, base::Days(6),
-                                       /*is_web_feed_subscriber=*/false));
-  EXPECT_TRUE(ShouldWaitForNewContent(metadata_, kWebFeedStream, base::Days(8),
-                                      /*is_web_feed_subscriber=*/false));
+  EXPECT_FALSE(ShouldWaitForNewContent(
+      metadata_, StreamType(StreamKind::kFollowing), base::Days(6),
+      /*is_web_feed_subscriber=*/false));
+  EXPECT_TRUE(ShouldWaitForNewContent(
+      metadata_, StreamType(StreamKind::kFollowing), base::Days(8),
+      /*is_web_feed_subscriber=*/false));
 }
 
 TEST_F(ContentLifetimeTest, ShouldWaitForNewContent_ServerThreshold_Invalid) {
   // We ignore stale ages greater than the default.
   EXPECT_TRUE(ShouldWaitForNewContent(
-      metadata_, kForYouStream, WithEpsilon(kDefaultStaleContentThreshold),
-      true));
+      metadata_, StreamType(StreamKind::kForYou),
+      WithEpsilon(kDefaultStaleContentThreshold), true));
   set_stale_age(kDefaultStaleContentThreshold + base::Minutes(1));
-  EXPECT_TRUE(ShouldWaitForNewContent(
-      metadata_, kForYouStream, WithEpsilon(kDefaultStaleContentThreshold),
-      /*is_web_feed_subscriber=*/true));
+  EXPECT_TRUE(
+      ShouldWaitForNewContent(metadata_, StreamType(StreamKind::kForYou),
+                              WithEpsilon(kDefaultStaleContentThreshold),
+                              /*is_web_feed_subscriber=*/true));
 
   // We ignore zero durations.
   set_stale_age(base::Days(0));
-  EXPECT_FALSE(ShouldWaitForNewContent(metadata_, kForYouStream,
-                                       kDefaultStaleContentThreshold,
-                                       /*is_web_feed_subscriber=*/true));
+  EXPECT_FALSE(ShouldWaitForNewContent(
+      metadata_, StreamType(StreamKind::kForYou), kDefaultStaleContentThreshold,
+      /*is_web_feed_subscriber=*/true));
   EXPECT_TRUE(ShouldWaitForNewContent(
-      metadata_, kForYouStream, WithEpsilon(kDefaultStaleContentThreshold),
-      true));
+      metadata_, StreamType(StreamKind::kForYou),
+      WithEpsilon(kDefaultStaleContentThreshold), true));
 
   // We ignore negative durations.
   set_stale_age(base::Days(-1));
-  EXPECT_FALSE(ShouldWaitForNewContent(metadata_, kForYouStream,
-                                       kDefaultStaleContentThreshold,
-                                       /*is_web_feed_subscriber=*/true));
-  EXPECT_TRUE(ShouldWaitForNewContent(
-      metadata_, kForYouStream, WithEpsilon(kDefaultStaleContentThreshold),
+  EXPECT_FALSE(ShouldWaitForNewContent(
+      metadata_, StreamType(StreamKind::kForYou), kDefaultStaleContentThreshold,
       /*is_web_feed_subscriber=*/true));
+  EXPECT_TRUE(
+      ShouldWaitForNewContent(metadata_, StreamType(StreamKind::kForYou),
+                              WithEpsilon(kDefaultStaleContentThreshold),
+                              /*is_web_feed_subscriber=*/true));
 }
 
 TEST_F(ContentLifetimeTest, ContentInvalidFromAge_DefaultThreshold) {
-  EXPECT_FALSE(ContentInvalidFromAge(metadata_, kForYouStream,
+  EXPECT_FALSE(ContentInvalidFromAge(metadata_, StreamType(StreamKind::kForYou),
                                      kDefaultContentExpiration,
                                      /*is_web_feed_subscriber=*/true));
   EXPECT_TRUE(
-      ContentInvalidFromAge(metadata_, kForYouStream,
+      ContentInvalidFromAge(metadata_, StreamType(StreamKind::kForYou),
                             kDefaultContentExpiration + base::Milliseconds(1),
                             /*is_web_feed_subscriber=*/true));
-  EXPECT_TRUE(ContentInvalidFromAge(metadata_, kForYouStream, base::Hours(25),
+  EXPECT_TRUE(ContentInvalidFromAge(metadata_, StreamType(StreamKind::kForYou),
+                                    base::Hours(25),
                                     /*is_web_feed_subscriber=*/true));
-  EXPECT_FALSE(ContentInvalidFromAge(metadata_, kForYouStream, base::Hours(23),
+  EXPECT_FALSE(ContentInvalidFromAge(metadata_, StreamType(StreamKind::kForYou),
+                                     base::Hours(23),
                                      /*is_web_feed_subscriber=*/true));
 }
 
 TEST_F(ContentLifetimeTest, ContentInvalidFromAge_ServerThreshold_Valid) {
   set_invalid_age(base::Minutes(60));
-  EXPECT_TRUE(ContentInvalidFromAge(metadata_, kForYouStream, base::Minutes(61),
+  EXPECT_TRUE(ContentInvalidFromAge(metadata_, StreamType(StreamKind::kForYou),
+                                    base::Minutes(61),
                                     /*is_web_feed_subscriber=*/true));
-  EXPECT_FALSE(ContentInvalidFromAge(metadata_, kForYouStream,
+  EXPECT_FALSE(ContentInvalidFromAge(metadata_, StreamType(StreamKind::kForYou),
                                      base::Minutes(59),
                                      /*is_web_feed_subscriber=*/true));
 }
 
 TEST_F(ContentLifetimeTest, ContentInvalidFromAge_ServerThreshold_Invalid) {
   // We ignore stale ages greater than the default.
-  EXPECT_TRUE(ContentInvalidFromAge(metadata_, kForYouStream,
+  EXPECT_TRUE(ContentInvalidFromAge(metadata_, StreamType(StreamKind::kForYou),
                                     WithEpsilon(kDefaultContentExpiration),
                                     /*is_web_feed_subscriber=*/true));
   set_invalid_age(kDefaultContentExpiration + base::Minutes(1));
-  EXPECT_TRUE(ContentInvalidFromAge(metadata_, kForYouStream,
+  EXPECT_TRUE(ContentInvalidFromAge(metadata_, StreamType(StreamKind::kForYou),
                                     WithEpsilon(kDefaultContentExpiration),
                                     /*is_web_feed_subscriber=*/true));
 
   // We ignore zero durations.
   set_invalid_age(base::Days(0));
-  EXPECT_FALSE(ContentInvalidFromAge(metadata_, kForYouStream,
+  EXPECT_FALSE(ContentInvalidFromAge(metadata_, StreamType(StreamKind::kForYou),
                                      kDefaultContentExpiration,
                                      /*is_web_feed_subscriber=*/true));
   EXPECT_TRUE(ContentInvalidFromAge(
-      metadata_, kForYouStream,
+      metadata_, StreamType(StreamKind::kForYou),
       WithEpsilon(kDefaultSubscriptionlessContentExpiration),
       /*is_web_feed_subscriber=*/true));
 
   // We ignore negative durations.
   set_invalid_age(base::Days(-1));
-  EXPECT_FALSE(ContentInvalidFromAge(metadata_, kForYouStream,
+  EXPECT_FALSE(ContentInvalidFromAge(metadata_, StreamType(StreamKind::kForYou),
                                      kDefaultContentExpiration,
                                      /*is_web_feed_subscriber=*/true));
-  EXPECT_TRUE(ContentInvalidFromAge(metadata_, kForYouStream,
+  EXPECT_TRUE(ContentInvalidFromAge(metadata_, StreamType(StreamKind::kForYou),
                                     WithEpsilon(kDefaultContentExpiration),
                                     /*is_web_feed_subscriber=*/true));
 }
@@ -309,18 +322,21 @@
   std::vector<base::Feature> enabled_features = {kWebFeedOnboarding},
                              disabled_features = {};
   features.InitWithFeatures(enabled_features, disabled_features);
-  EXPECT_FALSE(ContentInvalidFromAge(metadata_, kWebFeedStream,
+  EXPECT_FALSE(ContentInvalidFromAge(metadata_,
+                                     StreamType(StreamKind::kFollowing),
                                      kDefaultSubscriptionlessContentExpiration,
                                      /*is_web_feed_subscriber=*/false));
   EXPECT_TRUE(ContentInvalidFromAge(
-      metadata_, kWebFeedStream,
+      metadata_, StreamType(StreamKind::kFollowing),
       kDefaultSubscriptionlessContentExpiration + base::Milliseconds(1),
       /*is_web_feed_subscriber=*/false));
 
-  EXPECT_FALSE(ContentInvalidFromAge(metadata_, kWebFeedStream, base::Days(13),
-                                     /*is_web_feed_subscriber=*/false));
-  EXPECT_TRUE(ContentInvalidFromAge(metadata_, kWebFeedStream, base::Days(15),
-                                    /*is_web_feed_subscriber=*/false));
+  EXPECT_FALSE(ContentInvalidFromAge(
+      metadata_, StreamType(StreamKind::kFollowing), base::Days(13),
+      /*is_web_feed_subscriber=*/false));
+  EXPECT_TRUE(ContentInvalidFromAge(
+      metadata_, StreamType(StreamKind::kFollowing), base::Days(15),
+      /*is_web_feed_subscriber=*/false));
 }
 
 }  // namespace
diff --git a/components/feed/core/v2/tasks/prefetch_images_task.cc b/components/feed/core/v2/tasks/prefetch_images_task.cc
index a87ecce8..2a3d93a8 100644
--- a/components/feed/core/v2/tasks/prefetch_images_task.cc
+++ b/components/feed/core/v2/tasks/prefetch_images_task.cc
@@ -45,15 +45,16 @@
     TaskComplete();
     return;
   }
-  if (stream_.GetModel(kForYouStream)) {
-    PrefetchImagesFromModel(*stream_.GetModel(kForYouStream));
+  StreamType for_you_stream = StreamType(StreamKind::kForYou);
+  if (stream_.GetModel(for_you_stream)) {
+    PrefetchImagesFromModel(*stream_.GetModel(for_you_stream));
     return;
   }
 
   // Web feed subscriber is set to true so we don't use the less restrictive
   // staleness number for when there are no subscriptions.
   load_from_store_task_ = std::make_unique<LoadStreamFromStoreTask>(
-      LoadStreamFromStoreTask::LoadType::kFullLoad, &stream_, kForYouStream,
+      LoadStreamFromStoreTask::LoadType::kFullLoad, &stream_, for_you_stream,
       &stream_.GetStore(),
       /*missed_last_refresh=*/false,
       /*is_web_feed_subscriber=*/true,
diff --git a/components/feed/core/v2/web_feed_subscription_coordinator.cc b/components/feed/core/v2/web_feed_subscription_coordinator.cc
index d709d9a..0770071 100644
--- a/components/feed/core/v2/web_feed_subscription_coordinator.cc
+++ b/components/feed/core/v2/web_feed_subscription_coordinator.cc
@@ -290,7 +290,7 @@
 
   if (result.request_status == WebFeedSubscriptionRequestStatus::kSuccess) {
     model_->OnSubscribed(result.web_feed_info);
-    feed_stream_->SetStreamStale(kWebFeedStream, true);
+    feed_stream_->SetStreamStale(StreamType(StreamKind::kFollowing), true);
   }
 
   SubscriptionsChanged();
@@ -363,7 +363,7 @@
     UnsubscribeFromWebFeedTask::Result result) {
   if (!result.unsubscribed_feed_name.empty()) {
     model_->OnUnsubscribed(result.unsubscribed_feed_name);
-    feed_stream_->SetStreamStale(kWebFeedStream, true);
+    feed_stream_->SetStreamStale(StreamType(StreamKind::kFollowing), true);
   }
 
   WebFeedInFlightChange change = DequeueInflightChange();
diff --git a/components/invalidation/impl/invalidator_registrar_with_memory.h b/components/invalidation/impl/invalidator_registrar_with_memory.h
index aaeb68a..a9a13583 100644
--- a/components/invalidation/impl/invalidator_registrar_with_memory.h
+++ b/components/invalidation/impl/invalidator_registrar_with_memory.h
@@ -9,6 +9,7 @@
 #include <set>
 #include <string>
 
+#include "base/feature_list.h"
 #include "base/memory/raw_ptr.h"
 #include "base/observer_list.h"
 #include "base/sequence_checker.h"
@@ -25,6 +26,8 @@
 
 namespace invalidation {
 
+BASE_DECLARE_FEATURE(kRestoreInterestingTopicsFeature);
+
 // A helper class for FCMInvalidationService.  It helps keep track of registered
 // handlers and which topic registrations are associated with each handler.
 class INVALIDATION_EXPORT InvalidatorRegistrarWithMemory {
diff --git a/components/invalidation/impl/invalidator_registrar_with_memory_unittest.cc b/components/invalidation/impl/invalidator_registrar_with_memory_unittest.cc
index 986a386..8b13b3a 100644
--- a/components/invalidation/impl/invalidator_registrar_with_memory_unittest.cc
+++ b/components/invalidation/impl/invalidator_registrar_with_memory_unittest.cc
@@ -263,10 +263,8 @@
 }
 
 TEST(InvalidatorRegistrarWithMemoryTest, RestoresInterestingTopics) {
-  const base::Feature restore_interesting_topics_feature{
-      "InvalidatorRestoreInterestingTopics", base::FEATURE_ENABLED_BY_DEFAULT};
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(restore_interesting_topics_feature);
+  feature_list.InitAndEnableFeature(kRestoreInterestingTopicsFeature);
 
   TestingPrefServiceSimple pref_service;
   InvalidatorRegistrarWithMemory::RegisterProfilePrefs(pref_service.registry());
diff --git a/components/metrics/call_stack_profile_metrics_provider.cc b/components/metrics/call_stack_profile_metrics_provider.cc
index b88ed554..120a2e96 100644
--- a/components/metrics/call_stack_profile_metrics_provider.cc
+++ b/components/metrics/call_stack_profile_metrics_provider.cc
@@ -229,9 +229,9 @@
 
 // CallStackProfileMetricsProvider --------------------------------------------
 
-const base::Feature
-    CallStackProfileMetricsProvider::kSamplingProfilerReporting = {
-        "SamplingProfilerReporting", base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kSamplingProfilerReporting,
+             "SamplingProfilerReporting",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 CallStackProfileMetricsProvider::CallStackProfileMetricsProvider() = default;
 CallStackProfileMetricsProvider::~CallStackProfileMetricsProvider() = default;
diff --git a/components/metrics/call_stack_profile_metrics_provider.h b/components/metrics/call_stack_profile_metrics_provider.h
index fab36c7b..cf3318d9 100644
--- a/components/metrics/call_stack_profile_metrics_provider.h
+++ b/components/metrics/call_stack_profile_metrics_provider.h
@@ -17,6 +17,9 @@
 
 class ChromeUserMetricsExtension;
 
+// base::Feature for reporting CPU profiles. Provided here for test use.
+BASE_DECLARE_FEATURE(kSamplingProfilerReporting);
+
 // Performs metrics logging for the stack sampling profiler.
 class CallStackProfileMetricsProvider : public MetricsProvider {
  public:
@@ -61,9 +64,6 @@
       ChromeUserMetricsExtension* uma_proto) override;
 
  protected:
-  // base::Feature for reporting CPU profiles. Provided here for test use.
-  static const base::Feature kSamplingProfilerReporting;
-
   // Reset the static state to the defaults after startup.
   static void ResetStaticStateForTesting();
 };
diff --git a/components/metrics/call_stack_profile_metrics_provider_unittest.cc b/components/metrics/call_stack_profile_metrics_provider_unittest.cc
index 97fab88..190953a 100644
--- a/components/metrics/call_stack_profile_metrics_provider_unittest.cc
+++ b/components/metrics/call_stack_profile_metrics_provider_unittest.cc
@@ -19,8 +19,7 @@
  public:
   CallStackProfileMetricsProviderTest() {
     TestState::ResetStaticStateForTesting();
-    scoped_feature_list_.InitAndEnableFeature(
-        TestState::kSamplingProfilerReporting);
+    scoped_feature_list_.InitAndEnableFeature(kSamplingProfilerReporting);
   }
 
   CallStackProfileMetricsProviderTest(
@@ -32,7 +31,6 @@
   // Exposes the feature from the CallStackProfileMetricsProvider.
   class TestState : public CallStackProfileMetricsProvider {
    public:
-    using CallStackProfileMetricsProvider::kSamplingProfilerReporting;
     using CallStackProfileMetricsProvider::ResetStaticStateForTesting;
   };
 
@@ -260,8 +258,7 @@
 // Finch is disabled.
 TEST_F(CallStackProfileMetricsProviderTest, CpuProfileNotProvidedWithoutFinch) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndDisableFeature(
-      TestState::kSamplingProfilerReporting);
+  scoped_feature_list.InitAndDisableFeature(kSamplingProfilerReporting);
   CallStackProfileMetricsProvider provider;
   base::TimeTicks profile_start_time = base::TimeTicks::Now();
 
diff --git a/components/metrics/demographics/demographic_metrics_provider.cc b/components/metrics/demographics/demographic_metrics_provider.cc
index 8c83168..4d57314 100644
--- a/components/metrics/demographics/demographic_metrics_provider.cc
+++ b/components/metrics/demographics/demographic_metrics_provider.cc
@@ -35,8 +35,9 @@
 }  // namespace
 
 // static
-const base::Feature DemographicMetricsProvider::kDemographicMetricsReporting = {
-    "DemographicMetricsReporting", base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kDemographicMetricsReporting,
+             "DemographicMetricsReporting",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 DemographicMetricsProvider::DemographicMetricsProvider(
     std::unique_ptr<ProfileClient> profile_client,
diff --git a/components/metrics/demographics/demographic_metrics_provider.h b/components/metrics/demographics/demographic_metrics_provider.h
index 5370fe5e4..3e9cb96 100644
--- a/components/metrics/demographics/demographic_metrics_provider.h
+++ b/components/metrics/demographics/demographic_metrics_provider.h
@@ -25,6 +25,9 @@
 
 namespace metrics {
 
+// Feature switch to report user's noised birth year and gender.
+BASE_DECLARE_FEATURE(kDemographicMetricsReporting);
+
 // Provider of the synced user’s noised birth year and gender to the UMA metrics
 // server. The synced user's birth year and gender were provided to Google when
 // the user created their Google account, to use in accordance with Google's
@@ -96,9 +99,6 @@
   void ProvideSyncedUserNoisedBirthYearAndGenderToReport(
       ukm::Report* report) override;
 
-  // Feature switch to report user's noised birth year and gender.
-  static const base::Feature kDemographicMetricsReporting;
-
  private:
   // Provides the synced user's noised birth year and gender.
   absl::optional<UserDemographics> ProvideSyncedUserNoisedBirthYearAndGender();
diff --git a/components/metrics/demographics/demographic_metrics_provider_unittest.cc b/components/metrics/demographics/demographic_metrics_provider_unittest.cc
index c36c1b6c..fb445e0 100644
--- a/components/metrics/demographics/demographic_metrics_provider_unittest.cc
+++ b/components/metrics/demographics/demographic_metrics_provider_unittest.cc
@@ -250,8 +250,7 @@
      ProvideSyncedUserNoisedBirthYearAndGender_FeatureDisabled) {
   // Disable demographics reporting feature.
   base::test::ScopedFeatureList local_feature;
-  local_feature.InitAndDisableFeature(
-      DemographicMetricsProvider::kDemographicMetricsReporting);
+  local_feature.InitAndDisableFeature(kDemographicMetricsReporting);
 
   base::HistogramTester histogram;
 
diff --git a/components/metrics/unsent_log_store_metrics.cc b/components/metrics/unsent_log_store_metrics.cc
index d1ecc95..6948479 100644
--- a/components/metrics/unsent_log_store_metrics.cc
+++ b/components/metrics/unsent_log_store_metrics.cc
@@ -7,8 +7,9 @@
 namespace metrics {
 
 // static
-const base::Feature UnsentLogStoreMetrics::kRecordLastUnsentLogMetadataMetrics =
-    {"RecordLastUnsentLogMetadataMetrics", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kRecordLastUnsentLogMetadataMetrics,
+             "RecordLastUnsentLogMetadataMetrics",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 UnsentLogStoreMetrics::UnsentLogStoreMetrics() = default;
 UnsentLogStoreMetrics::~UnsentLogStoreMetrics() = default;
diff --git a/components/metrics/unsent_log_store_metrics.h b/components/metrics/unsent_log_store_metrics.h
index 7a4b334..052a6ca 100644
--- a/components/metrics/unsent_log_store_metrics.h
+++ b/components/metrics/unsent_log_store_metrics.h
@@ -10,6 +10,10 @@
 
 namespace metrics {
 
+// The feature to record the unsent log info metrics, refer to
+// UnsentLogStoreMetricsImpl::RecordLastUnsentLogMetadataMetrics.
+BASE_DECLARE_FEATURE(kRecordLastUnsentLogMetadataMetrics);
+
 // Interface for recording metrics from UnsentLogStore.
 class UnsentLogStoreMetrics {
  public:
@@ -50,10 +54,6 @@
   virtual void RecordLastUnsentLogMetadataMetrics(int unsent_samples_count,
                                                   int sent_samples_count,
                                                   int persisted_size_in_kb);
-
-  // The feature to record the unsent log info metrics, refer to
-  // UnsentLogStoreMetricsImpl::RecordLastUnsentLogMetadataMetrics.
-  static const base::Feature kRecordLastUnsentLogMetadataMetrics;
 };
 
 }  // namespace metrics
diff --git a/components/metrics/unsent_log_store_metrics_impl_unittest.cc b/components/metrics/unsent_log_store_metrics_impl_unittest.cc
index d6fd6b0..463382fb 100644
--- a/components/metrics/unsent_log_store_metrics_impl_unittest.cc
+++ b/components/metrics/unsent_log_store_metrics_impl_unittest.cc
@@ -28,8 +28,7 @@
 
 TEST(UnsentLogStoreMetricsImplTest, RecordLastUnsentLogMetadataMetrics) {
   base::test::ScopedFeatureList feature_override;
-  feature_override.InitAndEnableFeature(
-      UnsentLogStoreMetrics::kRecordLastUnsentLogMetadataMetrics);
+  feature_override.InitAndEnableFeature(kRecordLastUnsentLogMetadataMetrics);
   UnsentLogStoreMetricsImpl impl;
   base::HistogramTester histogram_tester;
 
@@ -58,8 +57,7 @@
 
 TEST(UnsentLogStoreMetricsImplTest, BothUnsentAndSentZeroSample) {
   base::test::ScopedFeatureList feature_override;
-  feature_override.InitAndEnableFeature(
-      UnsentLogStoreMetrics::kRecordLastUnsentLogMetadataMetrics);
+  feature_override.InitAndEnableFeature(kRecordLastUnsentLogMetadataMetrics);
   UnsentLogStoreMetricsImpl impl;
   base::HistogramTester histogram_tester;
 
@@ -71,8 +69,7 @@
 
 TEST(UnsentLogStoreMetricsImplTest, ZeroUnsentSample) {
   base::test::ScopedFeatureList feature_override;
-  feature_override.InitAndEnableFeature(
-      UnsentLogStoreMetrics::kRecordLastUnsentLogMetadataMetrics);
+  feature_override.InitAndEnableFeature(kRecordLastUnsentLogMetadataMetrics);
   UnsentLogStoreMetricsImpl impl;
   base::HistogramTester histogram_tester;
 
@@ -84,8 +81,7 @@
 
 TEST(UnsentLogStoreMetricsImplTest, ZeroSentSample) {
   base::test::ScopedFeatureList feature_override;
-  feature_override.InitAndEnableFeature(
-      UnsentLogStoreMetrics::kRecordLastUnsentLogMetadataMetrics);
+  feature_override.InitAndEnableFeature(kRecordLastUnsentLogMetadataMetrics);
   UnsentLogStoreMetricsImpl impl;
   base::HistogramTester histogram_tester;
 
diff --git a/components/navigation_interception/intercept_navigation_throttle.cc b/components/navigation_interception/intercept_navigation_throttle.cc
index 0155935..090f943 100644
--- a/components/navigation_interception/intercept_navigation_throttle.cc
+++ b/components/navigation_interception/intercept_navigation_throttle.cc
@@ -12,8 +12,9 @@
 namespace navigation_interception {
 
 // Note: this feature is a no-op on non-Android platforms.
-const base::Feature InterceptNavigationThrottle::kAsyncCheck{
-    "AsyncNavigationIntercept", base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kAsyncCheck,
+             "AsyncNavigationIntercept",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 InterceptNavigationThrottle::InterceptNavigationThrottle(
     content::NavigationHandle* navigation_handle,
diff --git a/components/navigation_interception/intercept_navigation_throttle.h b/components/navigation_interception/intercept_navigation_throttle.h
index 1d6cf1c..dfb930c 100644
--- a/components/navigation_interception/intercept_navigation_throttle.h
+++ b/components/navigation_interception/intercept_navigation_throttle.h
@@ -18,6 +18,8 @@
 
 namespace navigation_interception {
 
+BASE_DECLARE_FEATURE(kAsyncCheck);
+
 enum class SynchronyMode {
   // Support async interception in some cases (See ShouldCheckAsynchronously).
   kAsync,
@@ -33,8 +35,6 @@
       content::NavigationHandle* /* navigation_handle */)>
       CheckCallback;
 
-  static const base::Feature kAsyncCheck;
-
   InterceptNavigationThrottle(content::NavigationHandle* navigation_handle,
                               CheckCallback should_ignore_callback,
                               SynchronyMode async_mode);
diff --git a/components/navigation_interception/intercept_navigation_throttle_unittest.cc b/components/navigation_interception/intercept_navigation_throttle_unittest.cc
index 166cf6ce..aa2719e5 100644
--- a/components/navigation_interception/intercept_navigation_throttle_unittest.cc
+++ b/components/navigation_interception/intercept_navigation_throttle_unittest.cc
@@ -68,11 +68,9 @@
   InterceptNavigationThrottleTest()
       : mock_callback_receiver_(new MockInterceptCallbackReceiver()) {
     if (GetParam()) {
-      scoped_feature_.InitAndEnableFeature(
-          InterceptNavigationThrottle::kAsyncCheck);
+      scoped_feature_.InitAndEnableFeature(kAsyncCheck);
     } else {
-      scoped_feature_.InitAndDisableFeature(
-          InterceptNavigationThrottle::kAsyncCheck);
+      scoped_feature_.InitAndDisableFeature(kAsyncCheck);
     }
   }
 
diff --git a/components/password_manager/core/browser/sync/password_proto_utils.cc b/components/password_manager/core/browser/sync/password_proto_utils.cc
index 98c8423..b9b1c0e4 100644
--- a/components/password_manager/core/browser/sync/password_proto_utils.cc
+++ b/components/password_manager/core/browser/sync/password_proto_utils.cc
@@ -5,8 +5,11 @@
 #include "components/password_manager/core/browser/sync/password_proto_utils.h"
 
 #include "base/containers/flat_map.h"
+#include "base/feature_list.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/password_manager/core/browser/password_form.h"
+#include "components/password_manager/core/common/password_manager_features.h"
+#include "components/sync/base/features.h"
 #include "components/sync/protocol/password_specifics.pb.h"
 
 using autofill::FormData;
@@ -256,8 +259,13 @@
           : password_form.federation_origin.Serialize());
   *password_data.mutable_password_issues() =
       PasswordIssuesMapToProto(password_form.password_issues);
-  *password_data.mutable_notes() =
-      PasswordNotesToProto(password_form.notes, base_password_data.notes());
+  // TODO(crbug.com/1369638): Force downloading all passwords from the sync
+  // server when the feature is enabled in order to avoid local copy missing
+  // notes overriding the server copy.
+  if (base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)) {
+    *password_data.mutable_notes() =
+        PasswordNotesToProto(password_form.notes, base_password_data.notes());
+  }
   return password_data;
 }
 
@@ -296,7 +304,9 @@
   password.federation_origin =
       url::Origin::Create(GURL(password_data.federation_url()));
   password.password_issues = PasswordIssuesMapFromProto(password_data);
-  password.notes = PasswordNotesFromProto(password_data.notes());
+  if (base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)) {
+    password.notes = PasswordNotesFromProto(password_data.notes());
+  }
   return password;
 }
 
diff --git a/components/password_manager/core/browser/sync/password_proto_utils_unittest.cc b/components/password_manager/core/browser/sync/password_proto_utils_unittest.cc
index 5782fb2..b6c6deff 100644
--- a/components/password_manager/core/browser/sync/password_proto_utils_unittest.cc
+++ b/components/password_manager/core/browser/sync/password_proto_utils_unittest.cc
@@ -4,8 +4,12 @@
 
 #include "components/password_manager/core/browser/sync/password_proto_utils.h"
 
+#include "base/feature_list.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_feature_list.h"
 #include "components/password_manager/core/browser/password_form.h"
+#include "components/password_manager/core/common/password_manager_features.h"
+#include "components/sync/base/features.h"
 #include "components/sync/protocol/password_specifics.pb.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -76,9 +80,11 @@
   password_specifics.set_federation_url(std::string());
   *password_specifics.mutable_password_issues() =
       CreateSpecificsDataIssues(issue_types);
-  // The current code always populates notes for outgoing protos even when
-  // non-exists.
-  password_specifics.mutable_notes();
+  if (base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)) {
+    // The current code always populates notes for outgoing protos even when
+    // non-exists.
+    password_specifics.mutable_notes();
+  }
   return password_specifics;
 }
 
@@ -176,17 +182,28 @@
 }
 
 TEST(PasswordProtoUtilsTest, ConvertSpecificsToFormAndBack) {
-  sync_pb::PasswordSpecifics specifics;
-  *specifics.mutable_client_only_encrypted_data() =
-      CreateSpecificsData("http://www.origin.com/", "username_element",
-                          "username_value", "password_element", "signon_realm",
-                          /*issue_types=*/{});
+  for (bool is_notes_enabled : {false, true}) {
+    base::test::ScopedFeatureList scoped_feature_list;
+    if (is_notes_enabled) {
+      scoped_feature_list.InitAndEnableFeature(
+          syncer::kPasswordNotesWithBackup);
+    } else {
+      scoped_feature_list.InitAndDisableFeature(
+          syncer::kPasswordNotesWithBackup);
+    }
+    sync_pb::PasswordSpecifics specifics;
+    *specifics.mutable_client_only_encrypted_data() = CreateSpecificsData(
+        "http://www.origin.com/", "username_element", "username_value",
+        "password_element", "signon_realm",
+        /*issue_types=*/{});
 
-  EXPECT_THAT(SpecificsFromPassword(
-                  PasswordFromSpecifics(specifics.client_only_encrypted_data()),
-                  /*base_password_data=*/{})
-                  .SerializeAsString(),
-              Eq(specifics.SerializeAsString()));
+    EXPECT_THAT(
+        SpecificsFromPassword(
+            PasswordFromSpecifics(specifics.client_only_encrypted_data()),
+            /*base_password_data=*/{})
+            .SerializeAsString(),
+        Eq(specifics.SerializeAsString()));
+  }
 }
 
 TEST(PasswordProtoUtilsTest, SpecificsDataFromPasswordPreservesUnknownFields) {
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge.cc b/components/password_manager/core/browser/sync/password_sync_bridge.cc
index cec227e..7502d941 100644
--- a/components/password_manager/core/browser/sync/password_sync_bridge.cc
+++ b/components/password_manager/core/browser/sync/password_sync_bridge.cc
@@ -152,8 +152,10 @@
              remote_password_specifics.avatar_url() &&
          local_password_specifics.federation_url() ==
              remote_password_specifics.federation_url() &&
-         PasswordNotesFromProto(local_password_specifics.notes()) ==
-             PasswordNotesFromProto(remote_password_specifics.notes());
+         (base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)
+              ? PasswordNotesFromProto(local_password_specifics.notes()) ==
+                    PasswordNotesFromProto(remote_password_specifics.notes())
+              : true);
 }
 
 // Returns true iff |remote_password_specifics| and |local_password_specifics|
diff --git a/components/password_manager/core/browser/unified_password_manager_proto_utils_unittest.cc b/components/password_manager/core/browser/unified_password_manager_proto_utils_unittest.cc
index 65a8625..da2e10d 100644
--- a/components/password_manager/core/browser/unified_password_manager_proto_utils_unittest.cc
+++ b/components/password_manager/core/browser/unified_password_manager_proto_utils_unittest.cc
@@ -4,9 +4,11 @@
 
 #include "components/password_manager/core/browser/unified_password_manager_proto_utils.h"
 
+#include "base/feature_list.h"
 #include "components/password_manager/core/browser/password_form.h"
 #include "components/password_manager/core/browser/protos/list_passwords_result.pb.h"
 #include "components/password_manager/core/browser/protos/password_with_local_data.pb.h"
+#include "components/sync/base/features.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -59,9 +61,11 @@
   // when none exist.
   *password_specifics.mutable_password_issues() =
       sync_pb::PasswordSpecificsData_PasswordIssues();
-  // The current code always populates notes for outgoing protos even when
-  // non-exists.
-  password_specifics.mutable_notes();
+  if (base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)) {
+    // The current code always populates notes for outgoing protos even when
+    // non-exists.
+    password_specifics.mutable_notes();
+  }
   return password_specifics;
 }
 
diff --git a/components/permissions/android/translations/permissions_android_strings_eu.xtb b/components/permissions/android/translations/permissions_android_strings_eu.xtb
index 4ca7bea..964bf7b 100644
--- a/components/permissions/android/translations/permissions_android_strings_eu.xtb
+++ b/components/permissions/android/translations/permissions_android_strings_eu.xtb
@@ -10,7 +10,7 @@
 <translation id="2359808026110333948">Egin aurrera</translation>
 <translation id="2987449669841041897">Webguneak ezin dizu eskatu baimena</translation>
 <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Lortu laguntza<ph name="END_LINK" /></translation>
-<translation id="3773755127849930740">Parekatzeko, <ph name="BEGIN_LINK" />aktibatu Bluetooth-a<ph name="END_LINK" /></translation>
+<translation id="3773755127849930740">Parekatzeko, <ph name="BEGIN_LINK" />aktibatu Bluetootha<ph name="END_LINK" /></translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Lortu laguntza<ph name="END_LINK" /> gailurik dagoen egiaztatu bitartean…</translation>
 <translation id="4925793601605263825">Webgune honen izenean mikrofonoa atzitzeko baimena behar du <ph name="APP_NAME" />-k.</translation>
 <translation id="5230560987958996918"><ph name="SITE" /> webguneak inguruko Bluetooth bidezko gailuak bilatu nahi ditu. Gailu hauek aurkitu dira:</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index 279a3f9..9304ddf80 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -217,6 +217,7 @@
       การไม่ตั้งค่านโยบายหมายความว่า <ph name="DEFAULT_POPUPS_SETTING_POLICY_NAME" /> จะมีผลกับทุกเว็บไซต์ (หากตั้งค่าไว้) แต่หากไม่ได้ตั้งค่าไว้ การตั้งค่าส่วนตัวของผู้ใช้จะมีผล
 
       ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ <ph name="URL_LABEL" /> ที่ถูกต้องได้ที่ https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns  <ph name="WILDCARD_VALUE" /> ไม่ใช่ค่าที่ยอมรับสำหรับนโยบายนี้</translation>
+<translation id="1209096923317019235">กําหนดแอปเป็นตัวแฮนเดิลเริ่มต้นสําหรับนามสกุลไฟล์ที่ระบุ</translation>
 <translation id="120937472976628837">รายงานข้อมูลพัดลม</translation>
 <translation id="1212233008927724662">ปิดใช้การโหลด Login WebUI แบบ Lazy Loading</translation>
 <translation id="1216919699175573511">เปิดใช้การสนับสนุน Signed HTTP Exchange (SXG)</translation>
@@ -2332,6 +2333,15 @@
       หาก <ph name="PRODUCT_NAME" /> ไม่ได้ออกอย่างราบรื่น (เช่น หากเบราว์เซอร์หรือระบบปฏิบัติการขัดข้อง) ระบบจะล้างข้อมูลการท่องเว็บในครั้งถัดไปที่โหลดโปรไฟล์</translation>
 <translation id="3264793472749429012">การเข้ารหัสของผู้ให้บริการการค้นหาเริ่มต้น</translation>
 <translation id="3273221114520206906">การตั้งค่า JavaScript เริ่มต้น</translation>
+<translation id="3282240846541032181">นโยบายนี้ให้ผู้ดูแลระบบระบุแอปที่ทําหน้าที่เป็นตัวแฮนเดิลเริ่มต้นสําหรับนามสกุลไฟล์ที่เกี่ยวข้องใน <ph name="PRODUCT_OS_NAME" /> ซึ่งผู้ใช้เปลี่ยนแปลงไม่ได้
+      สําหรับนามสกุลไฟล์ทั้งหมดที่ไม่ได้ระบุไว้ในนโยบาย ผู้ใช้จะกําหนดค่าเริ่มต้นของตนเองตามเวิร์กโฟลว์ปกติได้อย่างอิสระ
+
+      ระบุแอป Chrome ตามรหัส เช่น <ph name="DEFAULT_HANDLERS_FOR_FILE_EXTENSIONS_POLICY_CHROME_APP_EXAMPLE" /> และเว็บแอปตาม URL ที่ใช้ใน <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" /> เช่น <ph name="DEFAULT_HANDLERS_FOR_FILE_EXTENSIONS_POLICY_WEB_APP_EXAMPLE" />
+
+      โปรดทราบว่าแอปต้องประกาศว่าตนเองเป็นตัวแฮนเดิลไฟล์สําหรับนามสกุลไฟล์ที่ระบุในไฟล์ Manifest เพื่อให้รายการดังกล่าวในนโยบายมีผล (นโยบายไม่ได้ขยายความสามารถที่แอปที่มีอยู่)
+
+      การไม่ตั้งค่านโยบายจะทำให้ <ph name="PRODUCT_OS_NAME" /> เลือกตัวแฮนเดิลเริ่มต้นตามตรรกะภายในได้
+      </translation>
 <translation id="328347261792478720">โดยค่าเริ่มต้น เบราว์เซอร์จะแสดงคำแนะนำสื่อที่มีการปรับเปลี่ยนในแบบของผู้ใช้ การตั้งค่านโยบายนี้เป็น "ปิดใช้" จะทำให้ระบบซ่อนคำแนะนำเหล่านี้ไม่ให้ผู้ใช้เห็น การตั้งค่านโยบายนี้เป็น "เปิดใช้" หรือไม่ได้ตั้งค่าจะทำให้ระบบแสดงคำแนะนำสื่อต่อผู้ใช้</translation>
 <translation id="3284094172359247914">ควบคุมการใช้ WebUSB API</translation>
 <translation id="3288595667065905535">ช่องเผยแพร่</translation>
@@ -4152,6 +4162,35 @@
 <translation id="5330684698007383292">อนุญาตให้ <ph name="PRODUCT_FRAME_NAME" /> จัดการประเภทเนื้อหาดังต่อไปนี้</translation>
 <translation id="5331746669335642668">นโยบายระบบคลาวด์ของ <ph name="PRODUCT_NAME" /> จะลบล้างนโยบายแพลตฟอร์ม</translation>
 <translation id="5346587320074666194">บล็อกสิทธิ์เข้าถึงเซ็นเซอร์ในเว็บไซต์เหล่านี้</translation>
+<translation id="5357039649371478544">กำหนดค่ารายการกฎการป้องกันข้อมูลรั่วไหลใน <ph name="PRODUCT_OS_NAME" />
+      ข้อมูลรั่วไหลอาจเกิดขึ้นได้จากการคัดลอกและวางข้อมูล การโอนไฟล์ การพิมพ์ การแชร์หน้าจอ หรือการจับภาพหน้าจอ และอื่นๆ
+
+      กฎแต่ละข้อจะประกอบด้วยข้อมูลต่อไปนี้
+      - รายการแหล่งที่มาที่กำหนดเป็น URL ข้อมูลในแหล่งที่มาจะถือว่าเป็นข้อมูลลับซึ่งมีการจำกัดการใช้งาน
+      - รายการปลายทางที่กำหนดเป็น URL หรือคอมโพเนนต์ ซึ่งอนุญาตหรือไม่อนุญาตให้แชร์ข้อมูลลับ
+      - รายการการจำกัดที่จะใช้กับข้อมูลของแหล่งที่มา
+
+      คุณจะเพิ่มกฎเพื่อดำเนินการต่อไปนี้ได้
+      - ควบคุมข้อมูลในคลิปบอร์ดที่แชร์ระหว่างแหล่งที่มาและปลายทาง
+      - ควบคุมการจับภาพหน้าจอของแหล่งที่มา
+      - ควบคุมการพิมพ์แหล่งที่มา
+      - ควบคุมหน้าจอความเป็นส่วนตัวเมื่อสามารถมองเห็นแหล่งที่มาได้
+      - ควบคุมการแชร์หน้าจอของแหล่งที่มา
+      - ควบคุมไฟล์ที่ดาวน์โหลดจากแหล่งที่มาใดก็ตามเมื่อโอนไปยังปลายทาง รองรับใน <ph name="PRODUCT_OS_NAME" /> เวอร์ชัน 108 ขึ้นไป
+
+      ระดับการจำกัดอาจตั้งค่าเป็น "BLOCK" "ALLOW" "REPORT" "WARN"
+      - หากตั้งค่าระดับการจำกัดเป็น "BLOCK" ระบบจะไม่อนุญาตให้ดำเนินการ หากตั้งค่า <ph name="DATA_LEAK_PREVENTION_REPORTING_ENABLED" /> เป็น "จริง" จะมีการรายงานการดำเนินการที่ถูกบล็อกไปยังผู้ดูแลระบบ
+      - หากตั้งค่าระดับการจำกัดเป็น "ALLOW" ระบบจะอนุญาตให้ดำเนินการ
+      - หากตั้งค่าระดับการจำกัดเป็น "REPORT" และตั้งค่า <ph name="DATA_LEAK_PREVENTION_REPORTING_ENABLED" /> เป็น "จริง" จะมีการรายงานการดำเนินการไปยังผู้ดูแลระบบ
+      - หากตั้งค่าระดับการจำกัดเป็น "WARN" ผู้ใช้จะได้รับคำเตือนและอาจเลือกดำเนินการต่อหรือยกเลิกการดำเนินการก็ได้ หากตั้งค่า <ph name="DATA_LEAK_PREVENTION_REPORTING_ENABLED" /> เป็น "จริง" จะมีการรายงานการแสดงคำเตือนไปยังผู้ดูแลระบบ และจะมีการรายงานการดำเนินการต่อด้วย
+
+      หมายเหตุ
+      - การจำกัด PRIVACY_SCREEN จะไม่บล็อกความสามารถในการเปิดหน้าจอความเป็นส่วนตัว แต่จะบังคับใช้กฎเมื่อมีการตั้งค่าระดับการจำกัดเป็น "BLOCK"
+      - หากการจำกัดข้อหนึ่งเป็น "คลิปบอร์ด" หรือ "ไฟล์" คุณจะต้องระบุปลายทาง แต่ปลายทางเหล่านี้จะไม่ส่งผลใดๆ ต่อการจำกัดที่เหลือ
+      - ระบบจะละเว้นปลายทาง "ไดรฟ์" และ "USB" สำหรับข้อจํากัด "คลิปบอร์ด"
+      - จัดรูปแบบ URL ตามรูปแบบนี้ (https://www.chromium.org/administrators/url-blocklist-filter-format)
+
+      หากไม่ได้ตั้งค่านโยบาย ระบบจะไม่จำกัดการใช้งาน</translation>
 <translation id="5362531528507578966">ลบล้างโหมดการพิมพ์กราฟิกพื้นหลังที่เป็นค่าเริ่มต้น</translation>
 <translation id="5365476955714838841">พารามิเตอร์บรรทัดคำสั่งสำหรับเบราว์เซอร์สำรอง</translation>
 <translation id="5365946944967967336">แสดงปุ่ม "หน้าแรก" บนแถบเครื่องมือ</translation>
diff --git a/components/reporting/client/report_queue_provider.cc b/components/reporting/client/report_queue_provider.cc
index a228731..58291cfb 100644
--- a/components/reporting/client/report_queue_provider.cc
+++ b/components/reporting/client/report_queue_provider.cc
@@ -93,8 +93,9 @@
 }
 
 // static
-const base::Feature ReportQueueProvider::kEncryptedReportingPipeline{
-    "EncryptedReportingPipeline", base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kEncryptedReportingPipeline,
+             "EncryptedReportingPipeline",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 ReportQueueProvider::ReportQueueProvider(
     StorageModuleCreateCallback storage_create_cb)
diff --git a/components/reporting/client/report_queue_provider.h b/components/reporting/client/report_queue_provider.h
index 2e9287b..4b6a61d 100644
--- a/components/reporting/client/report_queue_provider.h
+++ b/components/reporting/client/report_queue_provider.h
@@ -23,6 +23,8 @@
 
 namespace reporting {
 
+BASE_DECLARE_FEATURE(kEncryptedReportingPipeline);
+
 // ReportQueueProvider acts a single point for instantiating
 // |reporting::ReportQueue|s. By performing initialization atomically it ensures
 // that all ReportQueues are created with the same global settings.
@@ -100,8 +102,6 @@
   using ReportQueueConfiguredCallback = base::OnceCallback<void(
       StatusOr<std::unique_ptr<ReportQueueConfiguration>>)>;
 
-  static const base::Feature kEncryptedReportingPipeline;
-
   explicit ReportQueueProvider(StorageModuleCreateCallback storage_create_cb);
   ReportQueueProvider(const ReportQueueProvider& other) = delete;
   ReportQueueProvider& operator=(const ReportQueueProvider& other) = delete;
diff --git a/components/reporting/client/report_queue_provider_unittest.cc b/components/reporting/client/report_queue_provider_unittest.cc
index fd95d276..eeca9b069 100644
--- a/components/reporting/client/report_queue_provider_unittest.cc
+++ b/components/reporting/client/report_queue_provider_unittest.cc
@@ -256,8 +256,7 @@
 TEST_F(ReportQueueProviderTest,
        CreateReportQueueWithEncryptedReportingPipelineDisabled) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndDisableFeature(
-      ReportQueueProvider::kEncryptedReportingPipeline);
+  feature_list.InitAndDisableFeature(kEncryptedReportingPipeline);
 
   // Create configuration
   auto config_result = ReportQueueConfiguration::Create(
@@ -276,8 +275,7 @@
 TEST_F(ReportQueueProviderTest,
        CreateSpeculativeReportQueueWithEncryptedReportingPipelineDisabled) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndDisableFeature(
-      ReportQueueProvider::kEncryptedReportingPipeline);
+  feature_list.InitAndDisableFeature(kEncryptedReportingPipeline);
 
   // Create configuration
   auto config_result = ReportQueueConfiguration::Create(
diff --git a/components/reporting/compression/compression_module.cc b/components/reporting/compression/compression_module.cc
index 2676d65..04e7324 100644
--- a/components/reporting/compression/compression_module.cc
+++ b/components/reporting/compression/compression_module.cc
@@ -20,13 +20,9 @@
 
 namespace reporting {
 
-const base::Feature kCompressReportingPipeline{
-    CompressionModule::kCompressReportingFeature,
-    base::FEATURE_ENABLED_BY_DEFAULT};
-
-// static
-const char CompressionModule::kCompressReportingFeature[] =
-    "CompressReportingPipeline";
+BASE_FEATURE(kCompressReportingPipeline,
+             "CompressReportingPipeline",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 namespace {
 
diff --git a/components/reporting/compression/compression_module.h b/components/reporting/compression/compression_module.h
index 3cbf749..dc80029 100644
--- a/components/reporting/compression/compression_module.h
+++ b/components/reporting/compression/compression_module.h
@@ -17,12 +17,12 @@
 
 namespace reporting {
 
+// Feature to enable/disable compression.
+// By default compression is disabled, until server can support compression.
+BASE_DECLARE_FEATURE(kCompressReportingPipeline);
+
 class CompressionModule : public base::RefCountedThreadSafe<CompressionModule> {
  public:
-  // Feature to enable/disable compression.
-  // By default compression is disabled, until server can support compression.
-  static const char kCompressReportingFeature[];
-
   // Not copyable or movable
   CompressionModule(const CompressionModule& other) = delete;
   CompressionModule& operator=(const CompressionModule& other) = delete;
diff --git a/components/reporting/compression/compression_module_unittest.cc b/components/reporting/compression/compression_module_unittest.cc
index 140c8b1..972777f 100644
--- a/components/reporting/compression/compression_module_unittest.cc
+++ b/components/reporting/compression/compression_module_unittest.cc
@@ -67,14 +67,10 @@
   }
 
   void EnableCompression() {
-    // Enable compression.
-    scoped_feature_list_.InitFromCommandLine(
-        {CompressionModule::kCompressReportingFeature}, {});
+    scoped_feature_list_.InitAndEnableFeature(kCompressReportingPipeline);
   }
   void DisableCompression() {
-    // Disable compression.
-    scoped_feature_list_.InitFromCommandLine(
-        {}, {CompressionModule::kCompressReportingFeature});
+    scoped_feature_list_.InitAndDisableFeature(kCompressReportingPipeline);
   }
 
   scoped_refptr<ResourceInterface> memory_resource_;
diff --git a/components/reporting/encryption/encryption_module_interface.cc b/components/reporting/encryption/encryption_module_interface.cc
index 4d1b1d0..34c0590 100644
--- a/components/reporting/encryption/encryption_module_interface.cc
+++ b/components/reporting/encryption/encryption_module_interface.cc
@@ -18,18 +18,10 @@
 
 namespace reporting {
 
-namespace {
-
 // Temporary: enable/disable encryption.
-const base::Feature kEncryptedReportingFeature{
-    EncryptionModuleInterface::kEncryptedReporting,
-    base::FEATURE_ENABLED_BY_DEFAULT};
-
-}  // namespace
-
-// static
-const char EncryptionModuleInterface::kEncryptedReporting[] =
-    "EncryptedReporting";
+BASE_FEATURE(kEncryptedReportingFeature,
+             "EncryptedReporting",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // static
 bool EncryptionModuleInterface::is_enabled() {
diff --git a/components/reporting/encryption/encryption_module_interface.h b/components/reporting/encryption/encryption_module_interface.h
index dcbfee0..4fcce6f 100644
--- a/components/reporting/encryption/encryption_module_interface.h
+++ b/components/reporting/encryption/encryption_module_interface.h
@@ -8,6 +8,7 @@
 #include <atomic>
 
 #include "base/callback.h"
+#include "base/feature_list.h"
 #include "base/memory/ref_counted.h"
 #include "base/strings/string_piece.h"
 #include "base/time/time.h"
@@ -17,17 +18,17 @@
 
 namespace reporting {
 
+// Feature to enable/disable encryption.
+// By default encryption is enabled and supported by server.
+// Disabled only for testing/stress purposes.
+BASE_DECLARE_FEATURE(kEncryptedReportingFeature);
+
 class EncryptionModuleInterface
     : public base::RefCountedThreadSafe<EncryptionModuleInterface> {
  public:
   // Public key id, as defined by Keystore.
   using PublicKeyId = int32_t;
 
-  // Feature to enable/disable encryption.
-  // By default encryption is enabled and supported by server.
-  // Disabled only for testing/stress purposes.
-  static const char kEncryptedReporting[];
-
   explicit EncryptionModuleInterface(
       base::TimeDelta renew_encryption_key_period = base::Days(1));
   EncryptionModuleInterface(const EncryptionModuleInterface& other) = delete;
diff --git a/components/reporting/encryption/encryption_module_unittest.cc b/components/reporting/encryption/encryption_module_unittest.cc
index 72e198a2..decfca99 100644
--- a/components/reporting/encryption/encryption_module_unittest.cc
+++ b/components/reporting/encryption/encryption_module_unittest.cc
@@ -161,8 +161,7 @@
 
   // Disable encryption for this test.
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitFromCommandLine(
-      {}, {EncryptionModuleInterface::kEncryptedReporting});
+  scoped_feature_list.InitAndDisableFeature(kEncryptedReportingFeature);
 
   // Encrypt the test string.
   const auto encrypted_result = EncryptSync(kTestString);
diff --git a/components/reporting/metrics/metric_rate_controller.cc b/components/reporting/metrics/metric_rate_controller.cc
index 98058f8..c6e5ff6 100644
--- a/components/reporting/metrics/metric_rate_controller.cc
+++ b/components/reporting/metrics/metric_rate_controller.cc
@@ -11,8 +11,9 @@
 namespace reporting {
 
 // static
-const base::Feature MetricRateController::kEnableTelemetryTestingRates{
-    "EnableTelemetryTestingRates", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kEnableTelemetryTestingRates,
+             "EnableTelemetryTestingRates",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 MetricRateController::MetricRateController(
     base::RepeatingClosure task,
diff --git a/components/reporting/metrics/metric_rate_controller.h b/components/reporting/metrics/metric_rate_controller.h
index 323a75a..ae85ba9 100644
--- a/components/reporting/metrics/metric_rate_controller.h
+++ b/components/reporting/metrics/metric_rate_controller.h
@@ -17,12 +17,12 @@
 
 class ReportingSettings;
 
+BASE_DECLARE_FEATURE(kEnableTelemetryTestingRates);
+
 // Control reporting rate based on the reporting setting specified by the
 // setting path.
 class MetricRateController {
  public:
-  static const base::Feature kEnableTelemetryTestingRates;
-
   MetricRateController(base::RepeatingClosure task,
                        ReportingSettings* reporting_settings,
                        const std::string& rate_setting_path,
diff --git a/components/reporting/storage/storage_queue_stress_test.cc b/components/reporting/storage/storage_queue_stress_test.cc
index faa8e76..7104060 100644
--- a/components/reporting/storage/storage_queue_stress_test.cc
+++ b/components/reporting/storage/storage_queue_stress_test.cc
@@ -126,9 +126,7 @@
 class StorageQueueStressTest : public ::testing::TestWithParam<size_t> {
  public:
   void SetUp() override {
-    // Enable compression.
-    scoped_feature_list_.InitFromCommandLine(
-        {CompressionModule::kCompressReportingFeature}, {});
+    scoped_feature_list_.InitAndEnableFeature(kCompressReportingPipeline);
 
     ASSERT_TRUE(location_.CreateUniqueTempDir());
     options_.set_directory(base::FilePath(location_.GetPath()));
diff --git a/components/reporting/storage/storage_unittest.cc b/components/reporting/storage/storage_unittest.cc
index 1f018fb..dba9d20 100644
--- a/components/reporting/storage/storage_unittest.cc
+++ b/components/reporting/storage/storage_unittest.cc
@@ -243,8 +243,7 @@
       expect_to_need_key_ = true;
     } else {
       // Disable encryption.
-      scoped_feature_list_.InitFromCommandLine(
-          {}, {EncryptionModuleInterface::kEncryptedReporting});
+      scoped_feature_list_.InitAndDisableFeature(kEncryptedReportingFeature);
     }
     test_compression_module_ =
         base::MakeRefCounted<test::TestCompressionModule>();
diff --git a/components/reporting/storage_selector/storage_selector.cc b/components/reporting/storage_selector/storage_selector.cc
index 1ee27964..beda8bf98 100644
--- a/components/reporting/storage_selector/storage_selector.cc
+++ b/components/reporting/storage_selector/storage_selector.cc
@@ -39,29 +39,23 @@
 #if BUILDFLAG(IS_CHROMEOS)
 // Features settings for storage and uploader.
 // Use `missived` by all browsers.
-const base::Feature kUseMissiveDaemonFeature{StorageSelector::kUseMissiveDaemon,
-                                             base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kUseMissiveDaemonFeature,
+             "ConnectMissiveDaemon",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Receive `missived` uploads by ASH/primary browser only.
-const base::Feature kProvideUploaderFeature {
-  StorageSelector::kProvideUploader,
+BASE_FEATURE(kProvideUploaderFeature,
+             "ProvideUploader",
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-      base::FEATURE_ENABLED_BY_DEFAULT
+             base::FEATURE_ENABLED_BY_DEFAULT
 #else   // BUILDFLAG(IS_CHROMEOS_LACROS)
-      base::FEATURE_DISABLED_BY_DEFAULT
+             base::FEATURE_DISABLED_BY_DEFAULT
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-};
+);
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace
 
-#if BUILDFLAG(IS_CHROMEOS)
-// static
-const char StorageSelector::kUseMissiveDaemon[] = "ConnectMissiveDaemon";
-// static
-const char StorageSelector::kProvideUploader[] = "ProvideUploader";
-#endif  // BUILDFLAG(IS_CHROMEOS)
-
 // static
 bool StorageSelector::is_uploader_required() {
 #if BUILDFLAG(IS_CHROMEOS)
diff --git a/components/reporting/storage_selector/storage_selector.h b/components/reporting/storage_selector/storage_selector.h
index f65dd2cf..3800cb73 100644
--- a/components/reporting/storage_selector/storage_selector.h
+++ b/components/reporting/storage_selector/storage_selector.h
@@ -23,14 +23,6 @@
 // that case it always connects to Missive Daemon.
 class StorageSelector {
  public:
-#if BUILDFLAG(IS_CHROMEOS)
-  // Features to select specific backends.
-  // By default storage is local (as opposed to missive daemon use)
-  // and upload is enabled.
-  static const char kUseMissiveDaemon[];
-  static const char kProvideUploader[];
-#endif  // BUILDFLAG(IS_CHROMEOS)
-
   static bool is_use_missive();
   static bool is_uploader_required();
 
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb
index 665a77b..d8c14dcb 100644
--- a/components/strings/components_strings_da.xtb
+++ b/components/strings/components_strings_da.xtb
@@ -846,6 +846,7 @@
 <translation id="3216313131063488104">Blues</translation>
 <translation id="3218181027817787318">Relativ</translation>
 <translation id="3223287115535306850">Spinner for app, der startes</translation>
+<translation id="3223425961342298674">Adgang til lokation er ikke tilladt</translation>
 <translation id="3225347164936328585">Klapper</translation>
 <translation id="3225919329040284222">Serveren præsenterede et certifikat, der ikke svarer til de indbyggede forventninger. Disse forventninger medtages for bestemte websites med høj sikkerhed for at beskytte dig.</translation>
 <translation id="3226128629678568754">Tryk på genindlæsningsknappen for at genindsende de data, der er nødvendige for at indlæse siden.</translation>
@@ -1185,6 +1186,7 @@
 <translation id="4127575959421463246">Leder du efter Chrome OS-demofunktionerne? Besøg</translation>
 <translation id="4129401438321186435">{COUNT,plural, =1{1 anden/andet}one{# anden/andet}other{# andre}}</translation>
 <translation id="4130226655945681476">Tjekke netværkskabler, modem og router</translation>
+<translation id="4132448310531350254">Identiske handlere for filtypen "<ph name="FILE_EXTENSION" />", som der henvises til i applikationerne "<ph name="POLICY_IDS_LIST" />".</translation>
 <translation id="4134123981501319574">Opret dokument</translation>
 <translation id="413544239732274901">Få flere oplysninger</translation>
 <translation id="4142935452406587478">Bakke 10</translation>
@@ -1207,6 +1209,7 @@
 <translation id="4194250254487269611">Dit kort kan ikke gemmes lige nu</translation>
 <translation id="4196861286325780578">&amp;Annuller fortryd flytning</translation>
 <translation id="4202554117186904723">Femte papirrulle</translation>
+<translation id="4203769790323223880">Adgang til kamera er ikke tilladt</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Tjekke firewall- og antiviruskonfigurationer<ph name="END_LINK" /></translation>
 <translation id="4209092469652827314">Stor</translation>
 <translation id="4210602799576081649">Bekræftelseskoden udløb. Anmod om en ny kode.</translation>
@@ -1233,6 +1236,7 @@
     &lt;p&gt;Husk at aktivere antivirusprogrammet igen, når du er færdig.&lt;/p&gt;
     &lt;h4&gt;Trin 5: Få yderligere hjælp&lt;/h4&gt;
     &lt;p&gt;Hvis fejlen stadig vises, bør du kontakte ejeren af websitet.&lt;/p&gt;</translation>
+<translation id="4223404254440398437">Adgang til mikrofon er ikke tilladt</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Prøv at køre Netværksdiagnosticering<ph name="END_LINK" />.</translation>
 <translation id="4230204356098880324">Websitet kan anmode om tilladelse til at bruge og bevæge dit kamera</translation>
 <translation id="4235360514405112390">Gyldig</translation>
@@ -1604,6 +1608,7 @@
 <translation id="5177076414499237632">Få flere oplysninger om denne sides kilde og emne</translation>
 <translation id="5179510805599951267">Ikke på <ph name="ORIGINAL_LANGUAGE" />? Rapporter denne fejl</translation>
 <translation id="518639307526414276">Foder og udstyr til kæledyr</translation>
+<translation id="5190072300954988691">Adgang til kamera og mikrofon er ikke tilladt</translation>
 <translation id="5190835502935405962">Bogmærkelinje</translation>
 <translation id="5191315092027169558">Din profil administreres af <ph name="DOMAIN" /></translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> vil downloade flere filer</translation>
@@ -1624,6 +1629,7 @@
 <translation id="5230815978613972521">B8</translation>
 <translation id="5233045608889518621">12x19</translation>
 <translation id="5234764350956374838">Luk</translation>
+<translation id="5239623327352565343">Adgang til lokation er tilladt</translation>
 <translation id="5242889659037569123">Bagagetasker og rejsetilbehør</translation>
 <translation id="5250209940322997802">"Opret forbindelse til netværk"</translation>
 <translation id="52517543715119994">Få flere oplysninger om Chrome-funktioner</translation>
@@ -2500,6 +2506,7 @@
 <translation id="7581199239021537589">Billedskift Y på side 2</translation>
 <translation id="7582602800368606489">Opret hurtigt en ny begivenhed i Google Kalender</translation>
 <translation id="7583969447617676942">Juridisk rådgivning</translation>
+<translation id="7586676035079382730">Notifikationer er ikke tilladt</translation>
 <translation id="7591288787774558753">Vil du dele fortroligt indhold?</translation>
 <translation id="7591636454931265313"><ph name="EMBEDDED_URL" /> vil gerne benytte cookies og websitedata på <ph name="TOP_LEVEL_URL" /></translation>
 <translation id="7592362899630581445">Begrænsningerne for serverens certifikatnavn er overtrådt.</translation>
@@ -3053,6 +3060,7 @@
 <translation id="9131119348384879525">Vil du optage fortroligt indhold?</translation>
 <translation id="9136861683332321024">Luksusbiler</translation>
 <translation id="9137013805542155359">Vis oprindelig</translation>
+<translation id="9138037198177304356">Notifikationer er tilladt</translation>
 <translation id="9139318394846604261">Shopping</translation>
 <translation id="9141013498910525015">Administrer adresser</translation>
 <translation id="9144951720726881238">Udløbsdato:</translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb
index 7f0eca9c..872d4948 100644
--- a/components/strings/components_strings_hy.xtb
+++ b/components/strings/components_strings_hy.xtb
@@ -846,6 +846,7 @@
 <translation id="3216313131063488104">Բլյուզ</translation>
 <translation id="3218181027817787318">Հարաբերական</translation>
 <translation id="3223287115535306850">Հավելվածի գործարկման ընթացքի պատկերակ</translation>
+<translation id="3223425961342298674">Տեղադրության տվյալների օգտագործումն արգելված է</translation>
 <translation id="3225347164936328585">Ծափեր</translation>
 <translation id="3225919329040284222">Սերվերի կողմից ներկայացված վկայագիրը չի համապատասխանում ներկառուցված հարաչափերին: Այս հարաչափերը ձեզ պաշտպանելու նպատակով ներառված են բարձր անվտանգության որոշակի վեբկայքերի համար:</translation>
 <translation id="3226128629678568754">Էջի բեռնման համար անհրաժեշտ տվյալները նորից ուղարկելու համար սեղմել վերբեռնման կոճակը:</translation>
@@ -1185,6 +1186,7 @@
 <translation id="4127575959421463246">Արդյո՞ք փնտրում եք ChromeOS-ի մատնանշման տարրերը։ Անցեք</translation>
 <translation id="4129401438321186435">{COUNT,plural, =1{1 այլ}one{# այլ}other{# այլ}}</translation>
 <translation id="4130226655945681476">Ստուգել ցանցային մալուխը, մոդեմը և երթուղիչը</translation>
+<translation id="4132448310531350254">«<ph name="FILE_EXTENSION" />» ընդլայնումը նշանակված է մի քանի մշակիչների համար՝ <ph name="POLICY_IDS_LIST" />։</translation>
 <translation id="4134123981501319574">Ստեղծել փաստաթուղթ</translation>
 <translation id="413544239732274901">Իմանալ ավելին</translation>
 <translation id="4142935452406587478">Դարակ 10</translation>
@@ -1207,6 +1209,7 @@
 <translation id="4194250254487269611">Չհաջողվեց պահել քարտը</translation>
 <translation id="4196861286325780578">&amp;Վերարկել տեղափոխումը</translation>
 <translation id="4202554117186904723">Հինգերորդ գլանափաթեթ</translation>
+<translation id="4203769790323223880">Տեսախցիկի օգտագործումն արգելված է</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Ստուգել հրապատի և հակավիրուսային ծրագրի կազմաձևումը<ph name="END_LINK" /></translation>
 <translation id="4209092469652827314">Մեծ</translation>
 <translation id="4210602799576081649">Հաստատման կոդի ժամկետը սպառվել է։ Ստացեք նոր կոդ։</translation>
@@ -1233,6 +1236,7 @@
     &lt;p&gt;Ավարտելուց հետո մի՛ մոռացեք կրկին միացնել հակավիրուսային ծրագիրը։&lt;/p&gt;
     &lt;h4&gt;Քայլ 5. ստացեք լրացուցիչ օգնություն&lt;/h4&gt;
     &lt;p&gt;Եթե շարունակում եք տեսնել սխալը, կապվեք կայքի սեփականատիրոջ հետ։&lt;/p&gt;</translation>
+<translation id="4223404254440398437">Խոսափողի օգտագործումն արգելված է</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Գործարկել ցանցի ախտորոշումը<ph name="END_LINK" />:</translation>
 <translation id="4230204356098880324">Կարող է հայցել տեսախցիկն օգտագործելու և տեղաշարժելու թույլտվություն</translation>
 <translation id="4235360514405112390">Վավեր</translation>
@@ -1605,6 +1609,7 @@
 <translation id="5177076414499237632">Իմանալ ավելին այս էջի աղբյուրի և թեմայի մասին</translation>
 <translation id="5179510805599951267"><ph name="ORIGINAL_LANGUAGE" /> չէ՞: Հաղորդեք սխալի մասին</translation>
 <translation id="518639307526414276">Կենդանիների կեր և խնամքի միջոցներ</translation>
+<translation id="5190072300954988691">Տեսախցիկի և խոսափողի օգտագործումն արգելված է</translation>
 <translation id="5190835502935405962">Էջանիշների գոտի</translation>
 <translation id="5191315092027169558">Ձեր պրոֆիլը կառավարվում է <ph name="DOMAIN" /> տիրույթի կողմից</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> հավելվածն ուզում է ներբեռնել մի քանի ֆայլ</translation>
@@ -1625,6 +1630,7 @@
 <translation id="5230815978613972521">B8</translation>
 <translation id="5233045608889518621">12x19</translation>
 <translation id="5234764350956374838">Փակել</translation>
+<translation id="5239623327352565343">Տեղադրության տվյալների օգտագործումը թույլատրված է</translation>
 <translation id="5242889659037569123">Ճամպրուկներ և ճամփորդական պարագաներ</translation>
 <translation id="5250209940322997802">«Միացեք ցանցին»</translation>
 <translation id="52517543715119994">Տեղեկանալ Chrome-ի գործառույթների մասին</translation>
@@ -2501,6 +2507,7 @@
 <translation id="7581199239021537589">Պատկերների տեղաշարժ հակառակ կողմից՝ Y առանցքով</translation>
 <translation id="7582602800368606489">Արագ ստեղծել միջոցառում Google Օրացույցում</translation>
 <translation id="7583969447617676942">Իրավաբանական ծառայություններ</translation>
+<translation id="7586676035079382730">Ծանուցումների ուղարկումն արգելված է</translation>
 <translation id="7591288787774558753">Կիսվե՞լ կոնֆիդենցիալ բովանդակությամբ</translation>
 <translation id="7591636454931265313"><ph name="EMBEDDED_URL" /> կայքն ուզում է օգտագործել <ph name="TOP_LEVEL_URL" /> կայքի քուքիներն ու տվյալները</translation>
 <translation id="7592362899630581445">Սերվերի վկայագիրը խախտում է անունների սահմանափակումները:</translation>
@@ -3053,6 +3060,7 @@
 <translation id="9131119348384879525">Լուսանկարե՞լ կոնֆիդենցիալ բովանդակությունը</translation>
 <translation id="9136861683332321024">Լյուքս դասի ավտոմեքենաներ</translation>
 <translation id="9137013805542155359">Ցույց տալ բնօրինակը</translation>
+<translation id="9138037198177304356">Ծանուցումների ուղարկումը թույլատրված է</translation>
 <translation id="9139318394846604261">Գնումներ</translation>
 <translation id="9141013498910525015">Կառավարել հասցեները</translation>
 <translation id="9144951720726881238">Սպառման ամսաթիվը՝</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb
index cc62ff69..fe66440a 100644
--- a/components/strings/components_strings_th.xtb
+++ b/components/strings/components_strings_th.xtb
@@ -846,6 +846,7 @@
 <translation id="3216313131063488104">บลูส์</translation>
 <translation id="3218181027817787318">Relative</translation>
 <translation id="3223287115535306850">ทรอบเบอร์การเปิดแอป</translation>
+<translation id="3223425961342298674">ไม่อนุญาตให้เข้าถึงตําแหน่ง</translation>
 <translation id="3225347164936328585">ตบมือ</translation>
 <translation id="3225919329040284222">เซิร์ฟเวอร์แสดงใบรับรองที่ไม่ตรงกับการคาดการณ์ที่มีอยู่ การคาดการณ์เหล่านี้มีอยู่ในบางเว็บไซต์ที่มีการรักษาความปลอดภัยสูงเพื่อปกป้องคุณ</translation>
 <translation id="3226128629678568754">กดปุ่มโหลดซ้ำเพื่อส่งซ้ำข้อมูลที่จำเป็นในการโหลดหน้าเว็บ</translation>
@@ -1184,6 +1185,7 @@
 <translation id="4127575959421463246">กำลังมองหาการติดธงของ ChromeOS ใช่ไหม ไปที่</translation>
 <translation id="4129401438321186435">{COUNT,plural, =1{อีก 1 รายการ}other{อีก # รายการ}}</translation>
 <translation id="4130226655945681476">ตรวจสอบสายเครือข่าย โมเด็ม และเราเตอร์</translation>
+<translation id="4132448310531350254">ตัวแฮนเดิลซ้ำกันสําหรับ file_extension "<ph name="FILE_EXTENSION" />" ที่อ้างอิงโดยแอป "<ph name="POLICY_IDS_LIST" />"</translation>
 <translation id="4134123981501319574">สร้างเอกสาร</translation>
 <translation id="413544239732274901">ดูข้อมูลเพิ่มเติม</translation>
 <translation id="4142935452406587478">ถาด 10</translation>
@@ -1206,6 +1208,7 @@
 <translation id="4194250254487269611">บันทึกบัตรไม่ได้ในตอนนี้</translation>
 <translation id="4196861286325780578">&amp;ทำซ้ำการย้าย</translation>
 <translation id="4202554117186904723">ม้วนกระดาษ 5</translation>
+<translation id="4203769790323223880">ไม่อนุญาตให้ใช้กล้องถ่ายรูป</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />ตรวจสอบไฟร์วอลล์และการกำหนดค่าการป้องกันไวรัส<ph name="END_LINK" /></translation>
 <translation id="4209092469652827314">ขนาดใหญ่</translation>
 <translation id="4210602799576081649">รหัสยืนยันหมดอายุแล้ว โปรดขอรหัสใหม่</translation>
@@ -1232,6 +1235,7 @@
     &lt;p&gt;อย่าลืมเปิดโปรแกรมป้องกันไวรัสอีกครั้ง เมื่อคุณใช้งานเสร็จแล้ว&lt;/p&gt;
     &lt;h4&gt;ขั้นตอนที่ 5: รับความช่วยเหลือเพิ่มเติม&lt;/h4&gt;
     &lt;p&gt;หากคุณยังคงเห็นข้อผิดพลาด โปรดติดต่อเจ้าของเว็บไซต์&lt;/p&gt;</translation>
+<translation id="4223404254440398437">ไม่อนุญาตให้ใช้ไมโครโฟน</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />ลองเรียกใช้การวินิจฉัยเครือข่าย<ph name="END_LINK" /></translation>
 <translation id="4230204356098880324">สามารถขอใช้และเลื่อนกล้องของคุณได้</translation>
 <translation id="4235360514405112390">ถูกต้อง</translation>
@@ -1603,6 +1607,7 @@
 <translation id="5177076414499237632">ดูข้อมูลเกี่ยวกับแหล่งที่มาและหัวข้อของหน้านี้</translation>
 <translation id="5179510805599951267">หากไม่มีในภาษา <ph name="ORIGINAL_LANGUAGE" /> ให้รายงานข้อผิดพลาดนี้</translation>
 <translation id="518639307526414276">อาหารและอุปกรณ์ดูแลสัตว์เลี้ยง</translation>
+<translation id="5190072300954988691">ไม่อนุญาตให้ใช้กล้องถ่ายรูปและไมโครโฟน</translation>
 <translation id="5190835502935405962">แถบบุ๊กมาร์ก</translation>
 <translation id="5191315092027169558">โปรไฟล์ของคุณจัดการโดย <ph name="DOMAIN" /></translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> ต้องการดาวน์โหลดหลายไฟล์</translation>
@@ -1623,6 +1628,7 @@
 <translation id="5230815978613972521">B8</translation>
 <translation id="5233045608889518621">12x19</translation>
 <translation id="5234764350956374838">ปิด</translation>
+<translation id="5239623327352565343">อนุญาตให้เข้าถึงตําแหน่ง</translation>
 <translation id="5242889659037569123">กระเป๋าและอุปกรณ์สำหรับการเดินทาง</translation>
 <translation id="5250209940322997802">"เชื่อมต่อกับเครือข่าย"</translation>
 <translation id="52517543715119994">ดูข้อมูลเกี่ยวกับฟีเจอร์ของ Chrome</translation>
@@ -2499,6 +2505,7 @@
 <translation id="7581199239021537589">เปลี่ยนตำแหน่งรูปภาพด้าน 2 ตามแกน Y</translation>
 <translation id="7582602800368606489">สร้างกิจกรรมใหม่ใน Google ปฏิทินอย่างรวดเร็ว</translation>
 <translation id="7583969447617676942">บริการทางกฎหมาย</translation>
+<translation id="7586676035079382730">ไม่อนุญาตให้แสดงการแจ้งเตือน</translation>
 <translation id="7591288787774558753">แชร์เนื้อหาที่เป็นความลับไหม</translation>
 <translation id="7591636454931265313"><ph name="EMBEDDED_URL" /> ต้องการใช้คุกกี้และข้อมูลเว็บไซต์ใน <ph name="TOP_LEVEL_URL" /></translation>
 <translation id="7592362899630581445">ใบรับรองของเซิร์ฟเวอร์ละเมิดข้อกำหนดชื่อ</translation>
@@ -3052,6 +3059,7 @@
 <translation id="9131119348384879525">จับภาพเนื้อหาที่เป็นความลับไหม</translation>
 <translation id="9136861683332321024">ยานพาหนะหรู</translation>
 <translation id="9137013805542155359">แสดงหน้าเว็บเดิม</translation>
+<translation id="9138037198177304356">อนุญาตให้แสดงการแจ้งเตือน</translation>
 <translation id="9139318394846604261">ช็อปปิ้ง</translation>
 <translation id="9141013498910525015">จัดการที่อยู่</translation>
 <translation id="9144951720726881238">วันหมดอายุ:</translation>
diff --git a/components/sync/protocol/password_specifics.proto b/components/sync/protocol/password_specifics.proto
index 4d8d133b..dbc3dd86 100644
--- a/components/sync/protocol/password_specifics.proto
+++ b/components/sync/protocol/password_specifics.proto
@@ -267,11 +267,12 @@
     }
     repeated Note note = 1;
   }
+  reserved 21;
   // Set of extra notes that the user attached to the password. The presence of
   // this field, even with an empty Notes message, becomes the authoritative
   // value for notes and would disregard whatever `encrypted_notes_backup`
   // contains.
-  optional Notes notes = 21;
+  optional Notes notes = 22;
 }
 
 // Contains the password specifics metadata which simplifies its lookup.
@@ -296,6 +297,7 @@
   // should never be set for full encryption users. If encryption is enabled,
   // this field must be cleared.
   optional PasswordSpecificsMetadata unencrypted_metadata = 3;
+  reserved 4;
   // An encrypted backup of the notes field inside the PasswordSpecificsData.
   // The Sync server preserves the contents of this field across commits from
   // legacy clients that don't set this field. It is the responsibility of Sync
@@ -316,5 +318,5 @@
   //
   // If both `encrypted_notes_backup` and the `notes` in `encrypted` are
   // populated, the one in notes is considered the authoritative value.
-  optional EncryptedData encrypted_notes_backup = 4;
+  optional EncryptedData encrypted_notes_backup = 5;
 }
diff --git a/components/ukm/ukm_service.cc b/components/ukm/ukm_service.cc
index 15e908b..7f8c7b8 100644
--- a/components/ukm/ukm_service.cc
+++ b/components/ukm/ukm_service.cc
@@ -168,8 +168,9 @@
 }  // namespace
 
 // static
-const base::Feature UkmService::kReportUserNoisedUserBirthYearAndGender = {
-    "UkmReportNoisedUserBirthYearAndGender", base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kReportUserNoisedUserBirthYearAndGender,
+             "UkmReportNoisedUserBirthYearAndGender",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 bool UkmService::LogCanBeParsed(const std::string& serialized_data) {
   Report report;
diff --git a/components/ukm/ukm_service.h b/components/ukm/ukm_service.h
index a6fbd0a..3de54c62 100644
--- a/components/ukm/ukm_service.h
+++ b/components/ukm/ukm_service.h
@@ -51,6 +51,11 @@
   kMaxValue = kClonedInstall,
 };
 
+// Enables adding the synced user's noised birth year and gender to the UKM
+// report. For more details, see doc of metrics::DemographicMetricsProvider in
+// components/metrics/demographics/demographic_metrics_provider.h.
+BASE_DECLARE_FEATURE(kReportUserNoisedUserBirthYearAndGender);
+
 // The URL-Keyed Metrics (UKM) service is responsible for gathering and
 // uploading reports that contain fine grained performance metrics including
 // URLs for top-level navigations.
@@ -119,11 +124,6 @@
 
   uint64_t client_id() const { return client_id_; }
 
-  // Enables adding the synced user's noised birth year and gender to the UKM
-  // report. For more details, see doc of metrics::DemographicMetricsProvider in
-  // components/metrics/demographics/demographic_metrics_provider.h.
-  static const base::Feature kReportUserNoisedUserBirthYearAndGender;
-
   // Makes sure that the serialized UKM report can be parsed.
   static bool LogCanBeParsed(const std::string& serialized_data);
 
diff --git a/components/ukm/ukm_service_unittest.cc b/components/ukm/ukm_service_unittest.cc
index 8ca8072..d222612 100644
--- a/components/ukm/ukm_service_unittest.cc
+++ b/components/ukm/ukm_service_unittest.cc
@@ -621,8 +621,7 @@
 
 TEST_F(UkmServiceTest, DontAddUserDemograhicsWhenFeatureDisabled) {
   base::test::ScopedFeatureList local_feature;
-  local_feature.InitAndDisableFeature(
-      UkmService::kReportUserNoisedUserBirthYearAndGender);
+  local_feature.InitAndDisableFeature(kReportUserNoisedUserBirthYearAndGender);
 
   // The demographics provider should not be called.
   auto provider = std::make_unique<MockDemographicMetricsProvider>();
diff --git a/components/ukm/ukm_test_helper.cc b/components/ukm/ukm_test_helper.cc
index 6ad6ca7..547c9db 100644
--- a/components/ukm/ukm_test_helper.cc
+++ b/components/ukm/ukm_test_helper.cc
@@ -28,7 +28,7 @@
 
 bool UkmTestHelper::IsReportUserNoisedUserBirthYearAndGenderEnabled() {
   return base::FeatureList::IsEnabled(
-      ukm::UkmService::kReportUserNoisedUserBirthYearAndGender);
+      ukm::kReportUserNoisedUserBirthYearAndGender);
 }
 
 uint64_t UkmTestHelper::GetClientId() {
diff --git a/components/user_manager/user_manager_base.cc b/components/user_manager/user_manager_base.cc
index b1e7858..25cd1ed 100644
--- a/components/user_manager/user_manager_base.cc
+++ b/components/user_manager/user_manager_base.cc
@@ -120,8 +120,9 @@
 const char UserManagerBase::kLegacySupervisedUsersHistogramName[] =
     "ChromeOS.LegacySupervisedUsers.HiddenFromLoginScreen";
 // static
-const base::Feature UserManagerBase::kRemoveLegacySupervisedUsersOnStartup{
-    "RemoveLegacySupervisedUsersOnStartup", base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kRemoveLegacySupervisedUsersOnStartup,
+             "RemoveLegacySupervisedUsersOnStartup",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // static
 void UserManagerBase::RegisterPrefs(PrefRegistrySimple* registry) {
diff --git a/components/user_manager/user_manager_base.h b/components/user_manager/user_manager_base.h
index 4bf31275..6e3b915 100644
--- a/components/user_manager/user_manager_base.h
+++ b/components/user_manager/user_manager_base.h
@@ -34,6 +34,9 @@
 
 namespace user_manager {
 
+// Feature that removes legacy supervised users.
+BASE_DECLARE_FEATURE(kRemoveLegacySupervisedUsersOnStartup);
+
 // Base implementation of the UserManager interface.
 class USER_MANAGER_EXPORT UserManagerBase : public UserManager {
  public:
@@ -72,8 +75,6 @@
   // Histogram for tracking the number of deprecated legacy supervised user
   // cryptohomes remaining in the wild.
   static const char kLegacySupervisedUsersHistogramName[];
-  // Feature that removes legacy supervised users.
-  static const base::Feature kRemoveLegacySupervisedUsersOnStartup;
 
   // Registers UserManagerBase preferences.
   static void RegisterPrefs(PrefRegistrySimple* registry);
diff --git a/content/browser/accessibility/dump_accessibility_events_browsertest.cc b/content/browser/accessibility/dump_accessibility_events_browsertest.cc
index 176ef89..9abcf76 100644
--- a/content/browser/accessibility/dump_accessibility_events_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_events_browsertest.cc
@@ -925,8 +925,16 @@
   RunEventTest(FILE_PATH_LITERAL("navigation-api.html"));
 }
 
+// TODO(crbug.com/1369754): Failing on linux/mac/win multiple builders.
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
+#define MAYBE_AccessibilityEventsImmediateRefresh \
+  DISABLED_AccessibilityEventsImmediateRefresh
+#else
+#define MAYBE_AccessibilityEventsImmediateRefresh \
+  AccessibilityEventsImmediateRefresh
+#endif
 IN_PROC_BROWSER_TEST_P(NavigationApiDumpAccessibilityEventsTest,
-                       AccessibilityEventsImmediateRefresh) {
+                       MAYBE_AccessibilityEventsImmediateRefresh) {
   RunEventTest(FILE_PATH_LITERAL("immediate-refresh.html"));
 }
 
diff --git a/content/browser/first_party_sets/database/first_party_sets_database.cc b/content/browser/first_party_sets/database/first_party_sets_database.cc
index e3c58903..254c733 100644
--- a/content/browser/first_party_sets/database/first_party_sets_database.cc
+++ b/content/browser/first_party_sets/database/first_party_sets_database.cc
@@ -96,7 +96,7 @@
       "CREATE TABLE IF NOT EXISTS policy_modifications("
       "browser_context_id TEXT NOT NULL,"
       "site TEXT NOT NULL,"
-      "site_owner TEXT,"  // May be NULL if this row represents a deletion.
+      "primary_site TEXT,"  // May be NULL if this row represents a deletion.
       "PRIMARY KEY(browser_context_id,site)"
       ")WITHOUT ROWID";
   if (!db.Execute(kPolicyModificationsSql))
@@ -143,9 +143,11 @@
   if (!transaction.Begin())
     return false;
 
-  if (!SetPublicSets(browser_context_id, public_sets_version, sets)) {
+  if (!SetPublicSets(browser_context_id, public_sets_version, sets))
     return false;
-  }
+
+  if (!InsertPolicyModifications(browser_context_id, config))
+    return false;
 
   return transaction.Commit();
 }
@@ -271,17 +273,9 @@
 
 bool FirstPartySetsDatabase::InsertPolicyModifications(
     const std::string& browser_context_id,
-    const base::flat_map<net::SchemefulSite,
-                         absl::optional<net::FirstPartySetEntry>>&
-        modificatons) {
+    const net::FirstPartySetsContextConfig& config) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  if (!LazyInit())
-    return false;
-
-  sql::Transaction transaction(db_.get());
-  if (!transaction.Begin())
-    return false;
+  DCHECK_EQ(db_status_, InitStatus::kSuccess);
 
   static constexpr char kDeleteSql[] =
       "DELETE FROM policy_modifications WHERE browser_context_id=?";
@@ -291,25 +285,26 @@
   if (!delete_statement.Run())
     return false;
 
-  for (const auto& [site, owner] : modificatons) {
-    DCHECK(!site.opaque());
-    static constexpr char kInsertSql[] =
-        "INSERT INTO policy_modifications(browser_context_id,site,site_owner)"
-        "VALUES(?,?,?)";
-    sql::Statement insert_statement(
-        db_->GetCachedStatement(SQL_FROM_HERE, kInsertSql));
-    insert_statement.BindString(0, browser_context_id);
-    insert_statement.BindString(1, site.Serialize());
-    if (owner.has_value()) {
-      insert_statement.BindString(2, owner.value().primary().Serialize());
-    } else {
-      insert_statement.BindNull(2);
-    }
-
-    if (!insert_statement.Run())
-      return false;
-  }
-  return transaction.Commit();
+  return config.ForEachCustomizationEntry(
+      [&](const net::SchemefulSite& site,
+          const absl::optional<net::FirstPartySetEntry>& entry) -> bool {
+        DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+        DCHECK(!site.opaque());
+        static constexpr char kInsertSql[] =
+            "INSERT INTO "
+            "policy_modifications(browser_context_id,site,primary_site)"
+            "VALUES(?,?,?)";
+        sql::Statement insert_statement(
+            db_->GetCachedStatement(SQL_FROM_HERE, kInsertSql));
+        insert_statement.BindString(0, browser_context_id);
+        insert_statement.BindString(1, site.Serialize());
+        if (entry.has_value()) {
+          insert_statement.BindString(2, entry.value().primary().Serialize());
+        } else {
+          insert_statement.BindNull(2);
+        }
+        return insert_statement.Run();
+      });
 }
 
 net::GlobalFirstPartySets FirstPartySetsDatabase::GetGlobalSets(
@@ -442,7 +437,7 @@
   return results;
 }
 
-base::flat_map<net::SchemefulSite, absl::optional<net::FirstPartySetEntry>>
+net::FirstPartySetsContextConfig
 FirstPartySetsDatabase::FetchPolicyModifications(
     const std::string& browser_context_id) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -455,7 +450,7 @@
       results;
   static constexpr char kSelectSql[] =
       // clang-format off
-      "SELECT site,site_owner FROM policy_modifications "
+      "SELECT site,primary_site FROM policy_modifications "
       "WHERE browser_context_id=?";
   // clang-format on
   sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSelectSql));
@@ -466,9 +461,9 @@
         FirstPartySetParser::CanonicalizeRegisteredDomain(
             statement.ColumnString(0), /*emit_errors=*/false);
 
-    absl::optional<net::SchemefulSite> maybe_site_owner;
+    absl::optional<net::SchemefulSite> maybe_primary_site;
     if (statement.ColumnString(1) != "") {
-      maybe_site_owner = FirstPartySetParser::CanonicalizeRegisteredDomain(
+      maybe_primary_site = FirstPartySetParser::CanonicalizeRegisteredDomain(
           statement.ColumnString(1), /*emit_errors=*/false);
     }
 
@@ -477,9 +472,9 @@
     if (site.has_value()) {
       results.emplace_back(
           std::move(site.value()),
-          maybe_site_owner.has_value()
+          maybe_primary_site.has_value()
               ? absl::make_optional(net::FirstPartySetEntry(
-                    maybe_site_owner.value(),
+                    maybe_primary_site.value(),
                     // TODO(https://crbug.com/1219656): May change to use the
                     // real site_type and site_index in the future, depending on
                     // the design details. Use kAssociated as default site type
@@ -491,7 +486,7 @@
   if (!statement.Succeeded())
     return {};
 
-  return results;
+  return net::FirstPartySetsContextConfig(std::move(results));
 }
 
 bool FirstPartySetsDatabase::LazyInit() {
diff --git a/content/browser/first_party_sets/database/first_party_sets_database.h b/content/browser/first_party_sets/database/first_party_sets_database.h
index 865148e..7b818f4 100644
--- a/content/browser/first_party_sets/database/first_party_sets_database.h
+++ b/content/browser/first_party_sets/database/first_party_sets_database.h
@@ -23,7 +23,6 @@
 }  // namespace base
 
 namespace net {
-class FirstPartySetEntry;
 class GlobalFirstPartySets;
 class SchemefulSite;
 }  // namespace net
@@ -96,9 +95,7 @@
   // wipe out the pre-existing ones for the given `browser_context_id`.
   [[nodiscard]] bool InsertPolicyModifications(
       const std::string& browser_context_id,
-      const base::flat_map<net::SchemefulSite,
-                           absl::optional<net::FirstPartySetEntry>>&
-          modificatons);
+      const net::FirstPartySetsContextConfig& config);
 
   // TODO(crbug.com/1219656): Consider returning absl::nullopt for all the
   // fetching methods when having query errors
@@ -119,9 +116,8 @@
 
   // Gets the previously-stored policy modifications for the
   // `browser_context_id`.
-  [[nodiscard]] base::flat_map<net::SchemefulSite,
-                               absl::optional<net::FirstPartySetEntry>>
-  FetchPolicyModifications(const std::string& browser_context_id);
+  [[nodiscard]] net::FirstPartySetsContextConfig FetchPolicyModifications(
+      const std::string& browser_context_id);
 
  private:
   FRIEND_TEST_ALL_PREFIXES(FirstPartySetsDatabaseTest,
diff --git a/content/browser/first_party_sets/database/first_party_sets_database_unittest.cc b/content/browser/first_party_sets/database/first_party_sets_database_unittest.cc
index afbb3a06..69fb04c 100644
--- a/content/browser/first_party_sets/database/first_party_sets_database_unittest.cc
+++ b/content/browser/first_party_sets/database/first_party_sets_database_unittest.cc
@@ -152,7 +152,7 @@
       3u, sql::test::CountTableColumns(&db, "browser_context_sites_to_clear"));
   // `browser_context_id`, `cleared_at_run`.
   EXPECT_EQ(2u, sql::test::CountTableColumns(&db, "browser_contexts_cleared"));
-  // `browser_context_id`, `site`, `site_owner`.
+  // `browser_context_id`, `site`, `primary_site`.
   EXPECT_EQ(3u, sql::test::CountTableColumns(&db, "policy_modifications"));
   EXPECT_EQ(0u, CountPublicSetsEntries(&db));
   EXPECT_EQ(0u, CountBrowserContextSetsVersionEntries(&db));
@@ -175,7 +175,7 @@
   EXPECT_TRUE(db.Open(db_path()));
   EXPECT_EQ(kTableCount, sql::test::CountSQLTables(&db));
   EXPECT_EQ(2u, CountPublicSetsEntries(&db));
-  EXPECT_EQ(1u, CountBrowserContextSetsVersionEntries(&db));
+  EXPECT_EQ(3u, CountBrowserContextSetsVersionEntries(&db));
   EXPECT_EQ(1, VersionFromMetaTable(db));
   EXPECT_EQ(2u, CountBrowserContextSitesToClearEntries(&db));
   EXPECT_EQ(1u, CountBrowserContextsClearedEntries(&db));
@@ -262,7 +262,11 @@
   const std::string site = "https://aaa.test";
   const std::string primary = "https://bbb.test";
 
-  net::GlobalFirstPartySets input(
+  const std::string primary_site = "https://example.test";
+  const std::string site_member1 = "https://member1.test";
+  const std::string site_member2 = "https://member2.test";
+
+  net::GlobalFirstPartySets global_sets(
       /*entries=*/{{net::SchemefulSite(GURL(site)),
                     net::FirstPartySetEntry(net::SchemefulSite(GURL(primary)),
                                             net::SiteType::kAssociated,
@@ -273,32 +277,40 @@
                                             absl::nullopt)}},
       /*aliases=*/{});
 
+  net::FirstPartySetsContextConfig config(
+      {{net::SchemefulSite(GURL(site_member1)),
+        net::FirstPartySetEntry(net::SchemefulSite(GURL(primary_site)),
+                                net::SiteType::kAssociated, absl::nullopt)},
+       {net::SchemefulSite(GURL(site_member2)), absl::nullopt}});
+
   OpenDatabase();
   // Trigger the lazy-initialization.
-  EXPECT_TRUE(db()->PersistSets(browser_context_id, version, input,
-                                net::FirstPartySetsContextConfig()));
+  EXPECT_TRUE(
+      db()->PersistSets(browser_context_id, version, global_sets, config));
   CloseDatabase();
 
   sql::Database db;
   EXPECT_TRUE(db.Open(db_path()));
   EXPECT_EQ(2u, CountPublicSetsEntries(&db));
+  EXPECT_EQ(2u, CountPolicyModificationsEntries(&db));
 
-  static constexpr char kSelectSql[] =
+  // ============ Verify persisting public sets
+  static constexpr char kSelectPublicSetsSql[] =
       "SELECT version,site,primary_site,site_type FROM public_sets";
-  sql::Statement s(db.GetUniqueStatement(kSelectSql));
-  EXPECT_TRUE(s.Step());
-  EXPECT_EQ(version.GetString(), s.ColumnString(0));
-  EXPECT_EQ(site, s.ColumnString(1));
-  EXPECT_EQ(primary, s.ColumnString(2));
-  EXPECT_EQ(1, s.ColumnInt(3));
+  sql::Statement s_public_sets(db.GetUniqueStatement(kSelectPublicSetsSql));
+  EXPECT_TRUE(s_public_sets.Step());
+  EXPECT_EQ(version.GetString(), s_public_sets.ColumnString(0));
+  EXPECT_EQ(site, s_public_sets.ColumnString(1));
+  EXPECT_EQ(primary, s_public_sets.ColumnString(2));
+  EXPECT_EQ(1, s_public_sets.ColumnInt(3));
 
-  EXPECT_TRUE(s.Step());
-  EXPECT_EQ(version.GetString(), s.ColumnString(0));
-  EXPECT_EQ(primary, s.ColumnString(1));
-  EXPECT_EQ(primary, s.ColumnString(2));
-  EXPECT_EQ(0, s.ColumnInt(3));
+  EXPECT_TRUE(s_public_sets.Step());
+  EXPECT_EQ(version.GetString(), s_public_sets.ColumnString(0));
+  EXPECT_EQ(primary, s_public_sets.ColumnString(1));
+  EXPECT_EQ(primary, s_public_sets.ColumnString(2));
+  EXPECT_EQ(0, s_public_sets.ColumnInt(3));
 
-  EXPECT_FALSE(s.Step());
+  EXPECT_FALSE(s_public_sets.Step());
 
   static constexpr char kVersionSql[] =
       "SELECT browser_context_id,public_sets_version "
@@ -309,40 +321,78 @@
   EXPECT_EQ(version.GetString(), s_version.ColumnString(1));
 
   EXPECT_FALSE(s_version.Step());
+
+  // ============ Verify persisting context config
+  const char kSelectConfigSql[] =
+      "SELECT browser_context_id,site,primary_site FROM policy_modifications";
+  sql::Statement s_config(db.GetUniqueStatement(kSelectConfigSql));
+  EXPECT_TRUE(s_config.Step());
+  EXPECT_EQ(browser_context_id, s_config.ColumnString(0));
+  EXPECT_EQ(site_member1, s_config.ColumnString(1));
+  EXPECT_EQ(primary_site, s_config.ColumnString(2));
+
+  EXPECT_TRUE(s_config.Step());
+  EXPECT_EQ(browser_context_id, s_config.ColumnString(0));
+  EXPECT_EQ(site_member2, s_config.ColumnString(1));
+  EXPECT_EQ("", s_config.ColumnString(2));
+
+  EXPECT_FALSE(s_config.Step());
 }
 
 TEST_F(FirstPartySetsDatabaseTest, PersistSets_PreExistingDB) {
   ASSERT_TRUE(
       sql::test::CreateDatabaseFromSQL(db_path(), GetSqlFilePath("v1.sql")));
 
+  const std::string browser_context_id = "b2";
   // Verify data in the pre-existing DB.
   {
     sql::Database db;
     ASSERT_TRUE(db.Open(db_path()));
     ASSERT_EQ(kTableCount, sql::test::CountSQLTables(&db));
     ASSERT_EQ(2u, CountPublicSetsEntries(&db));
+    ASSERT_EQ(2u, CountPolicyModificationsEntries(&db));
 
-    static constexpr char kSelectSql[] =
+    // Verify data in the public_sets table.
+    static constexpr char kSelectPublicSetsSql[] =
         "SELECT version,site,primary_site,site_type FROM public_sets";
-    sql::Statement s(db.GetUniqueStatement(kSelectSql));
-    ASSERT_TRUE(s.Step());
-    ASSERT_EQ("0.0.1", s.ColumnString(0));
-    ASSERT_EQ("https://aaa.test", s.ColumnString(1));
-    ASSERT_EQ("https://bbb.test", s.ColumnString(2));
-    ASSERT_EQ(1, s.ColumnInt(3));
+    sql::Statement s_public_sets(db.GetUniqueStatement(kSelectPublicSetsSql));
+    ASSERT_TRUE(s_public_sets.Step());
+    ASSERT_EQ("0.0.1", s_public_sets.ColumnString(0));
+    ASSERT_EQ("https://aaa.test", s_public_sets.ColumnString(1));
+    ASSERT_EQ("https://bbb.test", s_public_sets.ColumnString(2));
+    ASSERT_EQ(1, s_public_sets.ColumnInt(3));
 
-    ASSERT_TRUE(s.Step());
-    ASSERT_EQ("0.0.1", s.ColumnString(0));
-    ASSERT_EQ("https://bbb.test", s.ColumnString(1));
-    ASSERT_EQ("https://bbb.test", s.ColumnString(2));
-    ASSERT_EQ(0, s.ColumnInt(3));
+    ASSERT_TRUE(s_public_sets.Step());
+    ASSERT_EQ("0.0.1", s_public_sets.ColumnString(0));
+    ASSERT_EQ("https://bbb.test", s_public_sets.ColumnString(1));
+    ASSERT_EQ("https://bbb.test", s_public_sets.ColumnString(2));
+    ASSERT_EQ(0, s_public_sets.ColumnInt(3));
+
+    // Verify data in the policy_modifications table.
+    const char kSelectConfigSql[] =
+        "SELECT browser_context_id,site,primary_site FROM policy_modifications";
+    sql::Statement s_config(db.GetUniqueStatement(kSelectConfigSql));
+    EXPECT_TRUE(s_config.Step());
+    EXPECT_EQ(browser_context_id, s_config.ColumnString(0));
+    EXPECT_EQ("https://member1.test", s_config.ColumnString(1));
+    EXPECT_EQ("https://example.test", s_config.ColumnString(2));
+
+    EXPECT_TRUE(s_config.Step());
+    EXPECT_EQ(browser_context_id, s_config.ColumnString(0));
+    EXPECT_EQ("https://member2.test", s_config.ColumnString(1));
+    EXPECT_EQ("", s_config.ColumnString(2));
+
+    EXPECT_FALSE(s_config.Step());
   }
   const base::Version version("0.0.2");
-  const std::string browser_context_id = "b";
   const std::string site = "https://site1.test";
   const std::string primary = "https://site2.test";
 
-  net::GlobalFirstPartySets input(
+  const std::string primary_site = "https://example2.test";
+  const std::string site_member1 = "https://member3.test";
+  const std::string site_member2 = "https://member4.test";
+
+  net::GlobalFirstPartySets global_sets(
       /*entries=*/{{net::SchemefulSite(GURL(site)),
                     net::FirstPartySetEntry(net::SchemefulSite(GURL(primary)),
                                             net::SiteType::kAssociated,
@@ -353,33 +403,41 @@
                                             absl::nullopt)}},
       /*aliases=*/{});
 
+  net::FirstPartySetsContextConfig config(
+      {{net::SchemefulSite(GURL(site_member1)),
+        net::FirstPartySetEntry(net::SchemefulSite(GURL(primary_site)),
+                                net::SiteType::kAssociated, absl::nullopt)},
+       {net::SchemefulSite(GURL(site_member2)), absl::nullopt}});
+
   OpenDatabase();
   // Trigger the lazy-initialization.
-  EXPECT_TRUE(db()->PersistSets(browser_context_id, version, input,
-                                net::FirstPartySetsContextConfig()));
+  EXPECT_TRUE(
+      db()->PersistSets(browser_context_id, version, global_sets, config));
   CloseDatabase();
 
   // Verify data is inserted.
   sql::Database db;
   EXPECT_TRUE(db.Open(db_path()));
   EXPECT_EQ(4u, CountPublicSetsEntries(&db));
+  EXPECT_EQ(2u, CountPolicyModificationsEntries(&db));
 
-  static constexpr char kSelectSql[] =
+  // ============ Verify persisting public sets
+  static constexpr char kSelectPublicSetsSql[] =
       "SELECT site,primary_site,site_type FROM public_sets "
       "WHERE version=?";
-  sql::Statement s(db.GetUniqueStatement(kSelectSql));
-  s.BindString(0, version.GetString());
-  EXPECT_TRUE(s.Step());
-  EXPECT_EQ(site, s.ColumnString(0));
-  EXPECT_EQ(primary, s.ColumnString(1));
-  EXPECT_EQ(1, s.ColumnInt(2));
+  sql::Statement s_public_sets(db.GetUniqueStatement(kSelectPublicSetsSql));
+  s_public_sets.BindString(0, version.GetString());
+  EXPECT_TRUE(s_public_sets.Step());
+  EXPECT_EQ(site, s_public_sets.ColumnString(0));
+  EXPECT_EQ(primary, s_public_sets.ColumnString(1));
+  EXPECT_EQ(1, s_public_sets.ColumnInt(2));
 
-  EXPECT_TRUE(s.Step());
-  EXPECT_EQ(primary, s.ColumnString(0));
-  EXPECT_EQ(primary, s.ColumnString(1));
-  EXPECT_EQ(0, s.ColumnInt(2));
+  EXPECT_TRUE(s_public_sets.Step());
+  EXPECT_EQ(primary, s_public_sets.ColumnString(0));
+  EXPECT_EQ(primary, s_public_sets.ColumnString(1));
+  EXPECT_EQ(0, s_public_sets.ColumnInt(2));
 
-  EXPECT_FALSE(s.Step());
+  EXPECT_FALSE(s_public_sets.Step());
 
   static constexpr char kVersionSql[] =
       "SELECT public_sets_version FROM browser_context_sets_version "
@@ -390,6 +448,24 @@
   EXPECT_EQ(version.GetString(), s_version.ColumnString(0));
 
   EXPECT_FALSE(s_version.Step());
+
+  // ============ Verify the new context config overwrote the pre-existing
+  // data.
+  const char kSelectConfigSql[] =
+      "SELECT browser_context_id,site,primary_site FROM policy_modifications "
+      "WHERE browser_context_id=?";
+  sql::Statement s_config(db.GetUniqueStatement(kSelectConfigSql));
+  s_config.BindString(0, browser_context_id);
+  EXPECT_TRUE(s_config.Step());
+  EXPECT_EQ(browser_context_id, s_config.ColumnString(0));
+  EXPECT_EQ(site_member1, s_config.ColumnString(1));
+  EXPECT_EQ(primary_site, s_config.ColumnString(2));
+
+  EXPECT_TRUE(s_config.Step());
+  EXPECT_EQ(browser_context_id, s_config.ColumnString(0));
+  EXPECT_EQ(site_member2, s_config.ColumnString(1));
+  EXPECT_EQ("", s_config.ColumnString(2));
+  EXPECT_FALSE(s_config.Step());
 }
 
 TEST_F(FirstPartySetsDatabaseTest, PersistSets_PreExistingVersion) {
@@ -641,117 +717,6 @@
   EXPECT_FALSE(s.Step());
 }
 
-TEST_F(FirstPartySetsDatabaseTest, InsertPolicymodifications_NoPreExistingDB) {
-  const std::string browser_context_id = "b";
-  const std::string site_owner = "https://example.test";
-  const std::string site_member1 = "https://member1.test";
-  const std::string site_member2 = "https://member2.test";
-
-  base::flat_map<net::SchemefulSite, absl::optional<net::FirstPartySetEntry>>
-      input = {
-          {net::SchemefulSite(GURL(site_member1)),
-           net::FirstPartySetEntry(net::SchemefulSite(GURL(site_owner)),
-                                   net::SiteType::kAssociated, absl::nullopt)},
-          {net::SchemefulSite(GURL(site_member2)), absl::nullopt}};
-
-  OpenDatabase();
-  // Trigger the lazy-initialization.
-  EXPECT_TRUE(db()->InsertPolicyModifications(browser_context_id, input));
-  CloseDatabase();
-
-  sql::Database db;
-  EXPECT_TRUE(db.Open(db_path()));
-  EXPECT_EQ(2u, CountPolicyModificationsEntries(&db));
-
-  const char kSelectSql[] =
-      "SELECT browser_context_id,site,site_owner FROM policy_modifications";
-  sql::Statement s(db.GetUniqueStatement(kSelectSql));
-  EXPECT_TRUE(s.Step());
-  EXPECT_EQ(browser_context_id, s.ColumnString(0));
-  EXPECT_EQ(site_member1, s.ColumnString(1));
-  EXPECT_EQ(site_owner, s.ColumnString(2));
-
-  EXPECT_TRUE(s.Step());
-  EXPECT_EQ(browser_context_id, s.ColumnString(0));
-  EXPECT_EQ(site_member2, s.ColumnString(1));
-  EXPECT_EQ("", s.ColumnString(2));
-
-  EXPECT_FALSE(s.Step());
-}
-
-TEST_F(FirstPartySetsDatabaseTest, InsertPolicymodifications_PreExistingDB) {
-  ASSERT_TRUE(
-      sql::test::CreateDatabaseFromSQL(db_path(), GetSqlFilePath("v1.sql")));
-
-  const std::string browser_context_id = "b2";
-  // Verify data in the pre-existing DB, and set `pre_run_count`.
-  {
-    sql::Database db;
-    ASSERT_TRUE(db.Open(db_path()));
-    ASSERT_EQ(kTableCount, sql::test::CountSQLTables(&db));
-    ASSERT_EQ(2u, CountPolicyModificationsEntries(&db));
-
-    const char kSelectSql[] =
-        "SELECT browser_context_id,site,site_owner FROM policy_modifications "
-        "WHERE browser_context_id=?";
-    sql::Statement s(db.GetUniqueStatement(kSelectSql));
-    s.BindString(0, browser_context_id);
-    ASSERT_TRUE(s.Step());
-    ASSERT_EQ("b2", s.ColumnString(0));
-    ASSERT_EQ("https://member1.test", s.ColumnString(1));
-    ASSERT_EQ("https://example.test", s.ColumnString(2));
-
-    ASSERT_TRUE(s.Step());
-    ASSERT_EQ("b2", s.ColumnString(0));
-    ASSERT_EQ("https://member2.test", s.ColumnString(1));
-    ASSERT_EQ("", s.ColumnString(2));
-    ASSERT_FALSE(s.Step());
-  }
-
-  const std::string site_owner = "https://example2.test";
-  const std::string site_member1 = "https://member3.test";
-  const std::string site_member2 = "https://member4.test";
-
-  base::flat_map<net::SchemefulSite, absl::optional<net::FirstPartySetEntry>>
-      input = {
-          {net::SchemefulSite(GURL(site_member1)),
-           net::FirstPartySetEntry(net::SchemefulSite(GURL(site_owner)),
-                                   net::SiteType::kAssociated, absl::nullopt)},
-          {net::SchemefulSite(GURL(site_member2)), absl::nullopt}};
-
-  OpenDatabase();
-  // Trigger the lazy-initialization.
-  EXPECT_TRUE(db()->InsertPolicyModifications(browser_context_id, input));
-  CloseDatabase();
-
-  // Verify the inserted data overwrote the pre-existing data.
-  sql::Database db;
-  EXPECT_TRUE(db.Open(db_path()));
-  EXPECT_EQ(kTableCount, sql::test::CountSQLTables(&db));
-  EXPECT_EQ(2u, CountPolicyModificationsEntries(&db));
-
-  const char kSelectSql[] =
-      "SELECT browser_context_id,site,site_owner FROM policy_modifications "
-      "WHERE browser_context_id=?";
-  sql::Statement s(db.GetUniqueStatement(kSelectSql));
-  s.BindString(0, browser_context_id);
-  EXPECT_TRUE(s.Step());
-  EXPECT_EQ("b2", s.ColumnString(0));
-  EXPECT_EQ(site_member1, s.ColumnString(1));
-  EXPECT_EQ(site_owner, s.ColumnString(2));
-
-  EXPECT_TRUE(s.Step());
-  EXPECT_EQ("b2", s.ColumnString(0));
-  EXPECT_EQ(site_member2, s.ColumnString(1));
-  EXPECT_EQ("", s.ColumnString(2));
-  EXPECT_FALSE(s.Step());
-}
-
-TEST_F(FirstPartySetsDatabaseTest, FetchSitesToClear_NoPreExistingDB) {
-  OpenDatabase();
-  EXPECT_EQ(std::vector<net::SchemefulSite>(), db()->FetchSitesToClear("b"));
-}
-
 TEST_F(FirstPartySetsDatabaseTest, FetchSitesToClear_BrowserContextNotExist) {
   ASSERT_TRUE(
       sql::test::CreateDatabaseFromSQL(db_path(), GetSqlFilePath("v1.sql")));
@@ -876,7 +841,7 @@
 
 TEST_F(FirstPartySetsDatabaseTest, FetchPolicyModifications_NoPreExistingDB) {
   OpenDatabase();
-  EXPECT_THAT(db()->FetchPolicyModifications("b"), IsEmpty());
+  EXPECT_TRUE(db()->FetchPolicyModifications("b").empty());
 }
 
 TEST_F(FirstPartySetsDatabaseTest, FetchPolicyModifications) {
@@ -890,16 +855,15 @@
     EXPECT_EQ(kTableCount, sql::test::CountSQLTables(&db));
     EXPECT_EQ(2u, CountPolicyModificationsEntries(&db));
   }
-  base::flat_map<net::SchemefulSite, absl::optional<net::FirstPartySetEntry>>
-      res = {
-          {net::SchemefulSite(GURL("https://member1.test")),
-           net::FirstPartySetEntry(
-               {net::SchemefulSite(GURL("https://example.test"))},
-               net::SiteType::kAssociated, absl::nullopt)},
-          {net::SchemefulSite(GURL("https://member2.test")), absl::nullopt},
-      };
+  net::FirstPartySetsContextConfig res({
+      {net::SchemefulSite(GURL("https://member1.test")),
+       net::FirstPartySetEntry(
+           {net::SchemefulSite(GURL("https://example.test"))},
+           net::SiteType::kAssociated, absl::nullopt)},
+      {net::SchemefulSite(GURL("https://member2.test")), absl::nullopt},
+  });
   OpenDatabase();
-  EXPECT_THAT(db()->FetchPolicyModifications("b2"), res);
+  EXPECT_EQ(db()->FetchPolicyModifications("b2"), res);
 }
 
 TEST_F(FirstPartySetsDatabaseTest, GetGlobalSets_NoPreExistingDB) {
@@ -919,7 +883,7 @@
     sql::Database db;
     EXPECT_TRUE(db.Open(db_path()));
     EXPECT_EQ(2u, CountPublicSetsEntries(&db));
-    EXPECT_EQ(1u, CountBrowserContextSetsVersionEntries(&db));
+    EXPECT_EQ(3u, CountBrowserContextSetsVersionEntries(&db));
   }
   const net::SchemefulSite aaa(GURL("https://aaa.test"));
   const net::SchemefulSite bbb(GURL("https://bbb.test"));
diff --git a/content/browser/first_party_sets/first_party_sets_handler_database_helper.cc b/content/browser/first_party_sets/first_party_sets_handler_database_helper.cc
index a5f856d..a467bc6 100644
--- a/content/browser/first_party_sets/first_party_sets_handler_database_helper.cc
+++ b/content/browser/first_party_sets/first_party_sets_handler_database_helper.cc
@@ -56,13 +56,14 @@
 
   old_config.ForEachCustomizationEntry(
       [&](const net::SchemefulSite& old_member,
-          const absl::optional<net::FirstPartySetEntry>& old_entry) {
+          const absl::optional<net::FirstPartySetEntry>& old_entry) -> bool {
         const absl::optional<net::FirstPartySetEntry> current_entry =
             current_sets.FindEntry(old_member, &current_config);
         // Look for the ones have owner changed.
         if (old_entry.has_value() && current_entry != old_entry) {
           result.push_back(old_member);
         }
+        return true;
       });
 
   return result;
@@ -77,8 +78,7 @@
   DCHECK(!browser_context_id.empty());
   base::flat_set<net::SchemefulSite> diff =
       ComputeSetsDiff(db_->GetGlobalSets(browser_context_id),
-                      net::FirstPartySetsContextConfig(
-                          db_->FetchPolicyModifications(browser_context_id)),
+                      db_->FetchPolicyModifications(browser_context_id),
                       current_sets, current_config);
 
   if (!db_->InsertSitesToClear(browser_context_id, diff)) {
diff --git a/content/browser/loader/cross_site_document_blocking_browsertest.cc b/content/browser/loader/cross_site_document_blocking_browsertest.cc
index e500bcb..79a10b3 100644
--- a/content/browser/loader/cross_site_document_blocking_browsertest.cc
+++ b/content/browser/loader/cross_site_document_blocking_browsertest.cc
@@ -1623,9 +1623,7 @@
 // e.g. <script type=webbundle>...</script>
 class CrossSiteDocumentBlockingWebBundleTest : public ContentBrowserTest {
  public:
-  CrossSiteDocumentBlockingWebBundleTest() {
-    scoped_feature_list_.InitAndEnableFeature(features::kSubresourceWebBundles);
-  }
+  CrossSiteDocumentBlockingWebBundleTest() = default;
   ~CrossSiteDocumentBlockingWebBundleTest() override = default;
 
   CrossSiteDocumentBlockingWebBundleTest(
diff --git a/content/browser/preloading/prerender/prerender_browsertest.cc b/content/browser/preloading/prerender/prerender_browsertest.cc
index 7fc22246..f54e60c 100644
--- a/content/browser/preloading/prerender/prerender_browsertest.cc
+++ b/content/browser/preloading/prerender/prerender_browsertest.cc
@@ -33,6 +33,7 @@
 #include "content/browser/file_system_access/file_system_chooser_test_helpers.h"
 #include "content/browser/portal/portal.h"
 #include "content/browser/preloading/preloading.h"
+#include "content/browser/preloading/preloading_attempt_impl.h"
 #include "content/browser/preloading/prerender/prerender_host.h"
 #include "content/browser/preloading/prerender/prerender_host_registry.h"
 #include "content/browser/preloading/prerender/prerender_metrics.h"
@@ -4031,6 +4032,37 @@
   histogram_tester().ExpectBucketCount(
       "Prerender.Experimental.PrerenderHostFinalStatus.SpeculationRule",
       PrerenderHost::FinalStatus::kActivatedBeforeStarted, 1);
+
+  {
+    ukm::SourceId ukm_source_id = PrimaryPageSourceId();
+
+    auto ukm_entries = test_ukm_recorder()->GetEntries(
+        Preloading_Attempt::kEntryName, test::kPreloadingAttemptUkmMetrics);
+    EXPECT_EQ(ukm_entries.size(), 2u);
+
+    std::vector<UkmEntry> expected_entries = {
+        attempt_ukm_entry_builder().BuildEntry(
+            ukm_source_id, PreloadingType::kPrerender,
+            PreloadingEligibility::kEligible,
+            PreloadingHoldbackStatus::kAllowed,
+            PreloadingTriggeringOutcome::kRunning,
+            PreloadingFailureReason::kUnspecified,
+            /*accurate=*/false),
+        attempt_ukm_entry_builder().BuildEntry(
+            ukm_source_id, PreloadingType::kPrerender,
+            PreloadingEligibility::kEligible,
+            PreloadingHoldbackStatus::kAllowed,
+            PreloadingTriggeringOutcome::kFailure,
+            ToPreloadingFailureReason(
+                PrerenderHost::FinalStatus::kActivatedBeforeStarted),
+            /*accurate=*/true),
+    };
+
+    EXPECT_THAT(ukm_entries,
+                testing::UnorderedElementsAreArray(expected_entries))
+        << content::test::ActualVsExpectedUkmEntriesToString(ukm_entries,
+                                                             expected_entries);
+  }
 }
 
 // Test that if the 4 URLs are specified in the speculation rule while only 3
@@ -4253,6 +4285,105 @@
       PrerenderHost::FinalStatus::kActivated, 1);
 }
 
+// Test that a pending prerender should have the
+// `PreloadingTriggeringOutcome::kUnspecified`.
+// TODO(crbug.com/1355151): Add another outcome for the pending prerender like
+// PreloadingTriggeringOutcome::kTriggeredButPending if necessary.
+IN_PROC_BROWSER_TEST_F(PrerenderSequentialPrerenderingBrowserTest,
+                       PreloadingTriggeringOutcomeForPendingPrerender) {
+  net::test_server::ControllableHttpResponse response1(
+      embedded_test_server(), "/empty.html?prerender1");
+  ASSERT_TRUE(embedded_test_server()->Start());
+  const GURL kInitialUrl = embedded_test_server()->GetURL("/empty.html");
+  const GURL kPrerender1 =
+      embedded_test_server()->GetURL("/empty.html?prerender1");
+  const GURL kPrerender2 =
+      embedded_test_server()->GetURL("/empty.html?prerender2");
+
+  ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl));
+
+  test::PrerenderHostRegistryObserver registry_observer(*web_contents_impl());
+
+  // Insert 2 URLs into the speculation rules at the same time.
+  AddMultiplePrerenderAsync({kPrerender1, kPrerender2});
+  registry_observer.WaitForTrigger(kPrerender2);
+
+  // Stop the first prerendering initial navigation.
+  response1.WaitForRequest();
+
+  // The pending host should have `PreloadingTriggeringOutcome::kUnspecified`.
+  PrerenderHost* prerender2_host =
+      web_contents_impl()->GetPrerenderHostRegistry()->FindHostByUrlForTesting(
+          kPrerender2);
+  auto* preloading_attempt_impl = static_cast<PreloadingAttemptImpl*>(
+      prerender2_host->preloading_attempt().get());
+  EXPECT_EQ(preloading_attempt_impl->get_triggering_outcome_for_testing(),
+            PreloadingTriggeringOutcome::kUnspecified);
+
+  NavigationHandleObserver activation_observer(web_contents(), kPrerender1);
+  test::PrerenderHostObserver prerender1_observer(*web_contents(),
+                                                  GetHostForUrl(kPrerender1));
+
+  // Defer the activation until the ongoing initial navigation in preerender
+  // frame tree commits.
+  TestActivationManager primary_page_manager(shell()->web_contents(),
+                                             kPrerender1);
+  ASSERT_TRUE(ExecJs(shell()->web_contents()->GetPrimaryMainFrame(),
+                     JsReplace("location = $1", kPrerender1)));
+
+  NavigationRequest* request =
+      web_contents_impl()->GetPrimaryFrameTree().root()->navigation_request();
+
+  // Wait until the activation navigation is deferred by
+  // CommitDeferringCondition.
+  ASSERT_TRUE(primary_page_manager.WaitForBeforeChecks());
+  primary_page_manager.ResumeActivation();
+
+  // Confirm that the activation navigation is deferred.
+  EXPECT_TRUE(request->IsCommitDeferringConditionDeferredForTesting());
+
+  // Complete the first prerender response and finish its initial navigation.
+  response1.Send(net::HTTP_OK, "");
+  response1.Done();
+
+  primary_page_manager.WaitForNavigationFinished();
+  prerender1_observer.WaitForActivation();
+
+  // The prerender1 should succeed in activation and have kSuccess outcome.
+  // The prerender2 should start right after the activation but get destroyed by
+  // the change of the primary page soon, so it should result in the kRunning
+  // outcome.
+  {
+    ukm::SourceId ukm_source_id = activation_observer.next_page_ukm_source_id();
+
+    auto ukm_entries = test_ukm_recorder()->GetEntries(
+        Preloading_Attempt::kEntryName, test::kPreloadingAttemptUkmMetrics);
+    EXPECT_EQ(ukm_entries.size(), 2u);
+
+    std::vector<UkmEntry> expected_entries = {
+        attempt_ukm_entry_builder().BuildEntry(
+            ukm_source_id, PreloadingType::kPrerender,
+            PreloadingEligibility::kEligible,
+            PreloadingHoldbackStatus::kAllowed,
+            PreloadingTriggeringOutcome::kSuccess,
+            PreloadingFailureReason::kUnspecified,
+            /*accurate=*/true),
+        attempt_ukm_entry_builder().BuildEntry(
+            ukm_source_id, PreloadingType::kPrerender,
+            PreloadingEligibility::kEligible,
+            PreloadingHoldbackStatus::kAllowed,
+            PreloadingTriggeringOutcome::kRunning,
+            PreloadingFailureReason::kUnspecified,
+            /*accurate=*/false),
+    };
+
+    EXPECT_THAT(ukm_entries,
+                testing::UnorderedElementsAreArray(expected_entries))
+        << content::test::ActualVsExpectedUkmEntriesToString(ukm_entries,
+                                                             expected_entries);
+  }
+}
+
 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
                        IsInactiveAndDisallowActivationCancelsPrerendering) {
   const GURL kInitialUrl = GetUrl("/empty.html");
diff --git a/content/browser/preloading/prerender/prerender_host.h b/content/browser/preloading/prerender/prerender_host.h
index f80db6eb..37b5548c 100644
--- a/content/browser/preloading/prerender/prerender_host.h
+++ b/content/browser/preloading/prerender/prerender_host.h
@@ -17,6 +17,7 @@
 #include "content/browser/renderer_host/stored_page.h"
 #include "content/common/content_export.h"
 #include "content/public/browser/global_routing_id.h"
+#include "content/public/browser/preloading_data.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
@@ -273,6 +274,8 @@
     return attributes_.embedder_histogram_suffix;
   }
 
+  base::WeakPtr<PreloadingAttempt> preloading_attempt() { return attempt_; }
+
  private:
   // Records the status to UMA and UKM. `initiator_ukm_id` represents the page
   // that starts prerendering and `prerendered_ukm_id` represents the
diff --git a/content/browser/renderer_host/media/media_stream_manager_unittest.cc b/content/browser/renderer_host/media/media_stream_manager_unittest.cc
index 6b99401..bde0f035 100644
--- a/content/browser/renderer_host/media/media_stream_manager_unittest.cc
+++ b/content/browser/renderer_host/media/media_stream_manager_unittest.cc
@@ -1296,7 +1296,7 @@
   CustomSetUp(/*surface_type=*/"window");
   RequestDisplayCaptureTypeDevice();
   GetOpenDevice();
-  KeepDeviceAlive();
+  EXPECT_TRUE(KeepDeviceAlive());
   StopDevice();
 
   EXPECT_EQ(result_, blink::mojom::MediaStreamRequestResult::INVALID_STATE);
@@ -1320,7 +1320,7 @@
   CustomSetUp();
   RequestDeviceCaptureTypeAudioDevice();
   GetOpenDevice();
-  KeepDeviceAlive();
+  EXPECT_TRUE(KeepDeviceAlive());
   StopDevice();
 
   EXPECT_EQ(result_, blink::mojom::MediaStreamRequestResult::INVALID_STATE);
diff --git a/content/browser/site_per_process_web_bundle_browsertest.cc b/content/browser/site_per_process_web_bundle_browsertest.cc
index 78ee759..71c664f0 100644
--- a/content/browser/site_per_process_web_bundle_browsertest.cc
+++ b/content/browser/site_per_process_web_bundle_browsertest.cc
@@ -15,9 +15,7 @@
 class SitePerProcessWebBundleBrowserTest
     : public SitePerProcessIgnoreCertErrorsBrowserTest {
  public:
-  SitePerProcessWebBundleBrowserTest() {
-    feature_list_.InitAndEnableFeature(features::kSubresourceWebBundles);
-  }
+  SitePerProcessWebBundleBrowserTest() = default;
   void SetUpOnMainThread() override {
     SitePerProcessIgnoreCertErrorsBrowserTest::SetUpOnMainThread();
     https_server_.ServeFilesFromSourceDirectory(GetTestDataFilePath());
diff --git a/content/browser/web_package/signed_exchange_handler_unittest.cc b/content/browser/web_package/signed_exchange_handler_unittest.cc
index 38c0f45..b21bf15 100644
--- a/content/browser/web_package/signed_exchange_handler_unittest.cc
+++ b/content/browser/web_package/signed_exchange_handler_unittest.cc
@@ -916,7 +916,7 @@
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeatures(
       // enabled_features
-      {net::TransportSecurityState::kDynamicExpectCTFeature,
+      {net::kDynamicExpectCTFeature,
        net::features::kPartitionExpectCTStateByNetworkIsolationKey},
       // disabled_features
       {});
diff --git a/content/browser/web_package/signed_exchange_request_handler_browsertest.cc b/content/browser/web_package/signed_exchange_request_handler_browsertest.cc
index 5257486..b99dd9a 100644
--- a/content/browser/web_package/signed_exchange_request_handler_browsertest.cc
+++ b/content/browser/web_package/signed_exchange_request_handler_browsertest.cc
@@ -1426,7 +1426,7 @@
   SignedExchangeExpectCTReportBrowserTest() {
     feature_list_.InitWithFeatures(
         // enabled_features
-        {net::TransportSecurityState::kDynamicExpectCTFeature,
+        {net::kDynamicExpectCTFeature,
          net::features::kPartitionExpectCTStateByNetworkIsolationKey,
          // These last two are not strictly necessary, but make this test more
          // robust against enabling NetworkIsolationKeys everywhere.
diff --git a/content/browser/web_package/web_bundle_element_browsertest.cc b/content/browser/web_package/web_bundle_element_browsertest.cc
index 96232bee..8f86790 100644
--- a/content/browser/web_package/web_bundle_element_browsertest.cc
+++ b/content/browser/web_package/web_bundle_element_browsertest.cc
@@ -132,8 +132,7 @@
  protected:
   WebBundleElementBrowserTest() {
     feature_list_.InitWithFeatures(
-        {features::kSubresourceWebBundles},
-        {net::features::kForceIsolationInfoFrameOriginToTopLevelFrame});
+        {}, {net::features::kForceIsolationInfoFrameOriginToTopLevelFrame});
   }
   ~WebBundleElementBrowserTest() override = default;
 
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 6a89534..c4ea72a 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -269,7 +269,6 @@
     {wf::EnableSharedArrayBufferOnDesktop,
      features::kSharedArrayBufferOnDesktop},
     {wf::EnableSharedAutofill, autofill::features::kAutofillSharedAutofill},
-    {wf::EnableSubresourceWebBundles, features::kSubresourceWebBundles},
     {wf::EnableTouchDragAndContextMenu, features::kTouchDragAndContextMenu},
     {wf::EnableUserActivationSameOriginVisibility,
      features::kUserActivationSameOriginVisibility},
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index f8637cb..2a8cd75 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -1114,11 +1114,6 @@
              "StrictOriginIsolation",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// Enables subresource loading with Web Bundles.
-BASE_FEATURE(kSubresourceWebBundles,
-             "SubresourceWebBundles",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 // Disallows window.{alert, prompt, confirm} if triggered inside a subframe that
 // is not same origin with the main frame.
 BASE_FEATURE(kSuppressDifferentOriginSubframeJSDialogs,
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 9dab4ab..d4aa4ff 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -250,7 +250,6 @@
 };
 CONTENT_EXPORT extern const base::FeatureParam<SubframeShutdownDelayType>
     kSubframeShutdownDelayTypeParam;
-CONTENT_EXPORT BASE_DECLARE_FEATURE(kSubresourceWebBundles);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kSuppressDifferentOriginSubframeJSDialogs);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kSyntheticPointerActions);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kThreadingOptimizationsOnIO);
diff --git a/content/test/data/first_party_sets/v0.init_too_old.sql b/content/test/data/first_party_sets/v0.init_too_old.sql
index bbd11db..43a9593d 100644
--- a/content/test/data/first_party_sets/v0.init_too_old.sql
+++ b/content/test/data/first_party_sets/v0.init_too_old.sql
@@ -18,7 +18,7 @@
 CREATE TABLE IF NOT EXISTS policy_modifications (
    browser_context_id TEXT NOT NULL,
    site TEXT NOT NULL,
-   site_owner TEXT, -- May be NULL if this row represents a deletion.
+   primary_site TEXT, -- May be NULL if this row represents a deletion.
    PRIMARY KEY (browser_context_id, site)
 ) WITHOUT ROWID;
 
@@ -46,7 +46,9 @@
 
 INSERT INTO public_sets VALUES('0.0.1', 'https://aaa.test', 'https://bbb.test', 1),
                               ('0.0.1', 'https://bbb.test', 'https://bbb.test', 0);
-INSERT INTO browser_context_sets_version VALUES('b0', '0.0.1');
+INSERT INTO browser_context_sets_version VALUES('b0', '0.0.1'),
+                                               ('b1', '0.0.1'),
+                                               ('b2', '0.0.1');
 
 -- b0: has sites to clear and has performed the clearing.
 -- b1: has sites to clear but has not performed the clearing.
diff --git a/content/test/data/first_party_sets/v1.init_invalid_run_count.sql b/content/test/data/first_party_sets/v1.init_invalid_run_count.sql
index d37d2c3..7be52ee2 100644
--- a/content/test/data/first_party_sets/v1.init_invalid_run_count.sql
+++ b/content/test/data/first_party_sets/v1.init_invalid_run_count.sql
@@ -18,7 +18,7 @@
 CREATE TABLE IF NOT EXISTS policy_modifications (
    browser_context_id TEXT NOT NULL,
    site TEXT NOT NULL,
-   site_owner TEXT, -- May be NULL if this row represents a deletion.
+   primary_site TEXT, -- May be NULL if this row represents a deletion.
    PRIMARY KEY (browser_context_id, site)
 ) WITHOUT ROWID;
 
@@ -46,7 +46,9 @@
 
 INSERT INTO public_sets VALUES('0.0.1', 'https://aaa.test', 'https://bbb.test', 1),
                               ('0.0.1', 'https://bbb.test', 'https://bbb.test', 0);
-INSERT INTO browser_context_sets_version VALUES('b0', '0.0.1');
+INSERT INTO browser_context_sets_version VALUES('b0', '0.0.1'),
+                                               ('b1', '0.0.1'),
+                                               ('b2', '0.0.1');
 
 -- b0: has sites to clear and has performed the clearing.
 -- b1: has sites to clear but has not performed the clearing.
diff --git a/content/test/data/first_party_sets/v1.init_too_new.sql b/content/test/data/first_party_sets/v1.init_too_new.sql
index f8dcb69..31f07478 100644
--- a/content/test/data/first_party_sets/v1.init_too_new.sql
+++ b/content/test/data/first_party_sets/v1.init_too_new.sql
@@ -18,7 +18,7 @@
 CREATE TABLE IF NOT EXISTS policy_modifications (
    browser_context_id TEXT NOT NULL,
    site TEXT NOT NULL,
-   site_owner TEXT, -- May be NULL if this row represents a deletion.
+   primary_site TEXT, -- May be NULL if this row represents a deletion.
    PRIMARY KEY (browser_context_id, site)
 ) WITHOUT ROWID;
 
@@ -46,7 +46,9 @@
 
 INSERT INTO public_sets VALUES('0.0.1', 'https://aaa.test', 'https://bbb.test', 1),
                               ('0.0.1', 'https://bbb.test', 'https://bbb.test', 0);
-INSERT INTO browser_context_sets_version VALUES('b0', '0.0.1');
+INSERT INTO browser_context_sets_version VALUES('b0', '0.0.1'),
+                                               ('b1', '0.0.1'),
+                                               ('b2', '0.0.1');
 
 -- b0: has sites to clear and has performed the clearing.
 -- b1: has sites to clear but has not performed the clearing.
diff --git a/content/test/data/first_party_sets/v1.sql b/content/test/data/first_party_sets/v1.sql
index 2fb41722..3977f54 100644
--- a/content/test/data/first_party_sets/v1.sql
+++ b/content/test/data/first_party_sets/v1.sql
@@ -18,7 +18,7 @@
 CREATE TABLE IF NOT EXISTS policy_modifications (
    browser_context_id TEXT NOT NULL,
    site TEXT NOT NULL,
-   site_owner TEXT, -- May be NULL if this row represents a deletion.
+   primary_site TEXT, -- May be NULL if this row represents a deletion.
    PRIMARY KEY (browser_context_id, site)
 ) WITHOUT ROWID;
 
@@ -46,7 +46,9 @@
 
 INSERT INTO public_sets VALUES('0.0.1', 'https://aaa.test', 'https://bbb.test', 1),
                               ('0.0.1', 'https://bbb.test', 'https://bbb.test', 0);
-INSERT INTO browser_context_sets_version VALUES('b0', '0.0.1');
+INSERT INTO browser_context_sets_version VALUES('b0', '0.0.1'),
+                                               ('b1', '0.0.1'),
+                                               ('b2', '0.0.1');
 
 -- b0: has sites to clear and has performed the clearing.
 -- b1: has sites to clear but has not performed the clearing.
diff --git a/infra/config/subprojects/webrtc/OWNERS b/infra/config/subprojects/webrtc/OWNERS
index d6295fac..1d31689 100644
--- a/infra/config/subprojects/webrtc/OWNERS
+++ b/infra/config/subprojects/webrtc/OWNERS
@@ -1,6 +1,5 @@
 jansson@chromium.org
 jleconte@google.com
-landrey@google.com
 mbonadei@chromium.org
 terelius@chromium.org
 
diff --git a/ios/chrome/browser/metrics/demographics_egtest.mm b/ios/chrome/browser/metrics/demographics_egtest.mm
index d4df90b..954f444 100644
--- a/ios/chrome/browser/metrics/demographics_egtest.mm
+++ b/ios/chrome/browser/metrics/demographics_egtest.mm
@@ -73,24 +73,20 @@
   // method exists somewhere--but not necessarily in this class.
   if ([self isRunningTest:@selector
             (testUKMDemographicsReportingWithFeatureEnabled)]) {
+    config.features_enabled.push_back(metrics::kDemographicMetricsReporting);
     config.features_enabled.push_back(
-        metrics::DemographicMetricsProvider::kDemographicMetricsReporting);
-    config.features_enabled.push_back(
-        ukm::UkmService::kReportUserNoisedUserBirthYearAndGender);
+        ukm::kReportUserNoisedUserBirthYearAndGender);
   } else if ([self isRunningTest:@selector
                    (testUKMDemographicsReportingWithFeatureDisabled)]) {
+    config.features_disabled.push_back(metrics::kDemographicMetricsReporting);
     config.features_disabled.push_back(
-        metrics::DemographicMetricsProvider::kDemographicMetricsReporting);
-    config.features_disabled.push_back(
-        ukm::UkmService::kReportUserNoisedUserBirthYearAndGender);
+        ukm::kReportUserNoisedUserBirthYearAndGender);
   } else if ([self isRunningTest:@selector
                    (testUMADemographicsReportingWithFeatureEnabled)]) {
-    config.features_enabled.push_back(
-        metrics::DemographicMetricsProvider::kDemographicMetricsReporting);
+    config.features_enabled.push_back(metrics::kDemographicMetricsReporting);
   } else if ([self isRunningTest:@selector
                    (testUMADemographicsReportingWithFeatureDisabled)]) {
-    config.features_disabled.push_back(
-        metrics::DemographicMetricsProvider::kDemographicMetricsReporting);
+    config.features_disabled.push_back(metrics::kDemographicMetricsReporting);
   }
   return config;
 }
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
index 55f255b..64f9b7a 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
@@ -1053,8 +1053,7 @@
 }
 
 + (BOOL)isDemographicMetricsReportingEnabled {
-  return base::FeatureList::IsEnabled(
-      metrics::DemographicMetricsProvider::kDemographicMetricsReporting);
+  return base::FeatureList::IsEnabled(metrics::kDemographicMetricsReporting);
 }
 
 + (BOOL)appHasLaunchSwitch:(NSString*)launchSwitch {
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
index 92cbe67..3fc54947 100644
--- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-358fc97ed2026b4cca478e797625d8843b08d2c1
\ No newline at end of file
+c2d9d513ea7bd3f563f866d5bd8868fc31d55fd5
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
index f9fe462e..4153f12 100644
--- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-d8aa021979f2349ab24173c9459d87888e0c0f37
\ No newline at end of file
+3154b4c863586e40dc4a1b3edea8a6ecee1ee452
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
index 0437d20..301952a 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-af9ce56741281ef1e65778e3c07b410223c144e2
\ No newline at end of file
+92cb364fc5ba7ecbc915cf333dcdddf3a9b373bd
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
index 0a088c2..21341636 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-8d174a30519774a62086258a5e6e370582ea976c
\ No newline at end of file
+f0c52eb8b0ffee3a1bb25313ff9e539b3d069654
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
index 440a79d..aa2afccd 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-8c9a4e390701ddd386e0214d2732767ca79dc2c5
\ No newline at end of file
+cf342d2a14641d67a4ad031e2e5f6f191740c5eb
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
index 5f0a7ea..20584ee 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-5b82190e3e4b9257ad17b37fd124389965228632
\ No newline at end of file
+f985c1389ea37a2a57a464ece54f8db224e4f266
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
index 810b181..ff992a1c 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-067dfdf175b9fc7a4dce7134318b682ae1610ce8
\ No newline at end of file
+18804998c156d967bbcbf09864741a9bb6af8062
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
index 063c5b1..3b09401 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-8222db2c6f9a43026f58d39fa4d1465336d04f20
\ No newline at end of file
+96c5b3514cfed9917481424d360bf2350cac2563
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
index 8e3e055c..a092b44 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-ce4c12120d6234e4533514716b5e6f4ceaafc23f
\ No newline at end of file
+4cab57b01e57b602db94f069746e428ac070c66b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
index c94b8bc..f13ca0a 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-01e10317efb6f82acee87e5bf577b335add8ecb8
\ No newline at end of file
+fb6f371d23a19afa08fc805bbe61c02758564429
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
index d26f6acb..019a4de 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-8e3f85a2d77f9a3886bb370d69ff8f98f2912b43
\ No newline at end of file
+e44ef0b138cfc472b4a78132536a67d54fda97cd
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
index 4757b1b..0da58b5 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-0b7e63dbfda6ed3268fc69a8f44d95075a93d612
\ No newline at end of file
+e42d2c635713b31250891b51ef88f2f347299738
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
index b7ef1a0..8d5955d 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-2accfb3bca2e926348ef864e50f58b23dda450e1
\ No newline at end of file
+f848a968f9014bdc7b14829a63777a4a66e7d526
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
index e27904dd..61bc728 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-6126f398febc37da2f8ed6ad633054b0df4e6e97
\ No newline at end of file
+07687084d5aa34eade1de517ec7c8fe71db974e6
\ No newline at end of file
diff --git a/media/capture/video/chromeos/camera_device_delegate.cc b/media/capture/video/chromeos/camera_device_delegate.cc
index 6646be55..469abbf 100644
--- a/media/capture/video/chromeos/camera_device_delegate.cc
+++ b/media/capture/video/chromeos/camera_device_delegate.cc
@@ -971,7 +971,12 @@
     stream_config->streams.push_back(std::move(still_capture_stream));
 
     int32_t max_yuv_width = 0, max_yuv_height = 0;
-    if (IsYUVReprocessingSupported(&max_yuv_width, &max_yuv_height)) {
+    bool is_recording_multi_stream =
+        camera_app_device->GetCaptureIntent() ==
+            cros::mojom::CaptureIntent::VIDEO_RECORD &&
+        camera_app_device->IsMultipleStreamsEnabled();
+    if (IsYUVReprocessingSupported(&max_yuv_width, &max_yuv_height) &&
+        !is_recording_multi_stream) {
       auto reprocessing_stream_input = cros::mojom::Camera3Stream::New();
       reprocessing_stream_input->id =
           static_cast<uint64_t>(StreamType::kYUVInput);
diff --git a/media/gpu/v4l2/v4l2_device.cc b/media/gpu/v4l2/v4l2_device.cc
index 02c694cb..8e3c8700 100644
--- a/media/gpu/v4l2/v4l2_device.cc
+++ b/media/gpu/v4l2/v4l2_device.cc
@@ -609,8 +609,10 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(buffer_data_);
 
-  if (request_ref && buffer_data_->queue_->SupportsRequests())
-    request_ref->ApplyQueueBuffer(&(buffer_data_->v4l2_buffer_));
+  if (request_ref && buffer_data_->queue_->SupportsRequests() &&
+      !request_ref->ApplyQueueBuffer(&(buffer_data_->v4l2_buffer_))) {
+    return false;
+  }
 
   bool queued = buffer_data_->QueueBuffer(std::move(video_frame));
 
@@ -1028,7 +1030,8 @@
 
   if (is_streaming_) {
     VQLOGF(1) << "Queue is still streaming, trying to stop it...";
-    Streamoff();
+    if (!Streamoff())
+      VQLOGF(1) << "Failed to stop queue";
   }
 
   DCHECK(queued_buffers_.empty());
@@ -1036,7 +1039,8 @@
 
   if (!buffers_.empty()) {
     VQLOGF(1) << "Buffers are still allocated, trying to deallocate them...";
-    DeallocateBuffers();
+    if (!DeallocateBuffers())
+      VQLOGF(1) << "Failed to deallocate queue buffers";
   }
 
   std::move(destroy_cb_).Run();
@@ -1182,7 +1186,8 @@
     auto buffer = V4L2Buffer::Create(device_, type_, memory_, *format, i);
 
     if (!buffer) {
-      DeallocateBuffers();
+      if (!DeallocateBuffers())
+        VQLOGF(1) << "Failed to deallocate queue buffers";
 
       return 0;
     }
diff --git a/media/gpu/v4l2/v4l2_device.h b/media/gpu/v4l2/v4l2_device.h
index 82ad6774..439414c 100644
--- a/media/gpu/v4l2/v4l2_device.h
+++ b/media/gpu/v4l2/v4l2_device.h
@@ -96,7 +96,7 @@
   // so this reference becomes invalid.
   // In case of error, false is returned and the buffer is returned to the free
   // list.
-  bool QueueMMap(V4L2RequestRef* request_ref = nullptr) &&;
+  [[nodiscard]] bool QueueMMap(V4L2RequestRef* request_ref = nullptr) &&;
   // Queue a USERPTR buffer, assigning |ptrs| as pointer for each plane.
   // The size of |ptrs| must be equal to the number of planes of this buffer.
   // When requests are supported, a |request_ref| can be passed along this
@@ -105,8 +105,8 @@
   // so this reference becomes invalid.
   // In case of error, false is returned and the buffer is returned to the free
   // list.
-  bool QueueUserPtr(const std::vector<void*>& ptrs,
-                    V4L2RequestRef* request_ref = nullptr) &&;
+  [[nodiscard]] bool QueueUserPtr(const std::vector<void*>& ptrs,
+                                  V4L2RequestRef* request_ref = nullptr) &&;
   // Queue a DMABUF buffer, assigning |fds| as file descriptors for each plane.
   // It is allowed the number of |fds| might be greater than the number of
   // planes of this buffer. It happens when the v4l2 pixel format is single
@@ -117,8 +117,8 @@
   // so this reference becomes invalid.
   // In case of error, false is returned and the buffer is returned to the free
   // list.
-  bool QueueDMABuf(const std::vector<base::ScopedFD>& fds,
-                   V4L2RequestRef* request_ref = nullptr) &&;
+  [[nodiscard]] bool QueueDMABuf(const std::vector<base::ScopedFD>& fds,
+                                 V4L2RequestRef* request_ref = nullptr) &&;
   // Queue a DMABUF buffer, assigning file descriptors of |planes| for planes.
   // It is allowed the number of |planes| might be greater than the number of
   // planes of this buffer. It happens when the v4l2 pixel format is single
@@ -129,8 +129,9 @@
   // so this reference becomes invalid.
   // In case of error, false is returned and the buffer is returned to the free
   // list.
-  bool QueueDMABuf(const std::vector<gfx::NativePixmapPlane>& planes,
-                   V4L2RequestRef* request_ref = nullptr) &&;
+  [[nodiscard]] bool QueueDMABuf(
+      const std::vector<gfx::NativePixmapPlane>& planes,
+      V4L2RequestRef* request_ref = nullptr) &&;
   // Queue a |video_frame| using its file descriptors as DMABUFs. The VideoFrame
   // must have been constructed from its file descriptors.
   // The particularity of this method is that a reference to |video_frame| is
@@ -138,8 +139,8 @@
   // |V4L2ReadableBufferRef::GetVideoFrame()|. |video_frame| is thus guaranteed
   // to be alive until either all the |V4L2ReadableBufferRef| from the dequeued
   // buffer get out of scope, or |V4L2Queue::Streamoff()| is called.
-  bool QueueDMABuf(scoped_refptr<VideoFrame> video_frame,
-                   V4L2RequestRef* request_ref = nullptr) &&;
+  [[nodiscard]] bool QueueDMABuf(scoped_refptr<VideoFrame> video_frame,
+                                 V4L2RequestRef* request_ref = nullptr) &&;
 
   // Returns the number of planes in this buffer.
   size_t PlanesCount() const;
@@ -197,8 +198,8 @@
   // filled.
   // When requests are supported, a |request_ref| can be passed along this
   // the buffer to be submitted.
-  bool DoQueue(V4L2RequestRef* request_ref,
-               scoped_refptr<VideoFrame> video_frame) &&;
+  [[nodiscard]] bool DoQueue(V4L2RequestRef* request_ref,
+                             scoped_refptr<VideoFrame> video_frame) &&;
 
   V4L2WritableBufferRef(const struct v4l2_buffer& v4l2_buffer,
                         base::WeakPtr<V4L2Queue> queue);
@@ -339,11 +340,11 @@
   // This pair is used because not all failures to get the format are
   // necessarily errors, so we need to way to let the use decide whether it
   // is one or not.
-  std::pair<absl::optional<struct v4l2_format>, int> GetFormat();
+  [[nodiscard]] std::pair<absl::optional<struct v4l2_format>, int> GetFormat();
 
   // Codec-specific method to get the visible rectangle of the queue, using the
   // VIDIOC_G_SELECTION ioctl if available, or VIDIOC_G_CROP as a fallback.
-  absl::optional<gfx::Rect> GetVisibleRect();
+  [[nodiscard]] absl::optional<gfx::Rect> GetVisibleRect();
 
   // Allocate |count| buffers for the current format of this queue, with a
   // specific |memory| allocation, and returns the number of buffers allocated
@@ -367,27 +368,27 @@
   // Deallocate all buffers previously allocated by |AllocateBuffers|. Any
   // references to buffers previously allocated held by the client must be
   // released, or this call will fail.
-  bool DeallocateBuffers();
+  [[nodiscard]] bool DeallocateBuffers();
 
   // Returns the memory usage of v4l2 buffers owned by this V4L2Queue which are
   // mapped in user space memory.
-  size_t GetMemoryUsage() const;
+  [[nodiscard]] size_t GetMemoryUsage() const;
 
   // Returns |memory_|, memory type of last buffers allocated by this V4L2Queue.
-  v4l2_memory GetMemoryType() const;
+  [[nodiscard]] v4l2_memory GetMemoryType() const;
 
   // Return a reference to a free buffer for the caller to prepare and submit,
   // or nullopt if no buffer is currently free.
   //
   // If the caller discards the returned reference, the underlying buffer is
   // made available to clients again.
-  absl::optional<V4L2WritableBufferRef> GetFreeBuffer();
+  [[nodiscard]] absl::optional<V4L2WritableBufferRef> GetFreeBuffer();
   // Return the buffer at index |requested_buffer_id|, if it is available at
   // this time.
   //
   // If the buffer is currently in use or the provided index is invalid,
   // return |absl::nullopt|.
-  absl::optional<V4L2WritableBufferRef> GetFreeBuffer(
+  [[nodiscard]] absl::optional<V4L2WritableBufferRef> GetFreeBuffer(
       size_t requested_buffer_id);
   // Return a V4L2 buffer suitable for the passed VideoFrame.
   //
@@ -404,7 +405,7 @@
   // since it will maximize performance in that case provided the number of
   // different VideoFrames passed to this method does not exceed the number of
   // V4L2 buffers allocated on the queue.
-  absl::optional<V4L2WritableBufferRef> GetFreeBufferForFrame(
+  [[nodiscard]] absl::optional<V4L2WritableBufferRef> GetFreeBufferForFrame(
       const VideoFrame& frame);
 
   // Attempt to dequeue a buffer, and return a reference to it if one was
@@ -417,45 +418,46 @@
   // otherwise.
   // Dequeued buffers will not be reused by the driver until all references to
   // them are dropped.
-  std::pair<bool, V4L2ReadableBufferRef> DequeueBuffer();
+  [[nodiscard]] std::pair<bool, V4L2ReadableBufferRef> DequeueBuffer();
 
   // Returns true if this queue is currently streaming.
-  bool IsStreaming() const;
+  [[nodiscard]] bool IsStreaming() const;
   // If not currently streaming, starts streaming. Returns true if we started
   // streaming, or were already streaming, or false if we were not streaming
   // and an error occurred when attempting to start the stream. On failure, any
   // previously-queued buffers will be dequeued without processing and made
   // available to the client, while any buffers held by the client will remain
   // unchanged and their ownership will remain with the client.
-  bool Streamon();
+  [[nodiscard]] bool Streamon();
   // If currently streaming, stops streaming. Also make all queued buffers
   // available to the client again regardless of the streaming state.
   // If an error occurred while attempting to stop streaming, then false is
   // returned and queued buffers are left untouched since the V4L2 queue may
   // still be using them.
-  bool Streamoff();
+  [[nodiscard]] bool Streamoff();
 
   // Returns the number of buffers currently allocated for this queue.
-  size_t AllocatedBuffersCount() const;
+  [[nodiscard]] size_t AllocatedBuffersCount() const;
   // Returns the number of currently free buffers on this queue.
-  size_t FreeBuffersCount() const;
+  [[nodiscard]] size_t FreeBuffersCount() const;
   // Returns the number of buffers currently queued on this queue.
-  size_t QueuedBuffersCount() const;
+  [[nodiscard]] size_t QueuedBuffersCount() const;
 
   // Returns true if requests are supported by this queue.
-  bool SupportsRequests();
+  [[nodiscard]] bool SupportsRequests();
 
   // TODO (b/166275274) : Remove this once V4L2 properly supports modifiers.
   // Out of band method to configure V4L2 for modifier use.
-  absl::optional<struct v4l2_format> SetModifierFormat(uint64_t modifier,
-                                                       const gfx::Size& size);
+  [[nodiscard]] absl::optional<struct v4l2_format> SetModifierFormat(
+      uint64_t modifier,
+      const gfx::Size& size);
 
  private:
   ~V4L2Queue();
 
   // Called when clients request a buffer to be queued.
-  bool QueueBuffer(struct v4l2_buffer* v4l2_buffer,
-                   scoped_refptr<VideoFrame> video_frame);
+  [[nodiscard]] bool QueueBuffer(struct v4l2_buffer* v4l2_buffer,
+                                 scoped_refptr<VideoFrame> video_frame);
 
   const enum v4l2_buf_type type_;
   enum v4l2_memory memory_ = V4L2_MEMORY_MMAP;
@@ -539,7 +541,7 @@
   // Apply controls to the request.
   bool ApplyCtrls(struct v4l2_ext_controls* ctrls) const;
   // Apply buffer to the request.
-  bool ApplyQueueBuffer(struct v4l2_buffer* buffer) const;
+  [[nodiscard]] bool ApplyQueueBuffer(struct v4l2_buffer* buffer) const;
   // Submits the request to the driver.
   absl::optional<V4L2SubmittedRequestRef> Submit() &&;
 
@@ -563,7 +565,7 @@
   V4L2SubmittedRequestRef& operator=(const V4L2SubmittedRequestRef&) = delete;
 
   // Indicates if the request has completed.
-  bool IsCompleted();
+  [[nodiscard]] bool IsCompleted();
 
  private:
   friend class V4L2RequestRef;
@@ -666,7 +668,7 @@
   // Open a V4L2 device of |type| for use with |v4l2_pixfmt|.
   // Return true on success.
   // The device will be closed in the destructor.
-  virtual bool Open(Type type, uint32_t v4l2_pixfmt) = 0;
+  [[nodiscard]] virtual bool Open(Type type, uint32_t v4l2_pixfmt) = 0;
 
   // Returns the driver name.
   std::string GetDriverName();
@@ -677,7 +679,7 @@
 
   // Parameters and return value are the same as for the standard ioctl() system
   // call.
-  virtual int Ioctl(int request, void* arg) = 0;
+  [[nodiscard]] virtual int Ioctl(int request, void* arg) = 0;
 
   // This method sleeps until either:
   // - SetDevicePollInterrupt() is called (on another thread),
@@ -790,11 +792,12 @@
   // the caller's sequence if a buffer is ready to be dequeued and/or a V4L2
   // event has been posted. |error_callback| will be posted to the client's
   // sequence if a polling error has occurred.
-  bool StartPolling(V4L2DevicePoller::EventCallback event_callback,
-                    base::RepeatingClosure error_callback);
+  [[nodiscard]] bool StartPolling(
+      V4L2DevicePoller::EventCallback event_callback,
+      base::RepeatingClosure error_callback);
   // Stop polling this V4L2Device if polling was active. No new events will
   // be posted after this method has returned.
-  bool StopPolling();
+  [[nodiscard]] bool StopPolling();
   // Schedule a polling event if polling is enabled. This method is intended
   // to be called from V4L2Queue, clients should not need to call it directly.
   void SchedulePoll();
@@ -837,7 +840,7 @@
   // Perform platform-specific initialization of the device instance.
   // Return true on success, false on error or if the particular implementation
   // is not available.
-  virtual bool Initialize() = 0;
+  [[nodiscard]] virtual bool Initialize() = 0;
 
   // Associates a v4l2_buf_type to its queue.
   base::flat_map<enum v4l2_buf_type, V4L2Queue*> queues_;
diff --git a/media/gpu/v4l2/v4l2_jpeg_encode_accelerator.cc b/media/gpu/v4l2/v4l2_jpeg_encode_accelerator.cc
index 5dbca572..cdf1212 100644
--- a/media/gpu/v4l2/v4l2_jpeg_encode_accelerator.cc
+++ b/media/gpu/v4l2/v4l2_jpeg_encode_accelerator.cc
@@ -10,6 +10,7 @@
 #include <sys/mman.h>
 
 #include <memory>
+#include <tuple>
 #include <utility>
 
 #include "base/bind.h"
@@ -1193,7 +1194,7 @@
       // Driver may not have implemented V4L2_CID_JPEG_ACTIVE_MARKER.
       // Ignore any error and assume the driver implements the JPEG stream
       // the way we want it.
-      device_->Ioctl(VIDIOC_QUERY_EXT_CTRL, &queryctrl);
+      std::ignore = device_->Ioctl(VIDIOC_QUERY_EXT_CTRL, &queryctrl);
 
       // Ask for JPEG markers we want. Since not all may be implemented,
       // ask for the common subset of what we want and what is supported.
@@ -1201,7 +1202,7 @@
       ctrl.value = queryctrl.maximum &
                    (V4L2_JPEG_ACTIVE_MARKER_APP0 | V4L2_JPEG_ACTIVE_MARKER_DQT |
                     V4L2_JPEG_ACTIVE_MARKER_DHT);
-      device_->Ioctl(VIDIOC_S_EXT_CTRLS, &ctrls);
+      std::ignore = device_->Ioctl(VIDIOC_S_EXT_CTRLS, &ctrls);
       break;
 
     default:
diff --git a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc
index 2c746c5..79d6be6 100644
--- a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc
+++ b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc
@@ -790,7 +790,8 @@
 
   DCHECK(!input_queue_->IsStreaming());
 
-  input_queue_->DeallocateBuffers();
+  if (!input_queue_->DeallocateBuffers())
+    VLOGF(1) << "Failed to deallocate V4L2 input buffers";
 }
 
 void V4L2SliceVideoDecodeAccelerator::DismissPictures(
@@ -1289,7 +1290,8 @@
 
   output_buffer_map_.clear();
 
-  output_queue_->DeallocateBuffers();
+  if (!output_queue_->DeallocateBuffers())
+    VLOGF(1) << "Failed to deallocate V4L2 output buffers";
 
   return true;
 }
diff --git a/media/gpu/v4l2/v4l2_status.h b/media/gpu/v4l2/v4l2_status.h
index 3f8ee28e..ed625bc0 100644
--- a/media/gpu/v4l2/v4l2_status.h
+++ b/media/gpu/v4l2/v4l2_status.h
@@ -20,6 +20,7 @@
   kFailedResourceAllocation = 7,
   kBadFormat = 8,
   kFailedToStartStreamQueue = 9,
+  kFailedToDestroyQueueBuffers = 10,
 };
 
 struct V4L2StatusTraits {
@@ -31,4 +32,4 @@
 
 }  // namespace media
 
-#endif  // MEDIA_GPU_V4L2_V4L2_STATUS_H_
\ No newline at end of file
+#endif  // MEDIA_GPU_V4L2_V4L2_STATUS_H_
diff --git a/media/gpu/v4l2/v4l2_video_decode_accelerator.cc b/media/gpu/v4l2/v4l2_video_decode_accelerator.cc
index 13c3ff2..05b8739 100644
--- a/media/gpu/v4l2/v4l2_video_decode_accelerator.cc
+++ b/media/gpu/v4l2/v4l2_video_decode_accelerator.cc
@@ -2500,7 +2500,10 @@
   if (!input_queue_)
     return;
 
-  input_queue_->DeallocateBuffers();
+  if (!input_queue_->DeallocateBuffers()) {
+    VLOGF(1) << "Failed deallocating V4L2 input buffers";
+    NOTIFY_ERROR(PLATFORM_FAILURE);
+  }
 }
 
 bool V4L2VideoDecodeAccelerator::DestroyOutputBuffers() {
diff --git a/media/gpu/v4l2/v4l2_video_decoder.cc b/media/gpu/v4l2/v4l2_video_decoder.cc
index a7f6bd4..cb8f06f 100644
--- a/media/gpu/v4l2/v4l2_video_decoder.cc
+++ b/media/gpu/v4l2/v4l2_video_decoder.cc
@@ -124,11 +124,13 @@
   // Stop and Destroy device.
   StopStreamV4L2Queue(true);
   if (input_queue_) {
-    input_queue_->DeallocateBuffers();
+    if (!input_queue_->DeallocateBuffers())
+      VLOGF(1) << "Failed to deallocate V4L2 input buffers";
     input_queue_ = nullptr;
   }
   if (output_queue_) {
-    output_queue_->DeallocateBuffers();
+    if (!output_queue_->DeallocateBuffers())
+      VLOGF(1) << "Failed to deallocate V4L2 output buffers";
     output_queue_ = nullptr;
   }
 
@@ -183,8 +185,16 @@
       return;
     }
 
-    input_queue_->DeallocateBuffers();
-    output_queue_->DeallocateBuffers();
+    if (!input_queue_->DeallocateBuffers() ||
+        !output_queue_->DeallocateBuffers()) {
+      VLOGF(1) << "Failed to deallocate V4L2 buffers";
+      std::move(init_cb).Run(
+          DecoderStatus(DecoderStatus::Codes::kNotInitialized)
+              .AddCause(
+                  V4L2Status(V4L2Status::Codes::kFailedToDestroyQueueBuffers)));
+      return;
+    }
+
     input_queue_ = nullptr;
     output_queue_ = nullptr;
 
@@ -622,10 +632,15 @@
   weak_this_for_polling_ = weak_this_for_polling_factory_.GetWeakPtr();
 
   // Streamoff input and output queue.
-  if (input_queue_ && stop_input_queue)
-    input_queue_->Streamoff();
-  if (output_queue_)
-    output_queue_->Streamoff();
+  if (input_queue_ && stop_input_queue && !input_queue_->Streamoff()) {
+    SetState(State::kError);
+    return false;
+  }
+
+  if (output_queue_ && !output_queue_->Streamoff()) {
+    SetState(State::kError);
+    return false;
+  }
 
   if (backend_)
     backend_->OnStreamStopped(stop_input_queue);
diff --git a/net/first_party_sets/first_party_sets_context_config.cc b/net/first_party_sets/first_party_sets_context_config.cc
index e0d0034..52ed3107 100644
--- a/net/first_party_sets/first_party_sets_context_config.cc
+++ b/net/first_party_sets/first_party_sets_context_config.cc
@@ -39,13 +39,15 @@
   return FindOverride(site).has_value();
 }
 
-void FirstPartySetsContextConfig::ForEachCustomizationEntry(
-    base::FunctionRef<void(const SchemefulSite&,
+bool FirstPartySetsContextConfig::ForEachCustomizationEntry(
+    base::FunctionRef<bool(const SchemefulSite&,
                            const absl::optional<FirstPartySetEntry>&)> f)
     const {
   for (const auto& [site, maybe_entry] : customizations_) {
-    f(site, maybe_entry);
+    if (!f(site, maybe_entry))
+      return false;
   }
+  return true;
 }
 
 }  // namespace net
diff --git a/net/first_party_sets/first_party_sets_context_config.h b/net/first_party_sets/first_party_sets_context_config.h
index 67b807fd..76f127a 100644
--- a/net/first_party_sets/first_party_sets_context_config.h
+++ b/net/first_party_sets/first_party_sets_context_config.h
@@ -59,9 +59,11 @@
   // override will be `nullopt` if it is a deletion, or `optional(entry)` if it
   // is a modification of an existing entry, or an addition.
   //
-  // No guarantees are made re: iteration order.
-  void ForEachCustomizationEntry(
-      base::FunctionRef<void(const SchemefulSite&,
+  // Returns early if any of the iterations returns false. Returns false if
+  // iteration was incomplete; true if all iterations returned true. No
+  // guarantees are made re: iteration order.
+  bool ForEachCustomizationEntry(
+      base::FunctionRef<bool(const SchemefulSite&,
                              const absl::optional<FirstPartySetEntry>&)> f)
       const;
 
diff --git a/net/first_party_sets/first_party_sets_context_config_unittest.cc b/net/first_party_sets/first_party_sets_context_config_unittest.cc
index c5eb4bf..743a5e5 100644
--- a/net/first_party_sets/first_party_sets_context_config_unittest.cc
+++ b/net/first_party_sets/first_party_sets_context_config_unittest.cc
@@ -67,10 +67,30 @@
       {{example, absl::nullopt}, {foo, absl::nullopt}});
 
   int count = 0;
-  config.ForEachCustomizationEntry(
+  EXPECT_TRUE(config.ForEachCustomizationEntry(
       [&](const SchemefulSite& site,
-          const absl::optional<FirstPartySetEntry>& entry) { ++count; });
+          const absl::optional<FirstPartySetEntry>& entry) {
+        ++count;
+        return true;
+      }));
   EXPECT_EQ(count, 2);
 }
 
+TEST(FirstPartySetsContextConfigTest, ForEachCustomizationEntry_EarlyReturn) {
+  SchemefulSite example(GURL("https://example.test"));
+  SchemefulSite foo(GURL("https://foo.test"));
+
+  FirstPartySetsContextConfig config(
+      {{example, absl::nullopt}, {foo, absl::nullopt}});
+
+  int count = 0;
+  EXPECT_FALSE(config.ForEachCustomizationEntry(
+      [&](const SchemefulSite& site,
+          const absl::optional<FirstPartySetEntry>& entry) {
+        ++count;
+        return count < 1;
+      }));
+  EXPECT_EQ(count, 1);
+}
+
 }  // namespace net
diff --git a/net/first_party_sets/global_first_party_sets.cc b/net/first_party_sets/global_first_party_sets.cc
index a4ffe96..9891c256 100644
--- a/net/first_party_sets/global_first_party_sets.cc
+++ b/net/first_party_sets/global_first_party_sets.cc
@@ -4,15 +4,20 @@
 
 #include "net/first_party_sets/global_first_party_sets.h"
 
+#include <set>
 #include <tuple>
 
 #include "base/containers/contains.h"
 #include "base/containers/flat_map.h"
 #include "base/containers/flat_set.h"
 #include "base/functional/function_ref.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/timer/elapsed_timer.h"
+#include "base/types/optional_util.h"
 #include "net/base/schemeful_site.h"
 #include "net/first_party_sets/addition_overlaps_union_find.h"
 #include "net/first_party_sets/first_party_set_entry.h"
+#include "net/first_party_sets/first_party_set_metadata.h"
 #include "net/first_party_sets/first_party_sets_context_config.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
@@ -61,6 +66,11 @@
   return p.first;
 }
 
+SamePartyContext::Type ContextTypeFromBool(bool is_same_party) {
+  return is_same_party ? SamePartyContext::Type::kSameParty
+                       : SamePartyContext::Type::kCrossParty;
+}
+
 }  // namespace
 
 GlobalFirstPartySets::GlobalFirstPartySets() = default;
@@ -148,6 +158,57 @@
   return sites_to_entries;
 }
 
+FirstPartySetMetadata GlobalFirstPartySets::ComputeMetadata(
+    const SchemefulSite& site,
+    const SchemefulSite* top_frame_site,
+    const std::set<SchemefulSite>& party_context,
+    const FirstPartySetsContextConfig& fps_context_config) const {
+  const base::ElapsedTimer timer;
+
+  SamePartyContext::Type context_type =
+      ContextTypeFromBool(IsContextSamePartyWithSite(
+          site, top_frame_site, party_context, fps_context_config));
+
+  SamePartyContext context(context_type);
+
+  UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
+      "Cookie.FirstPartySets.ComputeContext.Latency", timer.Elapsed(),
+      base::Microseconds(1), base::Milliseconds(100), 50);
+
+  absl::optional<FirstPartySetEntry> top_frame_entry =
+      top_frame_site ? FindEntry(*top_frame_site, &fps_context_config)
+                     : absl::nullopt;
+
+  return FirstPartySetMetadata(
+      context, base::OptionalToPtr(FindEntry(site, &fps_context_config)),
+      base::OptionalToPtr(top_frame_entry));
+}
+
+bool GlobalFirstPartySets::IsContextSamePartyWithSite(
+    const SchemefulSite& site,
+    const SchemefulSite* top_frame_site,
+    const std::set<SchemefulSite>& party_context,
+    const FirstPartySetsContextConfig& fps_context_config) const {
+  const absl::optional<FirstPartySetEntry> site_entry =
+      FindEntry(site, &fps_context_config);
+  if (!site_entry.has_value())
+    return false;
+
+  const auto is_in_same_set_as_frame_site =
+      [this, &site_entry,
+       &fps_context_config](const SchemefulSite& context_site) -> bool {
+    const absl::optional<FirstPartySetEntry> context_entry =
+        FindEntry(context_site, &fps_context_config);
+    return context_entry.has_value() &&
+           context_entry->primary() == site_entry->primary();
+  };
+
+  if (top_frame_site && !is_in_same_set_as_frame_site(*top_frame_site))
+    return false;
+
+  return base::ranges::all_of(party_context, is_in_same_set_as_frame_site);
+}
+
 void GlobalFirstPartySets::ApplyManuallySpecifiedSet(
     const base::flat_map<SchemefulSite, FirstPartySetEntry>& manual_entries) {
   DCHECK(manual_config_.empty());
diff --git a/net/first_party_sets/global_first_party_sets.h b/net/first_party_sets/global_first_party_sets.h
index 6122a708..0453031 100644
--- a/net/first_party_sets/global_first_party_sets.h
+++ b/net/first_party_sets/global_first_party_sets.h
@@ -5,6 +5,8 @@
 #ifndef NET_FIRST_PARTY_SETS_GLOBAL_FIRST_PARTY_SETS_H_
 #define NET_FIRST_PARTY_SETS_GLOBAL_FIRST_PARTY_SETS_H_
 
+#include <set>
+
 #include "base/containers/flat_map.h"
 #include "base/containers/flat_set.h"
 #include "base/functional/function_ref.h"
@@ -24,6 +26,8 @@
 
 namespace net {
 
+class FirstPartySetMetadata;
+
 // This class holds all of the info associated with the First-Party Sets known
 // to this browser, after they've been parsed. This is suitable for plumbing
 // from the browser process to the network service, or for answering queries.
@@ -77,6 +81,13 @@
       const base::flat_set<SchemefulSite>& sites,
       const FirstPartySetsContextConfig* config) const;
 
+  // Computes the First-Party Set metadata related to the given request context.
+  FirstPartySetMetadata ComputeMetadata(
+      const SchemefulSite& site,
+      const SchemefulSite* top_frame_site,
+      const std::set<SchemefulSite>& party_context,
+      const FirstPartySetsContextConfig& fps_context_config) const;
+
   // Modifies this instance such that it will respect the given
   // manually-specified set. `manual_entries` should contain entries for aliases
   // as well as "canonical" sites.
@@ -107,12 +118,23 @@
   // transitively overlap (when taking the current `entries_` of this map, plus
   // the manual config, into account) are unioned together. I.e., this ensures
   // that at most one addition set intersects with any given global set.
-  std::vector<base::flat_map<net::SchemefulSite, net::FirstPartySetEntry>>
+  std::vector<base::flat_map<SchemefulSite, FirstPartySetEntry>>
   NormalizeAdditionSets(
-      const std::vector<
-          base::flat_map<net::SchemefulSite, net::FirstPartySetEntry>>&
+      const std::vector<base::flat_map<SchemefulSite, FirstPartySetEntry>>&
           addition_sets) const;
 
+  // Returns whether `site` is same-party with `party_context`, and
+  // `top_frame_site` (if it is not nullptr). That is, is `site`'s owner the
+  // same as the owners of every member of `party_context` and of
+  // `top_frame_site`? Note: if `site` is not a member of a First-Party Set,
+  // then this returns false. If `top_frame_site` is nullptr, then it is
+  // ignored.
+  bool IsContextSamePartyWithSite(
+      const SchemefulSite& site,
+      const SchemefulSite* top_frame_site,
+      const std::set<SchemefulSite>& party_context,
+      const FirstPartySetsContextConfig& fps_context_config) const;
+
   const base::flat_map<SchemefulSite, FirstPartySetEntry>& entries() const {
     return entries_;
   }
diff --git a/net/first_party_sets/global_first_party_sets_unittest.cc b/net/first_party_sets/global_first_party_sets_unittest.cc
index 82ae31d..eb422e5 100644
--- a/net/first_party_sets/global_first_party_sets_unittest.cc
+++ b/net/first_party_sets/global_first_party_sets_unittest.cc
@@ -10,6 +10,7 @@
 #include "base/containers/flat_map.h"
 #include "net/base/schemeful_site.h"
 #include "net/first_party_sets/first_party_set_entry.h"
+#include "net/first_party_sets/first_party_set_metadata.h"
 #include "net/first_party_sets/first_party_sets_context_config.h"
 #include "testing/gmock/include/gmock/gmock-matchers.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -424,6 +425,351 @@
   EXPECT_EQ(count, 4);
 }
 
+TEST_F(PopulatedGlobalFirstPartySetsTest, ComputeMetadata_EmptyContext) {
+  SchemefulSite nonmember(GURL("https://nonmember.test"));
+
+  for (const SchemefulSite* top_frame :
+       std::initializer_list<const SchemefulSite*>{&kPrimary, nullptr}) {
+    EXPECT_EQ(global_sets()
+                  .ComputeMetadata(nonmember, top_frame, {},
+                                   FirstPartySetsContextConfig())
+                  .context()
+                  .context_type(),
+              SamePartyContext::Type::kCrossParty);
+
+    EXPECT_EQ(global_sets()
+                  .ComputeMetadata(kPrimary, top_frame, {},
+                                   FirstPartySetsContextConfig())
+                  .context()
+                  .context_type(),
+              SamePartyContext::Type::kSameParty);
+
+    EXPECT_EQ(global_sets()
+                  .ComputeMetadata(SchemefulSite(GURL("http://primary.test")),
+                                   top_frame, {}, FirstPartySetsContextConfig())
+                  .context()
+                  .context_type(),
+              SamePartyContext::Type::kCrossParty);
+  }
+
+  EXPECT_EQ(global_sets()
+                .ComputeMetadata(kPrimary, &nonmember, {},
+                                 FirstPartySetsContextConfig())
+                .context()
+                .context_type(),
+            SamePartyContext::Type::kCrossParty);
+  EXPECT_EQ(global_sets()
+                .ComputeMetadata(nonmember, &kPrimary, {},
+                                 FirstPartySetsContextConfig())
+                .context()
+                .context_type(),
+            SamePartyContext::Type::kCrossParty);
+}
+
+TEST_F(PopulatedGlobalFirstPartySetsTest, ComputeMetadata_ContextIsNonmember) {
+  SchemefulSite nonmember(GURL("https://nonmember.test"));
+  std::set<SchemefulSite> context({nonmember});
+
+  for (const SchemefulSite* top_frame :
+       std::initializer_list<const SchemefulSite*>{&kPrimary, nullptr}) {
+    for (const SchemefulSite& site : std::initializer_list<SchemefulSite>{
+             kPrimary,
+             SchemefulSite(GURL("http://primary.test")),
+             SchemefulSite(GURL("http://associated1.test")),
+             SchemefulSite(GURL("http://primary2.test")),
+             SchemefulSite(GURL("http://associated3.test")),
+             nonmember,
+         }) {
+      EXPECT_EQ(global_sets()
+                    .ComputeMetadata(site, top_frame, context,
+                                     FirstPartySetsContextConfig())
+                    .context()
+                    .context_type(),
+                SamePartyContext::Type::kCrossParty)
+          << site;
+    }
+  }
+}
+
+TEST_F(PopulatedGlobalFirstPartySetsTest, ComputeMetadata_ContextIsPrimary) {
+  std::set<SchemefulSite> context({kPrimary});
+
+  for (const SchemefulSite* top_frame :
+       std::initializer_list<const SchemefulSite*>{&kPrimary, nullptr}) {
+    for (const SchemefulSite& site : std::initializer_list<SchemefulSite>{
+             SchemefulSite(GURL("http://primary.test")),
+             kPrimary2,
+             kAssociated3,
+             SchemefulSite(GURL("https://nonmember.test")),
+         }) {
+      EXPECT_EQ(global_sets()
+                    .ComputeMetadata(site, top_frame, context,
+                                     FirstPartySetsContextConfig())
+                    .context()
+                    .context_type(),
+                SamePartyContext::Type::kCrossParty)
+          << site;
+    }
+    EXPECT_EQ(global_sets()
+                  .ComputeMetadata(kPrimary, top_frame, context,
+                                   FirstPartySetsContextConfig())
+                  .context()
+                  .context_type(),
+              SamePartyContext::Type::kSameParty);
+
+    EXPECT_EQ(global_sets()
+                  .ComputeMetadata(kAssociated1, top_frame, context,
+                                   FirstPartySetsContextConfig())
+                  .context()
+                  .context_type(),
+              SamePartyContext::Type::kSameParty);
+  }
+}
+
+TEST_F(PopulatedGlobalFirstPartySetsTest, ComputeMetadata_ContextIsNonprimary) {
+  std::set<SchemefulSite> context({kAssociated1});
+
+  for (const SchemefulSite* top_frame :
+       std::initializer_list<const SchemefulSite*>{&kPrimary, nullptr}) {
+    for (const SchemefulSite& site : std::initializer_list<SchemefulSite>{
+             SchemefulSite(GURL("http://primary.test")),
+             kPrimary2,
+             kAssociated3,
+             SchemefulSite(GURL("https://nonmember.test")),
+         }) {
+      EXPECT_EQ(global_sets()
+                    .ComputeMetadata(site, top_frame, context,
+                                     FirstPartySetsContextConfig())
+                    .context()
+                    .context_type(),
+                SamePartyContext::Type::kCrossParty)
+          << site;
+    }
+    EXPECT_EQ(global_sets()
+                  .ComputeMetadata(kPrimary, top_frame, context,
+                                   FirstPartySetsContextConfig())
+                  .context()
+                  .context_type(),
+              SamePartyContext::Type::kSameParty);
+
+    EXPECT_EQ(global_sets()
+                  .ComputeMetadata(kPrimary, top_frame, context,
+                                   FirstPartySetsContextConfig())
+                  .context()
+                  .context_type(),
+              SamePartyContext::Type::kSameParty);
+
+    EXPECT_EQ(global_sets()
+                  .ComputeMetadata(kAssociated1, top_frame, context,
+                                   FirstPartySetsContextConfig())
+                  .context()
+                  .context_type(),
+              SamePartyContext::Type::kSameParty);
+  }
+}
+
+TEST_F(PopulatedGlobalFirstPartySetsTest,
+       ComputeMetadata_ContextIsPrimaryAndNonprimary) {
+  std::set<SchemefulSite> context({kPrimary, kAssociated1});
+
+  for (const SchemefulSite* top_frame :
+       std::initializer_list<const SchemefulSite*>{&kPrimary, nullptr}) {
+    for (const SchemefulSite& site : std::initializer_list<SchemefulSite>{
+             SchemefulSite(GURL("http://primary.test")),
+             kPrimary2,
+             kAssociated3,
+             SchemefulSite(GURL("https://nonmember.test")),
+         }) {
+      EXPECT_EQ(global_sets()
+                    .ComputeMetadata(site, top_frame, context,
+                                     FirstPartySetsContextConfig())
+                    .context()
+                    .context_type(),
+                SamePartyContext::Type::kCrossParty)
+          << site;
+    }
+    EXPECT_EQ(global_sets()
+                  .ComputeMetadata(kPrimary, top_frame, context,
+                                   FirstPartySetsContextConfig())
+                  .context()
+                  .context_type(),
+              SamePartyContext::Type::kSameParty);
+
+    EXPECT_EQ(global_sets()
+                  .ComputeMetadata(kAssociated1, top_frame, context,
+                                   FirstPartySetsContextConfig())
+                  .context()
+                  .context_type(),
+              SamePartyContext::Type::kSameParty);
+
+    EXPECT_EQ(global_sets()
+                  .ComputeMetadata(kAssociated2, top_frame, context,
+                                   FirstPartySetsContextConfig())
+                  .context()
+                  .context_type(),
+              SamePartyContext::Type::kSameParty);
+  }
+}
+
+TEST_F(PopulatedGlobalFirstPartySetsTest, ComputeMetadata_ContextMixesParties) {
+  std::set<SchemefulSite> context({kPrimary, kAssociated1, kPrimary2});
+
+  for (const SchemefulSite* top_frame :
+       std::initializer_list<const SchemefulSite*>{&kPrimary, nullptr}) {
+    for (const SchemefulSite& site : std::initializer_list<SchemefulSite>{
+             kPrimary,
+             SchemefulSite(GURL("http://primary.test")),
+             kAssociated1,
+             kPrimary2,
+             kAssociated3,
+             SchemefulSite(GURL("https://nonmember.test")),
+         }) {
+      EXPECT_EQ(global_sets()
+                    .ComputeMetadata(site, top_frame, context,
+                                     FirstPartySetsContextConfig())
+                    .context()
+                    .context_type(),
+                SamePartyContext::Type::kCrossParty)
+          << site;
+    }
+  }
+}
+
+TEST_F(PopulatedGlobalFirstPartySetsTest,
+       ComputeMetadata_ContextMixesMembersAndNonmembers) {
+  std::set<SchemefulSite> context({
+      kPrimary,
+      kAssociated1,
+      SchemefulSite(GURL("http://nonmember.test")),
+  });
+
+  for (const SchemefulSite* top_frame :
+       std::initializer_list<const SchemefulSite*>{&kPrimary, nullptr}) {
+    for (const SchemefulSite& site : std::initializer_list<SchemefulSite>{
+             kPrimary,
+             SchemefulSite(GURL("http://primary.test")),
+             kAssociated1,
+             kPrimary2,
+             kAssociated3,
+             SchemefulSite(GURL("https://nonmember.test")),
+         }) {
+      EXPECT_EQ(global_sets()
+                    .ComputeMetadata(site, top_frame, context,
+                                     FirstPartySetsContextConfig())
+                    .context()
+                    .context_type(),
+                SamePartyContext::Type::kCrossParty)
+          << site;
+    }
+  }
+}
+
+TEST_F(PopulatedGlobalFirstPartySetsTest, ComputeMetadata_ContextMixesSchemes) {
+  SchemefulSite primary_http(GURL("http://primary.test"));
+  std::set<SchemefulSite> context({kPrimary, kAssociated1, primary_http});
+
+  for (const SchemefulSite* top_frame :
+       std::initializer_list<const SchemefulSite*>{&kPrimary, nullptr}) {
+    for (const SchemefulSite& site : std::initializer_list<SchemefulSite>{
+             kPrimary,
+             primary_http,
+             kAssociated1,
+             kPrimary2,
+             kAssociated3,
+             SchemefulSite(GURL("https://nonmember.test")),
+         }) {
+      EXPECT_EQ(global_sets()
+                    .ComputeMetadata(site, top_frame, context,
+                                     FirstPartySetsContextConfig())
+                    .context()
+                    .context_type(),
+                SamePartyContext::Type::kCrossParty)
+          << site;
+    }
+  }
+}
+
+TEST_F(PopulatedGlobalFirstPartySetsTest, ComputeMetadata) {
+  SchemefulSite nonmember(GURL("https://nonmember.test"));
+  SchemefulSite nonmember1(GURL("https://nonmember1.test"));
+  SchemefulSite wss_associated1(GURL("wss://associated1.test"));
+  SchemefulSite wss_nonmember(GURL("wss://nonmember.test"));
+  FirstPartySetEntry primary_entry(kPrimary, SiteType::kPrimary, absl::nullopt);
+  FirstPartySetEntry associated_entry(kPrimary, SiteType::kAssociated, 0);
+
+  // Works as usual for sites that are in First-Party sets.
+  EXPECT_EQ(
+      global_sets().ComputeMetadata(kAssociated1, &kAssociated1, {kAssociated1},
+                                    FirstPartySetsContextConfig()),
+      FirstPartySetMetadata(
+          SamePartyContext(SamePartyContext::Type::kSameParty),
+          &associated_entry, &associated_entry));
+  EXPECT_EQ(
+      global_sets().ComputeMetadata(kPrimary, &kAssociated1, {kAssociated1},
+                                    FirstPartySetsContextConfig()),
+      FirstPartySetMetadata(
+          SamePartyContext(SamePartyContext::Type::kSameParty), &primary_entry,
+          &associated_entry));
+  EXPECT_EQ(
+      global_sets().ComputeMetadata(kAssociated1, &kPrimary, {kAssociated1},
+                                    FirstPartySetsContextConfig()),
+      FirstPartySetMetadata(
+          SamePartyContext(SamePartyContext::Type::kSameParty),
+          &associated_entry, &primary_entry));
+  EXPECT_EQ(
+      global_sets().ComputeMetadata(kAssociated1, &kAssociated1, {kPrimary},
+                                    FirstPartySetsContextConfig()),
+      FirstPartySetMetadata(
+          SamePartyContext(SamePartyContext::Type::kSameParty),
+          &associated_entry, &associated_entry));
+  EXPECT_EQ(global_sets().ComputeMetadata(kAssociated1, &kAssociated1,
+                                          {kAssociated1, kPrimary},
+                                          FirstPartySetsContextConfig()),
+            FirstPartySetMetadata(
+                SamePartyContext(SamePartyContext::Type::kSameParty),
+                &associated_entry, &associated_entry));
+
+  // Works if the site is provided with WSS scheme instead of HTTPS.
+  EXPECT_EQ(global_sets().ComputeMetadata(wss_associated1, &kAssociated1,
+                                          {kAssociated1, kPrimary},
+                                          FirstPartySetsContextConfig()),
+            FirstPartySetMetadata(
+                SamePartyContext(SamePartyContext::Type::kSameParty),
+                &associated_entry, &associated_entry));
+
+  EXPECT_EQ(
+      global_sets().ComputeMetadata(nonmember, &kAssociated1, {kAssociated1},
+                                    FirstPartySetsContextConfig()),
+      FirstPartySetMetadata(
+          SamePartyContext(SamePartyContext::Type::kCrossParty), nullptr,
+          &associated_entry));
+  EXPECT_EQ(
+      global_sets().ComputeMetadata(kAssociated1, &nonmember, {kAssociated1},
+                                    FirstPartySetsContextConfig()),
+      FirstPartySetMetadata(
+          SamePartyContext(SamePartyContext::Type::kCrossParty),
+          &associated_entry, nullptr));
+  EXPECT_EQ(global_sets().ComputeMetadata(wss_nonmember, &wss_associated1,
+                                          {kAssociated1, kPrimary},
+                                          FirstPartySetsContextConfig()),
+            FirstPartySetMetadata(
+                SamePartyContext(SamePartyContext::Type::kCrossParty), nullptr,
+                &associated_entry));
+
+  EXPECT_EQ(global_sets().ComputeMetadata(nonmember, &nonmember, {nonmember},
+                                          FirstPartySetsContextConfig()),
+            FirstPartySetMetadata(
+                SamePartyContext(SamePartyContext::Type::kCrossParty), nullptr,
+                nullptr));
+
+  EXPECT_EQ(global_sets().ComputeMetadata(kAssociated1, &kAssociated1,
+                                          {kAssociated1, nonmember},
+                                          FirstPartySetsContextConfig()),
+            FirstPartySetMetadata(
+                SamePartyContext(SamePartyContext::Type::kCrossParty),
+                &associated_entry, &associated_entry));
+}
+
 TEST_F(GlobalFirstPartySetsTest, ComputeConfig_Empty) {
   EXPECT_EQ(GlobalFirstPartySets(
                 /*entries=*/
@@ -916,4 +1262,51 @@
                                              absl::nullopt))));
 }
 
+class GlobalFirstPartySetsWithConfigTest
+    : public PopulatedGlobalFirstPartySetsTest {
+ public:
+  GlobalFirstPartySetsWithConfigTest()
+      : config_({
+            // New entry:
+            {kPrimary3,
+             {FirstPartySetEntry(kPrimary3,
+                                 SiteType::kPrimary,
+                                 absl::nullopt)}},
+            // Removed entry:
+            {kAssociated1, absl::nullopt},
+            // Remapped entry:
+            {kAssociated3,
+             {FirstPartySetEntry(kPrimary3, SiteType::kAssociated, 0)}},
+            // Removed alias:
+            {kAssociated1Cctld, absl::nullopt},
+        }) {}
+
+  FirstPartySetsContextConfig& config() { return config_; }
+
+ private:
+  FirstPartySetsContextConfig config_;
+};
+
+TEST_F(GlobalFirstPartySetsWithConfigTest, ComputeMetadata) {
+  FirstPartySetEntry example_primary_entry(kPrimary, SiteType::kPrimary,
+                                           absl::nullopt);
+  FirstPartySetEntry foo_primary_entry(kPrimary3, SiteType::kPrimary,
+                                       absl::nullopt);
+  FirstPartySetEntry foo_associated_entry(kPrimary3, SiteType::kAssociated, 0);
+
+  // kAssociated1 has been removed from its set.
+  EXPECT_EQ(
+      global_sets().ComputeMetadata(kAssociated1, &kPrimary, {}, config()),
+      FirstPartySetMetadata(
+          SamePartyContext(SamePartyContext::Type::kCrossParty), nullptr,
+          &example_primary_entry));
+
+  // kAssociated3 and kPrimary3 are sites in a new set.
+  EXPECT_EQ(
+      global_sets().ComputeMetadata(kAssociated3, &kPrimary3, {}, config()),
+      FirstPartySetMetadata(
+          SamePartyContext(SamePartyContext::Type::kSameParty),
+          &foo_associated_entry, &foo_primary_entry));
+}
+
 }  // namespace net
diff --git a/net/http/transport_security_persister.cc b/net/http/transport_security_persister.cc
index 0782601..d3dbfc45d 100644
--- a/net/http/transport_security_persister.cc
+++ b/net/http/transport_security_persister.cc
@@ -97,8 +97,7 @@
 }
 
 bool IsDynamicExpectCTEnabled() {
-  return base::FeatureList::IsEnabled(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  return base::FeatureList::IsEnabled(kDynamicExpectCTFeature);
 }
 
 // Serializes STS data from |state| to a Value.
diff --git a/net/http/transport_security_persister_unittest.cc b/net/http/transport_security_persister_unittest.cc
index 92533e8..60391492 100644
--- a/net/http/transport_security_persister_unittest.cc
+++ b/net/http/transport_security_persister_unittest.cc
@@ -90,8 +90,7 @@
 // Tests that LoadEntries() clears existing non-static entries.
 TEST_P(TransportSecurityPersisterTest, LoadEntriesClearsExistingState) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
 
   TransportSecurityState::STSState sts_state;
   TransportSecurityState::ExpectCTState expect_ct_state;
@@ -160,8 +159,7 @@
 
 TEST_P(TransportSecurityPersisterTest, SerializeData3) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
   const GURL report_uri(kReportUri);
   // Add an entry.
   base::Time expiry = base::Time::Now() + base::Seconds(1000);
@@ -309,8 +307,7 @@
 // Tests that dynamic Expect-CT state is serialized and deserialized correctly.
 TEST_P(TransportSecurityPersisterTest, ExpectCT) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
   const GURL report_uri(kReportUri);
   TransportSecurityState::ExpectCTState expect_ct_state;
   static const char kTestDomain[] = "example.test";
@@ -352,8 +349,7 @@
 // when there is also STS data present.
 TEST_P(TransportSecurityPersisterTest, ExpectCTWithSTSDataPresent) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
   const GURL report_uri(kReportUri);
   TransportSecurityState::ExpectCTState expect_ct_state;
   static const char kTestDomain[] = "example.test";
@@ -390,8 +386,7 @@
 // is disabled.
 TEST_P(TransportSecurityPersisterTest, ExpectCTDisabled) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndDisableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndDisableFeature(kDynamicExpectCTFeature);
   const GURL report_uri(kReportUri);
   TransportSecurityState::ExpectCTState expect_ct_state;
   static const char kTestDomain[] = "example.test";
@@ -417,8 +412,7 @@
 // the feature enabled or disabled, based on partition_expect_ct_state().
 TEST_P(TransportSecurityPersisterTest, ExpectCTWithNetworkIsolationKey) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
 
   const GURL report_uri(kReportUri);
   static const char kTestDomain[] = "example.test";
@@ -505,7 +499,7 @@
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeatures(
       // enabled_features
-      {TransportSecurityState::kDynamicExpectCTFeature,
+      {kDynamicExpectCTFeature,
        features::kPartitionExpectCTStateByNetworkIsolationKey},
       // disabled_features
       {});
diff --git a/net/http/transport_security_state.cc b/net/http/transport_security_state.cc
index c13c28f..4144e180 100644
--- a/net/http/transport_security_state.cc
+++ b/net/http/transport_security_state.cc
@@ -71,8 +71,7 @@
 bool g_ct_required_for_testing = false;
 
 bool IsDynamicExpectCTEnabled() {
-  return base::FeatureList::IsEnabled(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  return base::FeatureList::IsEnabled(kDynamicExpectCTFeature);
 }
 
 base::Value GetPEMEncodedChainAsList(const net::X509Certificate* cert_chain) {
@@ -382,12 +381,14 @@
 }  // namespace
 
 // static
-const base::Feature TransportSecurityState::kDynamicExpectCTFeature{
-    "DynamicExpectCT", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kDynamicExpectCTFeature,
+             "DynamicExpectCT",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // static
-const base::Feature TransportSecurityState::kCertificateTransparencyEnforcement{
-    "CertificateTransparencyEnforcement", base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kCertificateTransparencyEnforcement,
+             "CertificateTransparencyEnforcement",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 void SetTransportSecurityStateSourceForTesting(
     const TransportSecurityStateSource* source) {
diff --git a/net/http/transport_security_state.h b/net/http/transport_security_state.h
index df47bd3..861400a3 100644
--- a/net/http/transport_security_state.h
+++ b/net/http/transport_security_state.h
@@ -39,6 +39,15 @@
 class SSLInfo;
 class X509Certificate;
 
+// Feature that controls whether Expect-CT HTTP headers are parsed, processed,
+// and stored.
+NET_EXPORT BASE_DECLARE_FEATURE(kDynamicExpectCTFeature);
+
+// Feature that controls whether Certificate Transparency is enforced. This
+// feature is default enabled and meant only as an emergency killswitch. It
+// will not enable enforcement in platforms that otherwise have it disabled.
+NET_EXPORT BASE_DECLARE_FEATURE(kCertificateTransparencyEnforcement);
+
 void NET_EXPORT_PRIVATE SetTransportSecurityStateSourceForTesting(
     const TransportSecurityStateSource* source);
 
@@ -392,15 +401,6 @@
     CT_REQUIREMENTS_NOT_MET,
   };
 
-  // Feature that controls whether Expect-CT HTTP headers are parsed, processed,
-  // and stored.
-  static const base::Feature kDynamicExpectCTFeature;
-
-  // Feature that controls whether Certificate Transparency is enforced. This
-  // feature is default enabled and meant only as an emergency killswitch. It
-  // will not enable enforcement in platforms that otherwise have it disabled.
-  static const base::Feature kCertificateTransparencyEnforcement;
-
   TransportSecurityState();
 
   // Creates a TransportSecurityState object that will skip the check to force
diff --git a/net/http/transport_security_state_unittest.cc b/net/http/transport_security_state_unittest.cc
index 6bcfb7f..3cf5aac 100644
--- a/net/http/transport_security_state_unittest.cc
+++ b/net/http/transport_security_state_unittest.cc
@@ -367,10 +367,8 @@
     FastForwardBy(base::Days(1));
 
     // By default Expect-CT should be disabled, but enable it for tests.
-    EXPECT_FALSE(base::FeatureList::IsEnabled(
-        TransportSecurityState::kDynamicExpectCTFeature));
-    scoped_feature_list_.InitAndEnableFeature(
-        TransportSecurityState::kDynamicExpectCTFeature);
+    EXPECT_FALSE(base::FeatureList::IsEnabled(kDynamicExpectCTFeature));
+    scoped_feature_list_.InitAndEnableFeature(kDynamicExpectCTFeature);
   }
 
   ~TransportSecurityStateTest() override {
@@ -795,8 +793,7 @@
 
 TEST_F(TransportSecurityStateTest, DeleteAllDynamicDataBetween) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
   TransportSecurityState::ExpectCTState expect_ct_state;
 
   TransportSecurityState state;
@@ -848,7 +845,7 @@
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeatures(
       /* enabled_features */
-      {TransportSecurityState::kDynamicExpectCTFeature,
+      {kDynamicExpectCTFeature,
        features::kPartitionExpectCTStateByNetworkIsolationKey},
       /* disabled_features */
       {});
@@ -1789,7 +1786,7 @@
       scoped_feature_list_.Init();
     } else {
       scoped_feature_list_.InitAndDisableFeature(
-          TransportSecurityState::kCertificateTransparencyEnforcement);
+          kCertificateTransparencyEnforcement);
     }
   }
   void SetUp() override {
@@ -2109,8 +2106,7 @@
 // Tests that dynamic Expect-CT state is cleared from ClearDynamicData().
 TEST_F(TransportSecurityStateTest, DynamicExpectCTStateCleared) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
   const std::string host("example.test");
   TransportSecurityState state;
   TransportSecurityState::ExpectCTState expect_ct_state;
@@ -2132,8 +2128,7 @@
 // Tests that dynamic Expect-CT state can be added and retrieved.
 TEST_F(TransportSecurityStateTest, DynamicExpectCTState) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
   const std::string host("example.test");
   TransportSecurityState state;
   TransportSecurityState::ExpectCTState expect_ct_state;
@@ -2184,8 +2179,7 @@
   SignedCertificateTimestampAndStatusList sct_list;
 
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
   base::Time now = base::Time::Now();
   TransportSecurityState state;
   MockExpectCTReporter reporter;
@@ -2244,8 +2238,7 @@
   SignedCertificateTimestampAndStatusList sct_list;
 
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
 
   TransportSecurityState state;
   MockExpectCTReporter reporter;
@@ -2274,8 +2267,7 @@
   ssl.ct_policy_compliance = ct::CTPolicyCompliance::CT_POLICY_NOT_ENOUGH_SCTS;
 
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
   TransportSecurityState state;
   MockExpectCTReporter reporter;
   state.SetExpectCTReporter(&reporter);
@@ -2298,8 +2290,7 @@
 // enabled.
 TEST_F(TransportSecurityStateTest, DynamicExpectCTStateDisabled) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndDisableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndDisableFeature(kDynamicExpectCTFeature);
   const std::string host("example.test");
   TransportSecurityState state;
   TransportSecurityState::ExpectCTState expect_ct_state;
@@ -2323,8 +2314,7 @@
   // First test that the header is not processed when the feature is disabled.
   {
     base::test::ScopedFeatureList feature_list;
-    feature_list.InitAndDisableFeature(
-        TransportSecurityState::kDynamicExpectCTFeature);
+    feature_list.InitAndDisableFeature(kDynamicExpectCTFeature);
     TransportSecurityState state;
     state.ProcessExpectCTHeader(kHeader, HostPortPair("example.test", 443), ssl,
                                 NetworkIsolationKey());
@@ -2336,8 +2326,7 @@
   // Now test that the header is processed when the feature is enabled.
   {
     base::test::ScopedFeatureList feature_list;
-    feature_list.InitAndEnableFeature(
-        TransportSecurityState::kDynamicExpectCTFeature);
+    feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
     base::Time now = base::Time::Now();
     TransportSecurityState state;
     MockExpectCTReporter reporter;
@@ -2364,8 +2353,7 @@
   ssl.ct_policy_compliance = ct::CTPolicyCompliance::CT_POLICY_NOT_ENOUGH_SCTS;
 
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
   TransportSecurityState state;
   MockExpectCTReporter reporter;
   state.SetExpectCTReporter(&reporter);
@@ -2396,8 +2384,7 @@
   ssl.cert = cert2;
 
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
   TransportSecurityState state;
   MockExpectCTReporter reporter;
   state.SetExpectCTReporter(&reporter);
@@ -2435,8 +2422,7 @@
   NetworkIsolationKey network_isolation_key =
       NetworkIsolationKey::CreateTransient();
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
   TransportSecurityState state;
   MockExpectCTReporter reporter;
   state.SetExpectCTReporter(&reporter);
@@ -2478,8 +2464,7 @@
   NetworkIsolationKey network_isolation_key =
       NetworkIsolationKey::CreateTransient();
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
 
   TransportSecurityState state;
   MockExpectCTReporter reporter;
@@ -2621,8 +2606,7 @@
       NetworkIsolationKey::CreateTransient();
 
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
 
   TransportSecurityState state;
   MockExpectCTReporter reporter;
@@ -2681,8 +2665,7 @@
       NetworkIsolationKey::CreateTransient();
 
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
 
   TransportSecurityState state;
   MockExpectCTReporter reporter;
@@ -3459,8 +3442,7 @@
   HostPortPair host_port_pair(kDomain, 443);
 
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
 
   const base::Time expiry = base::Time::Now() + base::Seconds(1000);
 
@@ -3550,7 +3532,7 @@
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeatures(
       // enabled_features
-      {TransportSecurityState::kDynamicExpectCTFeature,
+      {kDynamicExpectCTFeature,
        features::kPartitionExpectCTStateByNetworkIsolationKey},
       // disabled_features
       {});
@@ -3813,8 +3795,7 @@
 TEST_F(TransportSecurityStateTest, PruneExpectCTDelay) {
   const GURL report_uri(kReportUri);
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
 
   TransportSecurityState state;
   base::Time expiry = base::Time::Now() + base::Days(10);
@@ -3880,7 +3861,7 @@
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeatures(
       // enabled_features
-      {TransportSecurityState::kDynamicExpectCTFeature,
+      {kDynamicExpectCTFeature,
        features::kPartitionExpectCTStateByNetworkIsolationKey},
       // disabled_features
       {});
diff --git a/net/quic/quic_chromium_client_session_test.cc b/net/quic/quic_chromium_client_session_test.cc
index 706ab7b..a609828 100644
--- a/net/quic/quic_chromium_client_session_test.cc
+++ b/net/quic/quic_chromium_client_session_test.cc
@@ -1716,7 +1716,7 @@
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeatures(
       /* enabled_features */
-      {TransportSecurityState::kDynamicExpectCTFeature,
+      {kDynamicExpectCTFeature,
        features::kPartitionExpectCTStateByNetworkIsolationKey,
        features::kPartitionConnectionsByNetworkIsolationKey},
       /* disabled_features */
diff --git a/net/socket/ssl_client_socket_unittest.cc b/net/socket/ssl_client_socket_unittest.cc
index b8a07e62..d657f0b 100644
--- a/net/socket/ssl_client_socket_unittest.cc
+++ b/net/socket/ssl_client_socket_unittest.cc
@@ -4020,8 +4020,7 @@
 // absence of CT information is a socket error.
 TEST_P(SSLClientSocketVersionTest, CTIsRequiredByExpectCT) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
 
   ASSERT_TRUE(
       StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, GetServerConfig()));
diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc
index df1b8c6..963c9cd9 100644
--- a/net/spdy/spdy_network_transaction_unittest.cc
+++ b/net/spdy/spdy_network_transaction_unittest.cc
@@ -6662,7 +6662,7 @@
     // to check that NetworkAnonymizationKeys are respected.
     feature_list_.InitWithFeatures(
         /* enabled_features */
-        {TransportSecurityState::kDynamicExpectCTFeature,
+        {kDynamicExpectCTFeature,
          features::kPartitionExpectCTStateByNetworkIsolationKey,
          features::kPartitionConnectionsByNetworkIsolationKey,
          features::kPartitionHttpServerPropertiesByNetworkIsolationKey},
diff --git a/net/spdy/spdy_session_unittest.cc b/net/spdy/spdy_session_unittest.cc
index 644ddeb..7ccc3c06 100644
--- a/net/spdy/spdy_session_unittest.cc
+++ b/net/spdy/spdy_session_unittest.cc
@@ -2942,7 +2942,7 @@
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeatures(
       /* enabled_features */
-      {TransportSecurityState::kDynamicExpectCTFeature,
+      {kDynamicExpectCTFeature,
        features::kPartitionExpectCTStateByNetworkIsolationKey,
        features::kPartitionConnectionsByNetworkIsolationKey,
        features::kPartitionSSLSessionsByNetworkIsolationKey},
@@ -6732,7 +6732,7 @@
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeatures(
       /* enabled_features */
-      {TransportSecurityState::kDynamicExpectCTFeature,
+      {kDynamicExpectCTFeature,
        features::kPartitionExpectCTStateByNetworkIsolationKey,
        features::kPartitionConnectionsByNetworkIsolationKey,
        features::kPartitionSSLSessionsByNetworkIsolationKey},
@@ -7226,7 +7226,7 @@
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeatures(
       /* enabled_features */
-      {TransportSecurityState::kDynamicExpectCTFeature,
+      {kDynamicExpectCTFeature,
        features::kPartitionExpectCTStateByNetworkIsolationKey},
       /* disabled_features */
       {});
diff --git a/net/url_request/url_request_http_job_unittest.cc b/net/url_request/url_request_http_job_unittest.cc
index 85b048d..96d9a23 100644
--- a/net/url_request/url_request_http_job_unittest.cc
+++ b/net/url_request/url_request_http_job_unittest.cc
@@ -383,8 +383,7 @@
     auto context_builder = CreateTestURLRequestContextBuilder();
     context_builder->set_client_socket_factory_for_testing(&socket_factory_);
     context_ = context_builder->Build();
-    scoped_feature_list_.InitAndEnableFeature(
-        TransportSecurityState::kDynamicExpectCTFeature);
+    scoped_feature_list_.InitAndEnableFeature(kDynamicExpectCTFeature);
   }
 
   MockClientSocketFactory socket_factory_;
diff --git a/net/url_request/url_request_quic_unittest.cc b/net/url_request/url_request_quic_unittest.cc
index fcf5fabb..2239588 100644
--- a/net/url_request/url_request_quic_unittest.cc
+++ b/net/url_request/url_request_quic_unittest.cc
@@ -151,8 +151,7 @@
     context_builder_->SetCertVerifier(std::move(cert_verifier));
     context_builder_->set_net_log(NetLog::Get());
 
-    scoped_feature_list_.InitAndEnableFeature(
-        TransportSecurityState::kDynamicExpectCTFeature);
+    scoped_feature_list_.InitAndEnableFeature(kDynamicExpectCTFeature);
   }
 
   void TearDown() override {
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index 54b40104..0963563 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -6490,8 +6490,7 @@
 // Tests that Expect CT HTTP headers are processed correctly.
 TEST_F(URLRequestTestHTTP, ExpectCTHeader) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
 
   EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
   https_test_server.SetSSLConfig(
@@ -6540,8 +6539,7 @@
 // processed.
 TEST_F(URLRequestTestHTTP, MultipleExpectCTHeaders) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      TransportSecurityState::kDynamicExpectCTFeature);
+  feature_list.InitAndEnableFeature(kDynamicExpectCTFeature);
 
   EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
   https_test_server.SetSSLConfig(
diff --git a/services/network/cors/cors_url_loader_factory_unittest.cc b/services/network/cors/cors_url_loader_factory_unittest.cc
index dc60cf2..2c84c9d 100644
--- a/services/network/cors/cors_url_loader_factory_unittest.cc
+++ b/services/network/cors/cors_url_loader_factory_unittest.cc
@@ -91,7 +91,7 @@
   }
 
   void CreateLoaderAndStart(const ResourceRequest& request) {
-    url_loaders_.emplace_back(mojo::Remote<mojom::URLLoader>());
+    url_loaders_.emplace_back();
     test_cors_loader_clients_.emplace_back(
         std::make_unique<TestURLLoaderClient>());
     cors_url_loader_factory_->CreateLoaderAndStart(
diff --git a/services/network/first_party_sets/first_party_sets_manager.cc b/services/network/first_party_sets/first_party_sets_manager.cc
index e6e92a0..925f836 100644
--- a/services/network/first_party_sets/first_party_sets_manager.cc
+++ b/services/network/first_party_sets/first_party_sets_manager.cc
@@ -28,15 +28,6 @@
 
 namespace network {
 
-namespace {
-
-net::SamePartyContext::Type ContextTypeFromBool(bool is_same_party) {
-  return is_same_party ? net::SamePartyContext::Type::kSameParty
-                       : net::SamePartyContext::Type::kCrossParty;
-}
-
-}  // namespace
-
 FirstPartySetsManager::FirstPartySetsManager(bool enabled)
     : enabled_(enabled),
       pending_queries_(
@@ -50,32 +41,6 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
-bool FirstPartySetsManager::IsContextSamePartyWithSite(
-    const net::SchemefulSite& site,
-    const net::SchemefulSite* top_frame_site,
-    const std::set<net::SchemefulSite>& party_context,
-    const net::FirstPartySetsContextConfig& fps_context_config) const {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  const absl::optional<net::FirstPartySetEntry> site_entry =
-      FindEntry(site, fps_context_config);
-  if (!site_entry.has_value())
-    return false;
-
-  const auto is_in_same_set_as_frame_site =
-      [this, &site_entry,
-       &fps_context_config](const net::SchemefulSite& context_site) -> bool {
-    const absl::optional<net::FirstPartySetEntry> context_entry =
-        FindEntry(context_site, fps_context_config);
-    return context_entry.has_value() &&
-           context_entry->primary() == site_entry->primary();
-  };
-
-  if (top_frame_site && !is_in_same_set_as_frame_site(*top_frame_site))
-    return false;
-
-  return base::ranges::all_of(party_context, is_in_same_set_as_frame_site);
-}
-
 absl::optional<net::FirstPartySetMetadata>
 FirstPartySetsManager::ComputeMetadata(
     const net::SchemefulSite& site,
@@ -124,25 +89,8 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(sets_.has_value());
 
-  const base::ElapsedTimer timer;
-
-  net::SamePartyContext::Type context_type =
-      ContextTypeFromBool(IsContextSamePartyWithSite(
-          site, top_frame_site, party_context, fps_context_config));
-
-  net::SamePartyContext context(context_type);
-
-  UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
-      "Cookie.FirstPartySets.ComputeContext.Latency", timer.Elapsed(),
-      base::Microseconds(1), base::Milliseconds(100), 50);
-
-  absl::optional<net::FirstPartySetEntry> top_frame_entry =
-      top_frame_site ? FindEntry(*top_frame_site, fps_context_config)
-                     : absl::nullopt;
-
-  return net::FirstPartySetMetadata(
-      context, base::OptionalToPtr(FindEntry(site, fps_context_config)),
-      base::OptionalToPtr(top_frame_entry));
+  return sets_->ComputeMetadata(site, top_frame_site, party_context,
+                                fps_context_config);
 }
 
 absl::optional<net::FirstPartySetEntry> FirstPartySetsManager::FindEntry(
diff --git a/services/network/first_party_sets/first_party_sets_manager.h b/services/network/first_party_sets/first_party_sets_manager.h
index 0ba751c..b70e0b5 100644
--- a/services/network/first_party_sets/first_party_sets_manager.h
+++ b/services/network/first_party_sets/first_party_sets_manager.h
@@ -102,18 +102,6 @@
       const std::set<net::SchemefulSite>& party_context,
       const net::FirstPartySetsContextConfig& fps_context_config) const;
 
-  // Returns whether the `site` is same-party with the `party_context`, and
-  // `top_frame_site` (if it is not nullptr). That is, is the `site`'s owner the
-  // same as the owners of every member of `party_context` and of
-  // `top_frame_site`? Note: if `site` is not a member of a First-Party Set
-  // (with more than one member), then this returns false. If `top_frame_site`
-  // is nullptr, then it is ignored.
-  bool IsContextSamePartyWithSite(
-      const net::SchemefulSite& site,
-      const net::SchemefulSite* top_frame_site,
-      const std::set<net::SchemefulSite>& party_context,
-      const net::FirstPartySetsContextConfig& fps_context_config) const;
-
   // Returns `site`'s entry, or `nullopt` if `site` has no entry.
   // `fps_context_config` is the configuration to be used in this context.
   //
diff --git a/services/network/first_party_sets/first_party_sets_manager_unittest.cc b/services/network/first_party_sets/first_party_sets_manager_unittest.cc
index 2cf0aa2..36bf63e35 100644
--- a/services/network/first_party_sets/first_party_sets_manager_unittest.cc
+++ b/services/network/first_party_sets/first_party_sets_manager_unittest.cc
@@ -16,6 +16,7 @@
 #include "net/cookies/cookie_constants.h"
 #include "net/first_party_sets/first_party_set_entry.h"
 #include "net/first_party_sets/first_party_set_metadata.h"
+#include "net/first_party_sets/first_party_sets_context_config.h"
 #include "net/first_party_sets/global_first_party_sets.h"
 #include "net/first_party_sets/same_party_context.h"
 #include "testing/gmock/include/gmock/gmock-matchers.h"
@@ -28,11 +29,8 @@
 using ::testing::Optional;
 using ::testing::Pair;
 using ::testing::UnorderedElementsAre;
-using ::testing::Value;
 
 using Type = net::SamePartyContext::Type;
-using OverrideSets =
-    base::flat_map<net::SchemefulSite, absl::optional<net::FirstPartySetEntry>>;
 
 namespace network {
 
@@ -47,43 +45,20 @@
     manager_.SetCompleteSets(net::GlobalFirstPartySets(content, aliases));
   }
 
-  net::FirstPartySetMetadata ComputeMetadataAndWait(
-      const net::SchemefulSite& site,
-      const net::SchemefulSite* top_frame_site,
-      const std::set<net::SchemefulSite>& party_context) {
-    base::test::TestFuture<net::FirstPartySetMetadata> future;
-    absl::optional<net::FirstPartySetMetadata> result =
-        manager_.ComputeMetadata(site, top_frame_site, party_context,
-                                 fps_context_config_, future.GetCallback());
-    return result.has_value() ? std::move(result).value() : future.Take();
-  }
-
   FirstPartySetsManager::EntriesResult FindEntriesAndWait(
       const base::flat_set<net::SchemefulSite>& site) {
     base::test::TestFuture<FirstPartySetsManager::EntriesResult> future;
     absl::optional<FirstPartySetsManager::EntriesResult> result =
-        manager_.FindEntries(site, fps_context_config_, future.GetCallback());
+        manager_.FindEntries(site, net::FirstPartySetsContextConfig(),
+                             future.GetCallback());
     return result.has_value() ? result.value() : future.Get();
   }
 
   FirstPartySetsManager& manager() { return manager_; }
 
-  net::FirstPartySetsContextConfig& fps_context_config() {
-    return fps_context_config_;
-  }
-
-  base::test::TaskEnvironment& env() { return env_; }
-
- protected:
-  void SetFirstPartySetsContextConfig(OverrideSets customizations) {
-    fps_context_config_ =
-        net::FirstPartySetsContextConfig(std::move(customizations));
-  }
-
  private:
   base::test::TaskEnvironment env_;
   FirstPartySetsManager manager_;
-  net::FirstPartySetsContextConfig fps_context_config_;
 };
 
 class FirstPartySetsManagerDisabledTest : public FirstPartySetsManagerTest {
@@ -109,15 +84,15 @@
                       example_test,
                       example_cctld,
                   },
-                  fps_context_config(), base::NullCallback()),
+                  net::FirstPartySetsContextConfig(), base::NullCallback()),
               Optional(IsEmpty()));
 }
 
 TEST_F(FirstPartySetsManagerDisabledTest, FindEntries) {
-  EXPECT_THAT(
-      manager().FindEntries({net::SchemefulSite(GURL("https://example.test"))},
-                            fps_context_config(), base::NullCallback()),
-      Optional(IsEmpty()));
+  EXPECT_THAT(manager().FindEntries(
+                  {net::SchemefulSite(GURL("https://example.test"))},
+                  net::FirstPartySetsContextConfig(), base::NullCallback()),
+              Optional(IsEmpty()));
 }
 
 class FirstPartySetsEnabledTest : public FirstPartySetsManagerTest {
@@ -229,8 +204,9 @@
     // Force deallocation to provoke a UAF if the impl just copies the pointer.
     net::SchemefulSite member(GURL("https://member1.test"));
 
-    EXPECT_FALSE(manager().ComputeMetadata(
-        member, &member, {member}, fps_context_config(), future.GetCallback()));
+    EXPECT_FALSE(manager().ComputeMetadata(member, &member, {member},
+                                           net::FirstPartySetsContextConfig(),
+                                           future.GetCallback()));
   }
 
   Populate();
@@ -253,7 +229,7 @@
 
   base::test::TestFuture<FirstPartySetsManager::EntriesResult> future;
   EXPECT_FALSE(manager().FindEntries({member1, member2, example_cctld},
-                                     fps_context_config(),
+                                     net::FirstPartySetsContextConfig(),
                                      future.GetCallback()));
 
   Populate();
@@ -271,381 +247,4 @@
                             net::SiteType::kAssociated, 0))));
 }
 
-class PopulatedFirstPartySetsManagerTest
-    : public AsyncPopulatedFirstPartySetsManagerTest {
- public:
-  PopulatedFirstPartySetsManagerTest() { Populate(); }
-};
-
-TEST_F(PopulatedFirstPartySetsManagerTest, ComputeMetadata_EmptyContext) {
-  net::SchemefulSite example_site(GURL("https://example.test"));
-  net::SchemefulSite nonmember(GURL("https://nonmember.test"));
-
-  for (const net::SchemefulSite* top_frame :
-       std::initializer_list<net::SchemefulSite*>{&example_site, nullptr}) {
-    EXPECT_EQ(ComputeMetadataAndWait(nonmember, top_frame, {})
-                  .context()
-                  .context_type(),
-              Type::kCrossParty);
-
-    EXPECT_EQ(ComputeMetadataAndWait(example_site, top_frame, {})
-                  .context()
-                  .context_type(),
-              Type::kSameParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("http://example.test")),
-                               top_frame, {})
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-  }
-
-  EXPECT_EQ(ComputeMetadataAndWait(example_site, &nonmember, {})
-                .context()
-                .context_type(),
-            Type::kCrossParty);
-  EXPECT_EQ(ComputeMetadataAndWait(nonmember, &example_site, {})
-                .context()
-                .context_type(),
-            Type::kCrossParty);
-}
-
-TEST_F(PopulatedFirstPartySetsManagerTest, ComputeMetadata_ContextIsNonmember) {
-  net::SchemefulSite nonmember(GURL("https://nonmember.test"));
-  std::set<net::SchemefulSite> context({nonmember});
-
-  net::SchemefulSite example_site(GURL("https://example.test"));
-
-  for (const net::SchemefulSite* top_frame :
-       std::initializer_list<net::SchemefulSite*>{&example_site, nullptr}) {
-    for (const net::SchemefulSite& site :
-         std::initializer_list<net::SchemefulSite>{
-             example_site,
-             net::SchemefulSite(GURL("http://example.test")),
-             net::SchemefulSite(GURL("http://member1.test")),
-             net::SchemefulSite(GURL("http://foo.test")),
-             net::SchemefulSite(GURL("http://member2.test")),
-             nonmember,
-         }) {
-      EXPECT_EQ(ComputeMetadataAndWait(site, top_frame, context)
-                    .context()
-                    .context_type(),
-                Type::kCrossParty)
-          << site;
-    }
-  }
-}
-
-TEST_F(PopulatedFirstPartySetsManagerTest, ComputeMetadata_ContextIsOwner) {
-  net::SchemefulSite example_site(GURL("https://example.test"));
-  std::set<net::SchemefulSite> context({example_site});
-
-  for (const net::SchemefulSite* top_frame :
-       std::initializer_list<net::SchemefulSite*>{&example_site, nullptr}) {
-    for (const net::SchemefulSite& site :
-         std::initializer_list<net::SchemefulSite>{
-             net::SchemefulSite(GURL("http://example.test")),
-             net::SchemefulSite(GURL("https://foo.test")),
-             net::SchemefulSite(GURL("https://member2.test")),
-             net::SchemefulSite(GURL("https://nonmember.test")),
-         }) {
-      EXPECT_EQ(ComputeMetadataAndWait(site, top_frame, context)
-                    .context()
-                    .context_type(),
-                Type::kCrossParty)
-          << site;
-    }
-    EXPECT_EQ(ComputeMetadataAndWait(example_site, top_frame, context)
-                  .context()
-                  .context_type(),
-              Type::kSameParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://member1.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kSameParty);
-  }
-}
-
-TEST_F(PopulatedFirstPartySetsManagerTest, ComputeMetadata_ContextIsMember) {
-  net::SchemefulSite member1(GURL("https://member1.test"));
-  std::set<net::SchemefulSite> context({member1});
-
-  net::SchemefulSite example_site(GURL("https://example.test"));
-
-  for (const net::SchemefulSite* top_frame :
-       std::initializer_list<net::SchemefulSite*>{&example_site, nullptr}) {
-    for (const net::SchemefulSite& site :
-         std::initializer_list<net::SchemefulSite>{
-             net::SchemefulSite(GURL("http://example.test")),
-             net::SchemefulSite(GURL("https://foo.test")),
-             net::SchemefulSite(GURL("https://member2.test")),
-             net::SchemefulSite(GURL("https://nonmember.test")),
-         }) {
-      EXPECT_EQ(ComputeMetadataAndWait(site, top_frame, context)
-                    .context()
-                    .context_type(),
-                Type::kCrossParty)
-          << site;
-    }
-    EXPECT_EQ(ComputeMetadataAndWait(example_site, top_frame, context)
-                  .context()
-                  .context_type(),
-              Type::kSameParty);
-
-    EXPECT_EQ(ComputeMetadataAndWait(example_site, top_frame, context)
-                  .context()
-                  .context_type(),
-              Type::kSameParty);
-
-    EXPECT_EQ(ComputeMetadataAndWait(member1, top_frame, context)
-                  .context()
-                  .context_type(),
-              Type::kSameParty);
-  }
-}
-
-TEST_F(PopulatedFirstPartySetsManagerTest,
-       ComputeMetadata_ContextIsOwnerAndMember) {
-  net::SchemefulSite example_site(GURL("https://example.test"));
-  net::SchemefulSite member1(GURL("https://member1.test"));
-  std::set<net::SchemefulSite> context({example_site, member1});
-
-  for (const net::SchemefulSite* top_frame :
-       std::initializer_list<net::SchemefulSite*>{&example_site, nullptr}) {
-    for (const net::SchemefulSite& site :
-         std::initializer_list<net::SchemefulSite>{
-             net::SchemefulSite(GURL("http://example.test")),
-             net::SchemefulSite(GURL("https://foo.test")),
-             net::SchemefulSite(GURL("https://member2.test")),
-             net::SchemefulSite(GURL("https://nonmember.test")),
-         }) {
-      EXPECT_EQ(ComputeMetadataAndWait(site, top_frame, context)
-                    .context()
-                    .context_type(),
-                Type::kCrossParty)
-          << site;
-    }
-    EXPECT_EQ(ComputeMetadataAndWait(example_site, top_frame, context)
-                  .context()
-                  .context_type(),
-              Type::kSameParty);
-
-    EXPECT_EQ(ComputeMetadataAndWait(member1, top_frame, context)
-                  .context()
-                  .context_type(),
-              Type::kSameParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://member3.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kSameParty);
-  }
-}
-
-TEST_F(PopulatedFirstPartySetsManagerTest,
-       ComputeMetadata_ContextMixesParties) {
-  net::SchemefulSite example_site(GURL("https://example.test"));
-  net::SchemefulSite member1(GURL("https://member1.test"));
-  net::SchemefulSite foo(GURL("https://foo.test"));
-  std::set<net::SchemefulSite> context({example_site, member1, foo});
-
-  for (const net::SchemefulSite* top_frame :
-       std::initializer_list<net::SchemefulSite*>{&example_site, nullptr}) {
-    for (const net::SchemefulSite& site :
-         std::initializer_list<net::SchemefulSite>{
-             example_site,
-             net::SchemefulSite(GURL("http://example.test")),
-             member1,
-             foo,
-             net::SchemefulSite(GURL("https://member2.test")),
-             net::SchemefulSite(GURL("https://nonmember.test")),
-         }) {
-      EXPECT_EQ(ComputeMetadataAndWait(site, top_frame, context)
-                    .context()
-                    .context_type(),
-                Type::kCrossParty)
-          << site;
-    }
-  }
-}
-
-TEST_F(PopulatedFirstPartySetsManagerTest,
-       ComputeMetadata_ContextMixesMembersAndNonmembers) {
-  net::SchemefulSite example_site(GURL("https://example.test"));
-  net::SchemefulSite member1(GURL("https://member1.test"));
-  std::set<net::SchemefulSite> context({
-      example_site,
-      member1,
-      net::SchemefulSite(GURL("http://nonmember.test")),
-  });
-
-  for (const net::SchemefulSite* top_frame :
-       std::initializer_list<net::SchemefulSite*>{&example_site, nullptr}) {
-    for (const net::SchemefulSite& site :
-         std::initializer_list<net::SchemefulSite>{
-             example_site,
-             net::SchemefulSite(GURL("http://example.test")),
-             member1,
-             net::SchemefulSite(GURL("https://foo.test")),
-             net::SchemefulSite(GURL("https://member2.test")),
-             net::SchemefulSite(GURL("https://nonmember.test")),
-         }) {
-      EXPECT_EQ(ComputeMetadataAndWait(site, top_frame, context)
-                    .context()
-                    .context_type(),
-                Type::kCrossParty)
-          << site;
-    }
-  }
-}
-
-TEST_F(PopulatedFirstPartySetsManagerTest,
-       ComputeMetadata_ContextMixesSchemes) {
-  net::SchemefulSite example_site(GURL("https://example.test"));
-  net::SchemefulSite example_http(GURL("http://example.test"));
-  net::SchemefulSite member1(GURL("https://member1.test"));
-  std::set<net::SchemefulSite> context({example_site, member1, example_http});
-
-  for (const net::SchemefulSite* top_frame :
-       std::initializer_list<net::SchemefulSite*>{&example_site, nullptr}) {
-    for (const net::SchemefulSite& site :
-         std::initializer_list<net::SchemefulSite>{
-             example_site,
-             example_http,
-             net::SchemefulSite(GURL("https://member1.test")),
-             net::SchemefulSite(GURL("https://foo.test")),
-             net::SchemefulSite(GURL("https://member2.test")),
-             net::SchemefulSite(GURL("https://nonmember.test")),
-         }) {
-      EXPECT_EQ(ComputeMetadataAndWait(site, top_frame, context)
-                    .context()
-                    .context_type(),
-                Type::kCrossParty)
-          << site;
-    }
-  }
-}
-
-TEST_F(PopulatedFirstPartySetsManagerTest, ComputeMetadata) {
-  net::SchemefulSite nonmember(GURL("https://nonmember.test"));
-  net::SchemefulSite nonmember1(GURL("https://nonmember1.test"));
-  net::SchemefulSite member(GURL("https://member1.test"));
-  net::SchemefulSite owner(GURL("https://example.test"));
-  net::SchemefulSite wss_member(GURL("wss://member1.test"));
-  net::SchemefulSite wss_nonmember(GURL("wss://nonmember.test"));
-  net::FirstPartySetEntry primary_entry(owner, net::SiteType::kPrimary,
-                                        absl::nullopt);
-  net::FirstPartySetEntry associated_entry(owner, net::SiteType::kAssociated,
-                                           0);
-
-  // Works as usual for sites that are in First-Party sets.
-  EXPECT_EQ(ComputeMetadataAndWait(member, &member, {member}),
-            net::FirstPartySetMetadata(net::SamePartyContext(Type::kSameParty),
-                                       &associated_entry, &associated_entry));
-  EXPECT_EQ(ComputeMetadataAndWait(owner, &member, {member}),
-            net::FirstPartySetMetadata(net::SamePartyContext(Type::kSameParty),
-                                       &primary_entry, &associated_entry));
-  EXPECT_EQ(ComputeMetadataAndWait(member, &owner, {member}),
-            net::FirstPartySetMetadata(net::SamePartyContext(Type::kSameParty),
-                                       &associated_entry, &primary_entry));
-  EXPECT_EQ(ComputeMetadataAndWait(member, &member, {owner}),
-            net::FirstPartySetMetadata(net::SamePartyContext(Type::kSameParty),
-                                       &associated_entry, &associated_entry));
-  EXPECT_EQ(ComputeMetadataAndWait(member, &member, {member, owner}),
-            net::FirstPartySetMetadata(net::SamePartyContext(Type::kSameParty),
-                                       &associated_entry, &associated_entry));
-
-  // Works if the site is provided with WSS scheme instead of HTTPS.
-  EXPECT_EQ(ComputeMetadataAndWait(wss_member, &member, {member, owner}),
-            net::FirstPartySetMetadata(net::SamePartyContext(Type::kSameParty),
-                                       &associated_entry, &associated_entry));
-
-  EXPECT_EQ(ComputeMetadataAndWait(nonmember, &member, {member}),
-            net::FirstPartySetMetadata(net::SamePartyContext(Type::kCrossParty),
-                                       nullptr, &associated_entry));
-  EXPECT_EQ(ComputeMetadataAndWait(member, &nonmember, {member}),
-            net::FirstPartySetMetadata(net::SamePartyContext(Type::kCrossParty),
-                                       &associated_entry, nullptr));
-  EXPECT_EQ(ComputeMetadataAndWait(wss_nonmember, &wss_member, {member, owner}),
-            net::FirstPartySetMetadata(net::SamePartyContext(Type::kCrossParty),
-                                       nullptr, &associated_entry));
-
-  EXPECT_EQ(ComputeMetadataAndWait(nonmember, &nonmember, {nonmember}),
-            net::FirstPartySetMetadata(net::SamePartyContext(Type::kCrossParty),
-                                       nullptr, nullptr));
-
-  EXPECT_EQ(ComputeMetadataAndWait(member, &member, {member, nonmember}),
-            net::FirstPartySetMetadata(net::SamePartyContext(Type::kCrossParty),
-                                       &associated_entry, &associated_entry));
-}
-
-class OverrideSetsFirstPartySetsManagerTest : public FirstPartySetsEnabledTest {
- public:
-  OverrideSetsFirstPartySetsManagerTest() {
-    net::SchemefulSite foo(GURL("https://foo.test"));
-    net::SchemefulSite example_test(GURL("https://example.test"));
-    net::SchemefulSite example_cctld(GURL("https://example.cctld"));
-    net::SchemefulSite member1(GURL("https://member1.test"));
-    net::SchemefulSite member2(GURL("https://member2.test"));
-
-    SetCompleteSets(
-        {
-            {member1, net::FirstPartySetEntry(example_test,
-                                              net::SiteType::kAssociated, 0)},
-            {member2, net::FirstPartySetEntry(example_test,
-                                              net::SiteType::kAssociated, 0)},
-            // Below are the owner self mappings.
-            {example_test,
-             net::FirstPartySetEntry(example_test, net::SiteType::kPrimary,
-                                     absl::nullopt)},
-        },
-        {{example_cctld, example_test}});
-
-    SetFirstPartySetsContextConfig({
-        // New entry:
-        {foo,
-         {net::FirstPartySetEntry(foo, net::SiteType::kPrimary,
-                                  absl::nullopt)}},
-        // Removed entry:
-        {member1, absl::nullopt},
-        // Remapped entry:
-        {member2,
-         {net::FirstPartySetEntry(foo, net::SiteType::kAssociated, 0)}},
-        // Removed alias:
-        {example_cctld, absl::nullopt},
-    });
-  }
-};
-
-TEST_F(OverrideSetsFirstPartySetsManagerTest, ComputeMetadata) {
-  net::SchemefulSite example(GURL("https://example.test"));
-  net::SchemefulSite foo(GURL("https://foo.test"));
-  net::SchemefulSite member1(GURL("https://member1.test"));
-  net::SchemefulSite member2(GURL("https://member2.test"));
-
-  net::FirstPartySetEntry example_primary_entry(
-      example, net::SiteType::kPrimary, absl::nullopt);
-  net::FirstPartySetEntry foo_primary_entry(foo, net::SiteType::kPrimary,
-                                            absl::nullopt);
-  net::FirstPartySetEntry foo_associated_entry(foo, net::SiteType::kAssociated,
-                                               0);
-
-  // member1 has been removed from its set.
-  EXPECT_EQ(ComputeMetadataAndWait(member1, &example, {}),
-            net::FirstPartySetMetadata(net::SamePartyContext(Type::kCrossParty),
-                                       nullptr, &example_primary_entry));
-
-  // member2 and foo are sites in a new set.
-  EXPECT_EQ(
-      ComputeMetadataAndWait(member2, &foo, {}),
-      net::FirstPartySetMetadata(net::SamePartyContext(Type::kSameParty),
-                                 &foo_associated_entry, &foo_primary_entry));
-}
-
 }  // namespace network
diff --git a/services/network/host_resolver_unittest.cc b/services/network/host_resolver_unittest.cc
index 0ec4d7c..7e99388 100644
--- a/services/network/host_resolver_unittest.cc
+++ b/services/network/host_resolver_unittest.cc
@@ -1456,8 +1456,7 @@
 net::DnsConfig CreateValidDnsConfig() {
   net::IPAddress dns_ip(192, 168, 1, 0);
   net::DnsConfig config;
-  config.nameservers.push_back(
-      net::IPEndPoint(dns_ip, net::dns_protocol::kDefaultPort));
+  config.nameservers.emplace_back(dns_ip, net::dns_protocol::kDefaultPort);
   EXPECT_TRUE(config.IsValid());
   return config;
 }
diff --git a/services/network/http_auth_cache_copier.cc b/services/network/http_auth_cache_copier.cc
index 436adfc4..9288f331 100644
--- a/services/network/http_auth_cache_copier.cc
+++ b/services/network/http_auth_cache_copier.cc
@@ -15,9 +15,9 @@
 base::UnguessableToken HttpAuthCacheCopier::SaveHttpAuthCache(
     const net::HttpAuthCache& cache) {
   base::UnguessableToken key = base::UnguessableToken::Create();
-  auto cache_it = caches_.emplace(std::make_pair(
+  auto cache_it = caches_.emplace(
       key, std::make_unique<net::HttpAuthCache>(
-               cache.key_server_entries_by_network_isolation_key())));
+               cache.key_server_entries_by_network_isolation_key()));
   DCHECK(cache_it.second);
   cache_it.first->second->CopyProxyEntriesFrom(cache);
   return key;
diff --git a/services/network/network_context_unittest.cc b/services/network/network_context_unittest.cc
index 3c3c33b..12b36f4 100644
--- a/services/network/network_context_unittest.cc
+++ b/services/network/network_context_unittest.cc
@@ -1360,7 +1360,7 @@
         net::X509Certificate::FORMAT_PEM_CERT_SEQUENCE);
     ASSERT_TRUE(result.verified_cert);
     net::SHA256HashValue hash = {{0x00, 0x01}};
-    result.public_key_hashes.push_back(net::HashValue(hash));
+    result.public_key_hashes.emplace_back(hash);
     result.is_issued_by_known_root = true;
     net::MockCertVerifier mock_verifier;
     mock_verifier.AddResultForCert(pkp_test_server.GetCertificate(), result,
@@ -4953,7 +4953,7 @@
 TEST_F(NetworkContextTest, ExpectCT) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeatures(
-      {net::TransportSecurityState::kDynamicExpectCTFeature,
+      {net::kDynamicExpectCTFeature,
        net::features::kPartitionExpectCTStateByNetworkIsolationKey},
       {});
 
diff --git a/services/network/network_service_unittest.cc b/services/network/network_service_unittest.cc
index 1b3aa05e..035fe5d 100644
--- a/services/network/network_service_unittest.cc
+++ b/services/network/network_service_unittest.cc
@@ -530,7 +530,7 @@
 TEST_F(NetworkServiceTest, DnsClientEnableDisable) {
   // Create valid DnsConfig.
   net::DnsConfig config;
-  config.nameservers.push_back(net::IPEndPoint());
+  config.nameservers.emplace_back();
   auto dns_client = std::make_unique<net::MockDnsClient>(
       std::move(config), net::MockDnsClientRuleList());
   dns_client->set_ignore_system_config_changes(true);
@@ -602,7 +602,7 @@
 
   // Create valid DnsConfig.
   net::DnsConfig config;
-  config.nameservers.push_back(net::IPEndPoint());
+  config.nameservers.emplace_back();
   auto dns_client = std::make_unique<net::MockDnsClient>(
       std::move(config), net::MockDnsClientRuleList());
   dns_client->set_ignore_system_config_changes(true);
@@ -693,7 +693,7 @@
                                   std::move(context_params));
 
   net::DnsConfig config;
-  config.nameservers.push_back(net::IPEndPoint());
+  config.nameservers.emplace_back();
   config.doh_config =
       *net::DnsOverHttpsConfig::FromString("https://example.com/");
   auto dns_client = std::make_unique<net::MockDnsClient>(
@@ -716,7 +716,7 @@
                                   std::move(context_params1));
 
   net::DnsConfig config;
-  config.nameservers.push_back(net::IPEndPoint());
+  config.nameservers.emplace_back();
   config.doh_config =
       *net::DnsOverHttpsConfig::FromString("https://example.com/");
   auto dns_client = std::make_unique<net::MockDnsClient>(
@@ -746,7 +746,7 @@
 
 TEST_F(NetworkServiceTest, DohProbe_ContextAddedBeforeTimeout) {
   net::DnsConfig config;
-  config.nameservers.push_back(net::IPEndPoint());
+  config.nameservers.emplace_back();
   config.doh_config =
       *net::DnsOverHttpsConfig::FromString("https://example.com/");
   auto dns_client = std::make_unique<net::MockDnsClient>(
@@ -771,7 +771,7 @@
 
 TEST_F(NetworkServiceTest, DohProbe_ContextAddedAfterTimeout) {
   net::DnsConfig config;
-  config.nameservers.push_back(net::IPEndPoint());
+  config.nameservers.emplace_back();
   config.doh_config =
       *net::DnsOverHttpsConfig::FromString("https://example.com/");
   auto dns_client = std::make_unique<net::MockDnsClient>(
@@ -801,7 +801,7 @@
                                   std::move(context_params));
 
   net::DnsConfig config;
-  config.nameservers.push_back(net::IPEndPoint());
+  config.nameservers.emplace_back();
   config.doh_config =
       *net::DnsOverHttpsConfig::FromString("https://example.com/");
   auto dns_client = std::make_unique<net::MockDnsClient>(
@@ -828,7 +828,7 @@
                                   std::move(context_params));
 
   net::DnsConfig config;
-  config.nameservers.push_back(net::IPEndPoint());
+  config.nameservers.emplace_back();
   config.doh_config =
       *net::DnsOverHttpsConfig::FromString("https://example.com/");
   auto dns_client = std::make_unique<net::MockDnsClient>(
diff --git a/services/network/proxy_resolving_client_socket_unittest.cc b/services/network/proxy_resolving_client_socket_unittest.cc
index 738488a..7b63904 100644
--- a/services/network/proxy_resolving_client_socket_unittest.cc
+++ b/services/network/proxy_resolving_client_socket_unittest.cc
@@ -463,11 +463,11 @@
     std::vector<net::MockWrite> writes;
     std::vector<net::MockRead> reads;
     if (!test.is_direct) {
-      writes.push_back(
-          net::MockWrite("CONNECT example.com:80 HTTP/1.1\r\n"
-                         "Host: example.com:80\r\n"
-                         "Proxy-Connection: keep-alive\r\n\r\n"));
-      reads.push_back(net::MockRead("HTTP/1.1 200 Success\r\n\r\n"));
+      writes.emplace_back(
+          "CONNECT example.com:80 HTTP/1.1\r\n"
+          "Host: example.com:80\r\n"
+          "Proxy-Connection: keep-alive\r\n\r\n");
+      reads.emplace_back("HTTP/1.1 200 Success\r\n\r\n");
     }
     if (test.is_read_error) {
       reads.emplace_back(test.is_error_sync ? net::SYNCHRONOUS : net::ASYNC,
diff --git a/services/network/proxy_resolving_socket_mojo_unittest.cc b/services/network/proxy_resolving_socket_mojo_unittest.cc
index e346eeb..9c073db 100644
--- a/services/network/proxy_resolving_socket_mojo_unittest.cc
+++ b/services/network/proxy_resolving_socket_mojo_unittest.cc
@@ -275,15 +275,13 @@
   int sequence_number = 0;
   for (int j = 0; j < kNumIterations; ++j) {
     for (size_t i = 0; i < kMsgSize; ++i) {
-      reads.push_back(
-          net::MockRead(net::ASYNC, &kTestMsg[i], 1, sequence_number++));
+      reads.emplace_back(net::ASYNC, &kTestMsg[i], 1, sequence_number++);
     }
     if (j == kNumIterations - 1) {
-      reads.push_back(net::MockRead(net::ASYNC, net::OK, sequence_number++));
+      reads.emplace_back(net::ASYNC, net::OK, sequence_number++);
     }
     for (size_t i = 0; i < kMsgSize; ++i) {
-      writes.push_back(
-          net::MockWrite(net::ASYNC, &kTestMsg[i], 1, sequence_number++));
+      writes.emplace_back(net::ASYNC, &kTestMsg[i], 1, sequence_number++);
     }
   }
   net::StaticSocketDataProvider data_provider(reads, writes);
diff --git a/services/network/public/cpp/cors/origin_access_list.cc b/services/network/public/cpp/cors/origin_access_list.cc
index dfd9dcca..87b67cf 100644
--- a/services/network/public/cpp/cors/origin_access_list.cc
+++ b/services/network/public/cpp/cors/origin_access_list.cc
@@ -153,10 +153,9 @@
   Patterns& patterns_for_type = patterns_map[type];
   patterns_for_type.clear();
   for (const auto& pattern : patterns) {
-    patterns_for_type.push_back(
-        OriginAccessEntry(pattern->protocol, pattern->domain, pattern->port,
-                          pattern->domain_match_mode, pattern->port_match_mode,
-                          pattern->priority));
+    patterns_for_type.emplace_back(pattern->protocol, pattern->domain,
+                                   pattern->port, pattern->domain_match_mode,
+                                   pattern->port_match_mode, pattern->priority);
   }
   if (patterns_map[MapType::kAllowPatterns].empty() &&
       patterns_map[MapType::kBlockPatterns].empty()) {
@@ -173,9 +172,9 @@
   DCHECK(!source_origin.opaque());
 
   const std::string source = source_origin.Serialize();
-  (*map)[source][type].push_back(OriginAccessEntry(
+  (*map)[source][type].emplace_back(
       pattern->protocol, pattern->domain, pattern->port,
-      pattern->domain_match_mode, pattern->port_match_mode, pattern->priority));
+      pattern->domain_match_mode, pattern->port_match_mode, pattern->priority);
 }
 
 // static
diff --git a/services/network/public/cpp/server/http_server_response_info.cc b/services/network/public/cpp/server/http_server_response_info.cc
index d50c188..d8e0331 100644
--- a/services/network/public/cpp/server/http_server_response_info.cc
+++ b/services/network/public/cpp/server/http_server_response_info.cc
@@ -38,7 +38,7 @@
 
 void HttpServerResponseInfo::AddHeader(const std::string& name,
                                        const std::string& value) {
-  headers_.push_back(std::make_pair(name, value));
+  headers_.emplace_back(name, value);
 }
 
 void HttpServerResponseInfo::SetBody(const std::string& body,
diff --git a/services/network/public/cpp/server/http_server_unittest.cc b/services/network/public/cpp/server/http_server_unittest.cc
index 32114464..398fd43 100644
--- a/services/network/public/cpp/server/http_server_unittest.cc
+++ b/services/network/public/cpp/server/http_server_unittest.cc
@@ -209,7 +209,7 @@
 
   void OnHttpRequest(int connection_id,
                      const HttpServerRequestInfo& info) override {
-    requests_.push_back(std::make_pair(info, connection_id));
+    requests_.emplace_back(info, connection_id);
     if (requests_.size() == quit_after_request_count_) {
       run_loop_quit_func_.Run();
     }
diff --git a/services/network/socket_data_pump_unittest.cc b/services/network/socket_data_pump_unittest.cc
index d97040d9..b58f7634 100644
--- a/services/network/socket_data_pump_unittest.cc
+++ b/services/network/socket_data_pump_unittest.cc
@@ -162,14 +162,13 @@
   net::IoMode mode = GetParam();
   for (int j = 0; j < kNumIterations; ++j) {
     for (size_t i = 0; i < kMsgSize; ++i) {
-      reads.push_back(net::MockRead(mode, &kTestMsg[i], 1, sequence_number++));
+      reads.emplace_back(mode, &kTestMsg[i], 1, sequence_number++);
     }
     if (j == kNumIterations - 1) {
-      reads.push_back(net::MockRead(mode, net::OK, sequence_number++));
+      reads.emplace_back(mode, net::OK, sequence_number++);
     }
     for (size_t i = 0; i < kMsgSize; ++i) {
-      writes.push_back(
-          net::MockWrite(mode, &kTestMsg[i], 1, sequence_number++));
+      writes.emplace_back(mode, &kTestMsg[i], 1, sequence_number++);
     }
   }
   net::StaticSocketDataProvider data_provider(reads, writes);
@@ -203,14 +202,13 @@
   net::IoMode mode = GetParam();
   for (int j = 0; j < kNumIterations; ++j) {
     for (size_t i = 0; i < kMsgSize; ++i) {
-      reads.push_back(net::MockRead(mode, &kTestMsg[i], 1, sequence_number++));
+      reads.emplace_back(mode, &kTestMsg[i], 1, sequence_number++);
     }
     if (j == kNumIterations - 1) {
-      reads.push_back(net::MockRead(mode, net::OK, sequence_number++));
+      reads.emplace_back(mode, net::OK, sequence_number++);
     }
     for (size_t i = 0; i < kMsgSize; ++i) {
-      writes.push_back(
-          net::MockWrite(mode, &kTestMsg[i], 1, sequence_number++));
+      writes.emplace_back(mode, &kTestMsg[i], 1, sequence_number++);
     }
   }
   net::StaticSocketDataProvider data_provider(reads, writes);
diff --git a/services/network/tcp_socket_unittest.cc b/services/network/tcp_socket_unittest.cc
index 2108b48..c7de359 100644
--- a/services/network/tcp_socket_unittest.cc
+++ b/services/network/tcp_socket_unittest.cc
@@ -221,8 +221,7 @@
                 mojo::PendingRemote<mojom::TCPConnectedSocket> connected_socket,
                 mojo::ScopedDataPipeConsumerHandle receive_pipe_handle,
                 mojo::ScopedDataPipeProducerHandle send_pipe_handle) {
-    connected_sockets_.push_back(
-        mojo::Remote<mojom::TCPConnectedSocket>(std::move(connected_socket)));
+    connected_sockets_.emplace_back(std::move(connected_socket));
     server_socket_receive_handle_ = std::move(receive_pipe_handle);
     server_socket_send_handle_ = std::move(send_pipe_handle);
     std::move(callback).Run(result);
@@ -905,14 +904,13 @@
   net::IoMode mode = GetParam();
   for (int j = 0; j < kNumIterations; ++j) {
     for (size_t i = 0; i < kMsgSize; ++i) {
-      reads.push_back(net::MockRead(mode, &kTestMsg[i], 1, sequence_number++));
+      reads.emplace_back(mode, &kTestMsg[i], 1, sequence_number++);
     }
     if (j == kNumIterations - 1) {
-      reads.push_back(net::MockRead(mode, net::OK, sequence_number++));
+      reads.emplace_back(mode, net::OK, sequence_number++);
     }
     for (size_t i = 0; i < kMsgSize; ++i) {
-      writes.push_back(
-          net::MockWrite(mode, &kTestMsg[i], 1, sequence_number++));
+      writes.emplace_back(mode, &kTestMsg[i], 1, sequence_number++);
     }
   }
   net::StaticSocketDataProvider data_provider(reads, writes);
@@ -957,14 +955,13 @@
   net::IoMode mode = GetParam();
   for (int j = 0; j < kNumIterations; ++j) {
     for (size_t i = 0; i < kMsgSize; ++i) {
-      reads.push_back(net::MockRead(mode, &kTestMsg[i], 1, sequence_number++));
+      reads.emplace_back(mode, &kTestMsg[i], 1, sequence_number++);
     }
     if (j == kNumIterations - 1) {
-      reads.push_back(net::MockRead(mode, net::OK, sequence_number++));
+      reads.emplace_back(mode, net::OK, sequence_number++);
     }
     for (size_t i = 0; i < kMsgSize; ++i) {
-      writes.push_back(
-          net::MockWrite(mode, &kTestMsg[i], 1, sequence_number++));
+      writes.emplace_back(mode, &kTestMsg[i], 1, sequence_number++);
     }
   }
   net::StaticSocketDataProvider data_provider(reads, writes);
diff --git a/services/network/test/test_url_loader_factory.cc b/services/network/test/test_url_loader_factory.cc
index a002de5..cb551f7 100644
--- a/services/network/test/test_url_loader_factory.cc
+++ b/services/network/test/test_url_loader_factory.cc
@@ -159,8 +159,7 @@
 
   Redirects redirects;
   for (auto& redirect : it->second.redirects) {
-    redirects.push_back(
-        std::make_pair(redirect.first, redirect.second.Clone()));
+    redirects.emplace_back(redirect.first, redirect.second.Clone());
   }
   SimulateResponse(client, std::move(redirects), it->second.head.Clone(),
                    it->second.content, it->second.status, it->second.flags);
diff --git a/services/network/test/test_url_loader_factory_unittest.cc b/services/network/test/test_url_loader_factory_unittest.cc
index da8be37..0f66b306 100644
--- a/services/network/test/test_url_loader_factory_unittest.cc
+++ b/services/network/test/test_url_loader_factory_unittest.cc
@@ -137,7 +137,7 @@
   redirect_info.status_code = 301;
   redirect_info.new_url = GURL("http://example2.test/");
   TestURLLoaderFactory::Redirects redirects;
-  redirects.push_back({redirect_info, mojom::URLResponseHead::New()});
+  redirects.emplace_back(redirect_info, mojom::URLResponseHead::New());
   URLLoaderCompletionStatus status;
   std::string content = "foo";
   factory()->AddResponse(url, mojom::URLResponseHead::New(), content, status,
diff --git a/services/network/tls_client_socket_unittest.cc b/services/network/tls_client_socket_unittest.cc
index 5954f4b..56e7e0b 100644
--- a/services/network/tls_client_socket_unittest.cc
+++ b/services/network/tls_client_socket_unittest.cc
@@ -971,15 +971,13 @@
   net::IoMode mode = GetParam();
   for (int j = 0; j < kNumIterations; ++j) {
     for (size_t i = 0; i < kSecretMsgSize; ++i) {
-      writes.push_back(
-          net::MockWrite(mode, &kSecretMsg[i], 1, sequence_number++));
+      writes.emplace_back(mode, &kSecretMsg[i], 1, sequence_number++);
     }
     for (size_t i = 0; i < kSecretMsgSize; ++i) {
-      reads.push_back(
-          net::MockRead(net::ASYNC, &kSecretMsg[i], 1, sequence_number++));
+      reads.emplace_back(net::ASYNC, &kSecretMsg[i], 1, sequence_number++);
     }
     if (j == kNumIterations - 1) {
-      reads.push_back(net::MockRead(mode, net::OK, sequence_number++));
+      reads.emplace_back(mode, net::OK, sequence_number++);
     }
   }
   net::SequencedSocketData data_provider(reads, writes);
diff --git a/services/network/trust_tokens/boringssl_trust_token_issuance_cryptographer.cc b/services/network/trust_tokens/boringssl_trust_token_issuance_cryptographer.cc
index a077f09..d81724b 100644
--- a/services/network/trust_tokens/boringssl_trust_token_issuance_cryptographer.cc
+++ b/services/network/trust_tokens/boringssl_trust_token_issuance_cryptographer.cc
@@ -108,8 +108,8 @@
   for (size_t i = 0; i < sk_TRUST_TOKEN_num(tokens.get()); ++i) {
     TRUST_TOKEN* token = sk_TRUST_TOKEN_value(tokens.get(), i);
     // Copy the token's contents.
-    ret->tokens.push_back(
-        std::string(reinterpret_cast<const char*>(token->data), token->len));
+    ret->tokens.emplace_back(reinterpret_cast<const char*>(token->data),
+                             token->len);
   }
 
   return ret;
diff --git a/services/network/trust_tokens/trust_token_key_commitment_controller_unittest.cc b/services/network/trust_tokens/trust_token_key_commitment_controller_unittest.cc
index aa15479..d50d143b 100644
--- a/services/network/trust_tokens/trust_token_key_commitment_controller_unittest.cc
+++ b/services/network/trust_tokens/trust_token_key_commitment_controller_unittest.cc
@@ -238,7 +238,7 @@
   redirect_info.status_code = 301;
   redirect_info.new_url = GURL("https://unused-redirect-destination.com/");
   network::TestURLLoaderFactory::Redirects redirects;
-  redirects.push_back({redirect_info, network::mojom::URLResponseHead::New()});
+  redirects.emplace_back(redirect_info, network::mojom::URLResponseHead::New());
   auto head = network::CreateURLResponseHead(net::HTTP_OK);
   factory.AddResponse(IssuerDotComKeyCommitmentPath(), std::move(head),
                       /*content=*/"", network::URLLoaderCompletionStatus(),
diff --git a/services/network/trust_tokens/trust_token_key_commitment_parser.cc b/services/network/trust_tokens/trust_token_key_commitment_parser.cc
index 00c4e54..1f25887 100644
--- a/services/network/trust_tokens/trust_token_key_commitment_parser.cc
+++ b/services/network/trust_tokens/trust_token_key_commitment_parser.cc
@@ -300,9 +300,8 @@
     if (!commitment_result)
       continue;
 
-    parsed_entries.emplace_back(Entry(std::move(*maybe_issuer),
-                                      raw_key_from_json,
-                                      std::move(commitment_result)));
+    parsed_entries.emplace_back(std::move(*maybe_issuer), raw_key_from_json,
+                                std::move(commitment_result));
   }
 
   // Deterministically deduplicate entries corresponding to the same issuer,
diff --git a/services/network/trust_tokens/trust_token_request_signing_helper.cc b/services/network/trust_tokens/trust_token_request_signing_helper.cc
index a570f05..73b72b4 100644
--- a/services/network/trust_tokens/trust_token_request_signing_helper.cc
+++ b/services/network/trust_tokens/trust_token_request_signing_helper.cc
@@ -534,14 +534,14 @@
     const SuitableTrustTokenOrigin& issuer = kv.first;
     const std::vector<uint8_t>& signature = kv.second;
 
-    keys_and_signatures.emplace_back(net::structured_headers::ParameterizedItem(
+    keys_and_signatures.emplace_back(
         net::structured_headers::Item(
             issuer.Serialize(),
             net::structured_headers::Item::ItemType::kStringType),
         // records_per_issuer is guaranteed to have all of the keys that
         // signatures_per_issuer does, so using |at| is safe:
         ConstructKeyAndSignaturePair(records_per_issuer.at(issuer), signature,
-                                     *signer_)));
+                                     *signer_));
   }
 
   header_items[kSignatureHeaderSignaturesKey] =
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc
index e7101d68f..279c24c 100644
--- a/services/network/url_loader_unittest.cc
+++ b/services/network/url_loader_unittest.cc
@@ -3808,8 +3808,7 @@
         loader_remote.InitWithNewPipeAndPassReceiver(), request,
         client.CreateRemote());
 
-    loaders.emplace_back(
-        std::make_pair(std::move(url_loader), std::move(loader_remote)));
+    loaders.emplace_back(std::move(url_loader), std::move(loader_remote));
   }
 
   base::RunLoop().RunUntilIdle();
diff --git a/services/network/web_transport_unittest.cc b/services/network/web_transport_unittest.cc
index 40626ea..f0a7d5b 100644
--- a/services/network/web_transport_unittest.cc
+++ b/services/network/web_transport_unittest.cc
@@ -208,8 +208,7 @@
 
   // mojom::WebTransportClient implementation.
   void OnDatagramReceived(base::span<const uint8_t> data) override {
-    received_datagrams_.push_back(
-        std::vector<uint8_t>(data.begin(), data.end()));
+    received_datagrams_.emplace_back(data.begin(), data.end());
   }
   void OnIncomingStreamClosed(uint32_t stream_id, bool fin_received) override {
     closed_incoming_streams_.insert(std::make_pair(stream_id, fin_received));
diff --git a/services/network/websocket.cc b/services/network/websocket.cc
index 639d69d..72715609 100644
--- a/services/network/websocket.cc
+++ b/services/network/websocket.cc
@@ -506,7 +506,7 @@
   const bool do_not_fragment =
       reassemble_short_messages_ && data_length <= kSmallMessageThreshhold;
 
-  pending_send_data_frames_.push(DataFrame(type, data_length, do_not_fragment));
+  pending_send_data_frames_.emplace(type, data_length, do_not_fragment);
 
   // Safe if ReadAndSendFromDataPipe() deletes |this| because this method is
   // only called from mojo.
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
index 6bf1977..da4cd2e 100644
--- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
+++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -2523,18 +2523,18 @@
 
   kV8Document_HasTrustToken_Method = 3202,
   kForceLoadAtTop = 3203,
-  kLegacyLayoutByDetailsMarker = 3206,
-  kLegacyLayoutByEditing = 3207,
-  kLegacyLayoutByFrameSet = 3211,
-  kLegacyLayoutByGrid = 3212,
-  kLegacyLayoutByMultiCol = 3214,
-  kLegacyLayoutByPrinting = 3215,
-  kLegacyLayoutBySVG = 3217,
-  kLegacyLayoutByTable = 3219,
-  kLegacyLayoutByTextCombine = 3220,
-  kLegacyLayoutByTextControl = 3221,
-  kLegacyLayoutByVTTCue = 3222,
-  kLegacyLayoutByTableFlexGridBlockInNGFragmentationContext = 3224,
+  kOBSOLETE_LegacyLayoutByDetailsMarker = 3206,
+  kOBSOLETE_LegacyLayoutByEditing = 3207,
+  kOBSOLETE_LegacyLayoutByFrameSet = 3211,
+  kOBSOLETE_LegacyLayoutByGrid = 3212,
+  kOBSOLETE_LegacyLayoutByMultiCol = 3214,
+  kOBSOLETE_LegacyLayoutByPrinting = 3215,
+  kOBSOLETE_LegacyLayoutBySVG = 3217,
+  kOBSOLETE_LegacyLayoutByTable = 3219,
+  kOBSOLETE_LegacyLayoutByTextCombine = 3220,
+  kOBSOLETE_LegacyLayoutByTextControl = 3221,
+  kOBSOLETE_LegacyLayoutByVTTCue = 3222,
+  kOBSOLETE_LegacyLayoutByTableFlexGridBlockInNGFragmentationContext = 3224,
   kDocumentPolicyHeader = 3225,
   kDocumentPolicyReportOnlyHeader = 3226,
   kRequireDocumentPolicyHeader = 3227,
@@ -2749,7 +2749,7 @@
   kPluginName = 3443,
   kPluginFilename = 3444,
   kPluginDescription = 3445,
-  kSubresourceWebBundles = 3446,
+  kOBSOLETE_SubresourceWebBundles = 3446,
   kRTCPeerConnectionSetRemoteDescriptionPromise = 3447,
   kRTCPeerConnectionSetLocalDescriptionPromise = 3448,
   kRTCPeerConnectionCreateOfferPromise = 3449,
diff --git a/third_party/blink/renderer/README.md b/third_party/blink/renderer/README.md
index 97df608..30b91738 100644
--- a/third_party/blink/renderer/README.md
+++ b/third_party/blink/renderer/README.md
@@ -171,6 +171,31 @@
 Blink can use Mojo and directly talk to the browser process. This allows removal of unnecessary
 public APIs and abstraction layers and it is highly recommended.
 
+### Threading model
+
+When you need to use threads in Blink, cross-thread communication should be
+done with a message passing model (i.e.,
+call cross_thread_task_runner->PostTask() with cloned POD input parameters).
+
+A shared memory model (e.g., using mutex locks or atomics) is strongly
+discouraged. The rationale is that mutex locks and atomics are really
+hard to use correctly, and even if it appears to be manageable initially, it
+gets out of control easily. Historically, shared memory programming patterns
+in Blink have been one of the major sources of use-after-free security bugs and
+stability issues (e.g., WebAudio, memory access via CrossThreadPersistent).
+Remember that, unlike V8, Blink does not have a strict API boundary and is
+touched by many developers, and thus it's more important to adopt a less
+error-prone programming pattern. There are existing instances of shared and
+concurrent memory access in blink, but they should not be extended or
+cargo-culted. Just because you see a shared memory pattern in the code does
+not mean it's okay to use the pattern elsewhere.
+
+Introducing a few mutex locks or atomics in simple classes (e.g., shared
+counters) is fine. However, when you need to introduce a non-trivial number
+of mutex locks and atomics, the architecture needs to be designed and
+reviewed carefully. In that case, please get approval from
+platform-architecture-dev@chromium.org.
+
 ## Contact
 
 If you have any questions about the directory architecture and dependencies,
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index 08a2d26..c0fb2cb3 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -433,13 +433,8 @@
   // layout (because of the above check), which would re-attach all layout
   // objects, which would cause the frameset to lose state of some sort, leaving
   // everything blank when printed.
-  if (document.IsFrameSet() &&
-      !RuntimeEnabledFeatures::LayoutNGFrameSetEnabled()) {
-    UseCounter::Count(document, WebFeature::kLegacyLayoutByFrameSet);
-    return true;
-  }
-
-  return false;
+  return document.IsFrameSet() &&
+         !RuntimeEnabledFeatures::LayoutNGFrameSetEnabled();
 }
 
 bool CalculateStyleShouldForceLegacyLayout(const Element& element,
@@ -452,27 +447,20 @@
   if (!RuntimeEnabledFeatures::LayoutNGBlockFragmentationEnabled()) {
     // Disable NG for the entire subtree if we're establishing a multicol
     // container.
-    if (style.SpecifiesColumns()) {
-      UseCounter::Count(document, WebFeature::kLegacyLayoutByMultiCol);
+    if (style.SpecifiesColumns())
       return true;
-    }
   }
 
   if (document.Printing() && element == document.documentElement() &&
       !RuntimeEnabledFeatures::LayoutNGPrintingEnabled()) {
-    UseCounter::Count(document, WebFeature::kLegacyLayoutByPrinting);
     return true;
   }
 
   if (NeedsLegacyLayoutForEntireDocument(document))
     return true;
 
-  if (NeedsLegacyBlockFragmentation(element, style)) {
-    UseCounter::Count(
-        document,
-        WebFeature::kLegacyLayoutByTableFlexGridBlockInNGFragmentationContext);
+  if (NeedsLegacyBlockFragmentation(element, style))
     return true;
-  }
 
   return false;
 }
diff --git a/third_party/blink/renderer/core/html/build.gni b/third_party/blink/renderer/core/html/build.gni
index f3a89cd..3ac1702 100644
--- a/third_party/blink/renderer/core/html/build.gni
+++ b/third_party/blink/renderer/core/html/build.gni
@@ -326,8 +326,6 @@
   "html_li_element.h",
   "html_link_element.cc",
   "html_link_element.h",
-  "html_main_element.cc",
-  "html_main_element.h",
   "html_map_element.cc",
   "html_map_element.h",
   "html_marquee_element.cc",
diff --git a/third_party/blink/renderer/core/html/html_element.cc b/third_party/blink/renderer/core/html/html_element.cc
index 789544f3..fe0cf970 100644
--- a/third_party/blink/renderer/core/html/html_element.cc
+++ b/third_party/blink/renderer/core/html/html_element.cc
@@ -181,22 +181,10 @@
   return DynamicTo<HTMLElement>(FlatTreeTraversal::ParentElement(element));
 }
 
-bool IsDescendentOfMainElement(const Node* node) {
-  DCHECK(node);
-  do {
-    if (IsA<HTMLMainElement>(node)) {
-      return true;
-    }
-    node = node->parentNode();
-  } while (node);
-  return false;
-}
-
 void CheckSoftNavigationHeuristicsTracking(const Document& document,
                                            const Node* insertion_point) {
   DCHECK(insertion_point);
-  if (document.IsTrackingSoftNavigationHeuristics() &&
-      IsDescendentOfMainElement(insertion_point)) {
+  if (document.IsTrackingSoftNavigationHeuristics()) {
     LocalDOMWindow* window = document.domWindow();
     if (!window) {
       return;
@@ -213,7 +201,7 @@
     SoftNavigationHeuristics* heuristics =
         SoftNavigationHeuristics::From(*window);
     DCHECK(heuristics);
-    heuristics->ModifiedMain(script_state);
+    heuristics->ModifiedDOM(script_state);
   }
 }
 
diff --git a/third_party/blink/renderer/core/html/html_main_element.cc b/third_party/blink/renderer/core/html/html_main_element.cc
deleted file mode 100644
index 0437082..0000000
--- a/third_party/blink/renderer/core/html/html_main_element.cc
+++ /dev/null
@@ -1,46 +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 "third_party/blink/renderer/core/html/html_main_element.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
-#include "third_party/blink/renderer/core/dom/document.h"
-#include "third_party/blink/renderer/core/timing/soft_navigation_heuristics.h"
-
-namespace blink {
-
-HTMLMainElement::HTMLMainElement(Document& document)
-    : HTMLElement(html_names::kMainTag, document) {}
-
-Node::InsertionNotificationRequest HTMLMainElement::InsertedInto(
-    ContainerNode& container_node) {
-  // Here we don't really know that the insertion was API driven rather than
-  // parser driven, but the overhead is minimal and it won't result in
-  // correctness issues.
-  NotifySoftNavigationHeuristics();
-  return HTMLElement::InsertedInto(container_node);
-}
-
-void HTMLMainElement::NotifySoftNavigationHeuristics() {
-  const Document& document = GetDocument();
-  LocalDOMWindow* window = document.domWindow();
-  if (!window) {
-    return;
-  }
-
-  LocalFrame* frame = window->GetFrame();
-  if (!frame || !frame->IsMainFrame()) {
-    return;
-  }
-  ScriptState* script_state = ToScriptStateForMainWorld(frame);
-  if (!script_state) {
-    return;
-  }
-
-  SoftNavigationHeuristics* heuristics =
-      SoftNavigationHeuristics::From(*window);
-  DCHECK(heuristics);
-  heuristics->ModifiedMain(script_state);
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/html/html_main_element.h b/third_party/blink/renderer/core/html/html_main_element.h
deleted file mode 100644
index 56ea617e9..0000000
--- a/third_party/blink/renderer/core/html/html_main_element.h
+++ /dev/null
@@ -1,25 +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 THIRD_PARTY_BLINK_RENDERER_CORE_HTML_HTML_MAIN_ELEMENT_H_
-#define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_HTML_MAIN_ELEMENT_H_
-
-#include "third_party/blink/renderer/core/core_export.h"
-#include "third_party/blink/renderer/core/dom/node.h"
-#include "third_party/blink/renderer/core/html/html_element.h"
-
-namespace blink {
-
-class CORE_EXPORT HTMLMainElement final : public HTMLElement {
- public:
-  explicit HTMLMainElement(Document&);
-  InsertionNotificationRequest InsertedInto(ContainerNode&) override;
-
- private:
-  void NotifySoftNavigationHeuristics();
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_HTML_HTML_MAIN_ELEMENT_H_
diff --git a/third_party/blink/renderer/core/html/html_script_element.cc b/third_party/blink/renderer/core/html/html_script_element.cc
index 3374507c..cae3ce1 100644
--- a/third_party/blink/renderer/core/html/html_script_element.cc
+++ b/third_party/blink/renderer/core/html/html_script_element.cc
@@ -380,10 +380,8 @@
       RuntimeEnabledFeatures::SpeculationRulesEnabled(execution_context)) {
     return true;
   }
-  if ((type == script_type_names::kWebbundle) &&
-      RuntimeEnabledFeatures::SubresourceWebBundlesEnabled(execution_context)) {
+  if (type == script_type_names::kWebbundle)
     return true;
-  }
 
   return false;
 }
diff --git a/third_party/blink/renderer/core/html/html_tag_names.json5 b/third_party/blink/renderer/core/html/html_tag_names.json5
index 61e1a3a..2a0b8c3 100644
--- a/third_party/blink/renderer/core/html/html_tag_names.json5
+++ b/third_party/blink/renderer/core/html/html_tag_names.json5
@@ -291,7 +291,7 @@
     },
     {
       name: "main",
-      interfaceName: "HTMLMainElement",
+      interfaceName: "HTMLElement",
     },
     "map",
     {
diff --git a/third_party/blink/renderer/core/html/track/vtt/vtt_cue_box.cc b/third_party/blink/renderer/core/html/track/vtt/vtt_cue_box.cc
index 2d23ab2..fb6d9be 100644
--- a/third_party/blink/renderer/core/html/track/vtt/vtt_cue_box.cc
+++ b/third_party/blink/renderer/core/html/track/vtt/vtt_cue_box.cc
@@ -157,7 +157,6 @@
   if (RuntimeEnabledFeatures::LayoutNGVTTCueEnabled())
     return LayoutObjectFactory::CreateBlockFlow(*this, style, legacy);
 
-  UseCounter::Count(GetDocument(), WebFeature::kLegacyLayoutByVTTCue);
   return MakeGarbageCollected<LayoutVTTCue>(this, snap_to_lines_position_);
 }
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
index 6046ab9..89cd3d3 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
@@ -1029,8 +1029,6 @@
 
   NGOutOfFlowLayoutPart(Node(), ConstraintSpace(), &container_builder_).Run();
 
-  // Adjust the position of the final baseline if needed.
-  container_builder_.SetLastBaselineToBlockEndMarginEdgeIfNeeded();
   if (ConstraintSpace().BaselineAlgorithmType() ==
       NGBaselineAlgorithmType::kInlineBlock) {
     container_builder_.SetUseLastBaselineForInlineBaseline();
@@ -1111,7 +1109,7 @@
   // from them.
   for (const auto& child : base::make_span(children).subspan(children_before)) {
     DCHECK(child.fragment->IsLineBox());
-    PropagateBaselineFromChild(*child.fragment, child.offset.block_offset);
+    PropagateBaselineFromLineBox(*child.fragment, child.offset.block_offset);
   }
 
   previous_inflow_position->logical_block_offset += result.used_block_size;
@@ -1479,7 +1477,8 @@
     container_builder_.SetDisableSimplifiedLayout();
   }
 
-  PropagateBaselineFromChild(physical_fragment, logical_offset.block_offset);
+  PropagateBaselineFromBlockChild(physical_fragment, child_data.margins,
+                                  logical_offset.block_offset);
   container_builder_.AddResult(*layout_result, logical_offset);
 
   // The margins we store will be used by e.g. getComputedStyle().
@@ -2055,7 +2054,13 @@
   // formatting context.
   DCHECK(child.IsInline() || !child.Style().AlignSelfBlockCenter());
 
-  PropagateBaselineFromChild(physical_fragment, logical_offset.block_offset);
+  if (physical_fragment.IsLineBox()) {
+    PropagateBaselineFromLineBox(physical_fragment,
+                                 logical_offset.block_offset);
+  } else {
+    PropagateBaselineFromBlockChild(physical_fragment, child_data->margins,
+                                    logical_offset.block_offset);
+  }
   container_builder_.AddResult(*layout_result, logical_offset);
 
   if (auto* block_child = DynamicTo<NGBlockNode>(child)) {
@@ -2772,52 +2777,50 @@
   return DeferredShapingMinimumTopScope(child, minimum_top);
 }
 
-void NGBlockLayoutAlgorithm::PropagateBaselineFromChild(
+void NGBlockLayoutAlgorithm::PropagateBaselineFromLineBox(
     const NGPhysicalFragment& child,
     LayoutUnit block_offset) {
-  if (child.IsLineBox()) {
-    const auto& line_box = To<NGPhysicalLineBoxFragment>(child);
+  const auto& line_box = To<NGPhysicalLineBoxFragment>(child);
 
-    // Skip over a line-box which is empty. These don't have any baselines
-    // which should be added.
-    if (line_box.IsEmptyLineBox())
-      return;
+  // Skip over a line-box which is empty. These don't have any baselines
+  // which should be added.
+  if (line_box.IsEmptyLineBox())
+    return;
 
-    if (UNLIKELY(line_box.IsBlockInInline())) {
-      // Block-in-inline may have different first/last baselines.
-      DCHECK(container_builder_.ItemsBuilder());
-      const NGLogicalLineItems& items =
-          container_builder_.ItemsBuilder()->LogicalLineItems(line_box);
-      const NGLayoutResult* result = items.BlockInInlineLayoutResult();
-      DCHECK(result);
-      PropagateBaselineFromBlockChild(result->PhysicalFragment(), block_offset);
-      return;
-    }
-
-    FontHeight metrics = line_box.BaselineMetrics();
-    DCHECK(!metrics.IsEmpty());
-    LayoutUnit baseline =
-        block_offset + (Style().IsFlippedLinesWritingMode() ? metrics.descent
-                                                            : metrics.ascent);
-
-    if (!container_builder_.FirstBaseline())
-      container_builder_.SetFirstBaseline(baseline);
-    container_builder_.SetLastBaseline(baseline);
+  if (UNLIKELY(line_box.IsBlockInInline())) {
+    // Block-in-inline may have different first/last baselines.
+    DCHECK(container_builder_.ItemsBuilder());
+    const NGLogicalLineItems& items =
+        container_builder_.ItemsBuilder()->LogicalLineItems(line_box);
+    const NGLayoutResult* result = items.BlockInInlineLayoutResult();
+    DCHECK(result);
+    PropagateBaselineFromBlockChild(result->PhysicalFragment(),
+                                    /* margins */ NGBoxStrut(), block_offset);
     return;
   }
 
-  PropagateBaselineFromBlockChild(child, block_offset);
+  FontHeight metrics = line_box.BaselineMetrics();
+  DCHECK(!metrics.IsEmpty());
+  LayoutUnit baseline =
+      block_offset +
+      (Style().IsFlippedLinesWritingMode() ? metrics.descent : metrics.ascent);
+
+  if (!container_builder_.FirstBaseline())
+    container_builder_.SetFirstBaseline(baseline);
+  container_builder_.SetLastBaseline(baseline);
 }
 
 void NGBlockLayoutAlgorithm::PropagateBaselineFromBlockChild(
     const NGPhysicalFragment& child,
+    const NGBoxStrut& margins,
     LayoutUnit block_offset) {
   DCHECK(child.IsBox());
+  const auto baseline_algorithm = ConstraintSpace().BaselineAlgorithmType();
 
   // When computing baselines for an inline-block, table's don't contribute any
   // baselines.
-  if (child.IsTableNG() && ConstraintSpace().BaselineAlgorithmType() ==
-                               NGBaselineAlgorithmType::kInlineBlock) {
+  if (child.IsTableNG() &&
+      baseline_algorithm == NGBaselineAlgorithmType::kInlineBlock) {
     return;
   }
 
@@ -2832,12 +2835,21 @@
 
   // Counter-intuitively, when computing baselines for an inline-block, some
   // fragments use their first-baseline for the container's last-baseline.
-  bool use_last_baseline = ConstraintSpace().BaselineAlgorithmType() ==
-                               NGBaselineAlgorithmType::kDefault ||
-                           physical_fragment.UseLastBaselineForInlineBaseline();
+  bool use_last_baseline =
+      baseline_algorithm == NGBaselineAlgorithmType::kDefault ||
+      physical_fragment.UseLastBaselineForInlineBaseline();
 
-  const auto last_baseline =
+  auto last_baseline =
       use_last_baseline ? fragment.LastBaseline() : fragment.FirstBaseline();
+
+  // When computing baselines for an inline-block, some block-boxes (e.g. with
+  // "overflow: hidden") will force the baseline to the block-end margin edge.
+  if (baseline_algorithm == NGBaselineAlgorithmType::kInlineBlock &&
+      physical_fragment.UseBlockEndMarginEdgeForInlineBaseline() &&
+      !child.ShouldApplyLayoutContainment() && fragment.IsWritingModeEqual()) {
+    last_baseline = fragment.BlockSize() + margins.block_end;
+  }
+
   if (last_baseline)
     container_builder_.SetLastBaseline(block_offset + *last_baseline);
 }
@@ -3118,11 +3130,6 @@
   }
   container_builder_.AddResult(*result,
                                LogicalOffset(LayoutUnit(), ruby_text_box_top));
-  // RubyText provides baseline if RubyBase didn't.
-  // This behavior doesn't make much sense, but it's compatible with the legacy
-  // layout.
-  if (!container_builder_.FirstBaseline())
-    PropagateBaselineFromChild(ruby_text_fragment, ruby_text_box_top);
 }
 
 void NGBlockLayoutAlgorithm::HandleTextControlPlaceholder(
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h
index febc577..c456c93e 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h
@@ -239,9 +239,10 @@
   void UpdateEarlyBreakBetweenLines();
 
   // Propagates the baseline from the given |child| if needed.
-  void PropagateBaselineFromChild(const NGPhysicalFragment& child,
-                                  LayoutUnit block_offset);
+  void PropagateBaselineFromLineBox(const NGPhysicalFragment& child,
+                                    LayoutUnit block_offset);
   void PropagateBaselineFromBlockChild(const NGPhysicalFragment& child,
+                                       const NGBoxStrut& margins,
                                        LayoutUnit block_offset);
 
   // If still unresolved, resolve the fragment's BFC block offset.
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm_test.cc
index a9229d5..3dc345b 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm_test.cc
@@ -2425,52 +2425,6 @@
   // EXPECT_EQ(PhysicalOffset(20, 10), fragment->Offset());
 }
 
-// This test checks if the inline block baseline is computed correctly when it
-// is from the logical bottom margin edge, even after the simplified layout.
-TEST_F(NGBlockLayoutAlgorithmTest,
-       BaselineAtBlockEndMarginEdgeAfterSimplifiedLayout) {
-  SetBodyInnerHTML(R"HTML(
-    <!DOCTYPE html>
-    <style>
-    #outer {
-      height: 200px;
-    }
-    #outer.after {
-      height: 400px;
-    }
-    #target {
-      display: inline-block;
-      overflow: hidden;
-      width: 300px;
-      height: 100%;
-    }
-    </style>
-    <div id="outer">
-        <div id="target">
-        </div>
-    </div>
-  )HTML");
-  UpdateAllLifecyclePhasesForTest();
-
-  // #target uses the logical bottom margin edge for the inline block baseline.
-  auto* target_block_flow =
-      To<LayoutBlockFlow>(GetLayoutObjectByElementId("target"));
-  NGBlockNode target(target_block_flow);
-  ASSERT_TRUE(target.UseBlockEndMarginEdgeForInlineBlockBaseline());
-  const NGPhysicalBoxFragment* before =
-      To<NGPhysicalBoxFragment>(target_block_flow->GetPhysicalFragment(0));
-  EXPECT_EQ(*before->LastBaseline(), LayoutUnit(200));
-
-  // Change the height of the container. This should kick the simplified layout.
-  Element* outer_element = GetElementById("outer");
-  outer_element->classList().Add("after");
-  UpdateAllLifecyclePhasesForTest();
-
-  const NGPhysicalBoxFragment* after =
-      To<NGPhysicalBoxFragment>(target_block_flow->GetPhysicalFragment(0));
-  EXPECT_EQ(*after->LastBaseline(), LayoutUnit(400));
-}
-
 TEST_F(NGBlockLayoutAlgorithmTest, LayoutRubyTextCrash) {
   // crbug.com/1102186. This test passes if no DCHECK failure.
   SetBodyInnerHTML(R"HTML(
diff --git a/third_party/blink/renderer/core/layout/ng/ng_box_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_box_fragment.cc
index 9102e52..bf93382 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_box_fragment.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_box_fragment.cc
@@ -18,9 +18,17 @@
   if (physical_fragment_.Style().IsCheckboxOrRadioPart())
     return FontHeight(margins.line_over + BlockSize(), margins.line_under);
 
-  const auto baseline = PhysicalBoxFragment().UseLastBaselineForInlineBaseline()
-                            ? LastBaseline()
-                            : FirstBaseline();
+  auto baseline = PhysicalBoxFragment().UseLastBaselineForInlineBaseline()
+                      ? LastBaseline()
+                      : FirstBaseline();
+
+  // Some blocks force the baseline to be the block-end margin edge.
+  if (PhysicalBoxFragment().UseBlockEndMarginEdgeForInlineBaseline()) {
+    baseline = BlockSize() + (writing_direction_.IsFlippedLines()
+                                  ? margins.line_over
+                                  : margins.line_under);
+  }
+
   if (baseline) {
     FontHeight metrics = writing_direction_.IsFlippedLines()
                              ? FontHeight(BlockSize() - *baseline, *baseline)
diff --git a/third_party/blink/renderer/core/layout/ng/ng_box_fragment.h b/third_party/blink/renderer/core/layout/ng/ng_box_fragment.h
index da33e899..57f03fa 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_box_fragment.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_box_fragment.h
@@ -24,12 +24,14 @@
     return To<NGPhysicalBoxFragment>(physical_fragment_);
   }
 
-  absl::optional<LayoutUnit> FirstBaseline() const {
-    if (writing_direction_.GetWritingMode() !=
-        physical_fragment_.Style().GetWritingMode())
-      return absl::nullopt;
+  bool IsWritingModeEqual() const {
+    return writing_direction_.GetWritingMode() ==
+           physical_fragment_.Style().GetWritingMode();
+  }
 
-    return PhysicalBoxFragment().FirstBaseline();
+  absl::optional<LayoutUnit> FirstBaseline() const {
+    return IsWritingModeEqual() ? PhysicalBoxFragment().FirstBaseline()
+                                : absl::nullopt;
   }
 
   LayoutUnit FirstBaselineOrSynthesize(FontBaseline baseline_type) const {
@@ -43,11 +45,8 @@
   }
 
   absl::optional<LayoutUnit> LastBaseline() const {
-    if (writing_direction_.GetWritingMode() !=
-        physical_fragment_.Style().GetWritingMode())
-      return absl::nullopt;
-
-    return PhysicalBoxFragment().LastBaseline();
+    return IsWritingModeEqual() ? PhysicalBoxFragment().LastBaseline()
+                                : absl::nullopt;
   }
 
   LayoutUnit LastBaselineOrSynthesize(FontBaseline baseline_type) const {
diff --git a/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.cc b/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.cc
index 63a930d..489b5da 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.cc
@@ -607,20 +607,6 @@
   return LogicalOffset();
 }
 
-void NGBoxFragmentBuilder::SetLastBaselineToBlockEndMarginEdgeIfNeeded() {
-  if (ConstraintSpace().BaselineAlgorithmType() !=
-      NGBaselineAlgorithmType::kInlineBlock)
-    return;
-
-  if (!node_.UseBlockEndMarginEdgeForInlineBlockBaseline())
-    return;
-
-  // When overflow is present (within an atomic-inline baseline context) we
-  // should always use the block-end margin edge as the baseline.
-  NGBoxStrut margins = ComputeMarginsForSelf(ConstraintSpace(), Style());
-  SetLastBaseline(FragmentBlockSize() + margins.block_end);
-}
-
 void NGBoxFragmentBuilder::AdjustFragmentainerDescendant(
     NGLogicalOOFNodeForFragmentation& descendant,
     bool only_fixedpos_containing_block) {
diff --git a/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.h
index bd6c866..d6d9eeb 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.h
@@ -592,10 +592,6 @@
     use_last_baseline_for_inline_baseline_ = true;
   }
 
-  // The inline block baseline is at the block end margin edge under some
-  // circumstances. This function updates |LastBaseline| in such cases.
-  void SetLastBaselineToBlockEndMarginEdgeIfNeeded();
-
   void SetTableGridRect(const LogicalRect& table_grid_rect) {
     table_grid_rect_ = table_grid_rect;
   }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h b/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h
index a3c68dcd..febeddb 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h
@@ -262,14 +262,6 @@
     return axes;
   }
 
-  // CSS defines certain cases to synthesize inline block baselines from box.
-  // See comments in UseLogicalBottomMarginEdgeForInlineBlockBaseline().
-  bool UseBlockEndMarginEdgeForInlineBlockBaseline() const {
-    if (auto* layout_box = DynamicTo<LayoutBlock>(GetLayoutBox()))
-      return layout_box->UseLogicalBottomMarginEdgeForInlineBlockBaseline();
-    return false;
-  }
-
   // CSS intrinsic sizing getters.
   // https://drafts.csswg.org/css-sizing-4/#intrinsic-size-override
   // Note that this returns kIndefiniteSize if the override was not specified.
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc
index 5734141..32b4bd22 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc
@@ -1748,13 +1748,7 @@
   // Legacy layout can (incorrectly) shift baseline position(s) during
   // "simplified" layout.
   DCHECK(IsLegacyLayoutRoot() || FirstBaseline() == other.FirstBaseline());
-  if (check_same_block_size) {
-    DCHECK(IsLegacyLayoutRoot() || LastBaseline() == other.LastBaseline());
-  } else {
-    DCHECK(IsLegacyLayoutRoot() || LastBaseline() == other.LastBaseline() ||
-           NGBlockNode(To<LayoutBox>(GetMutableLayoutObject()))
-               .UseBlockEndMarginEdgeForInlineBlockBaseline());
-  }
+  DCHECK(IsLegacyLayoutRoot() || LastBaseline() == other.LastBaseline());
 
   if (IsTableNG()) {
     DCHECK_EQ(TableGridRect(), other.TableGridRect());
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h
index 1c63cdf..4920630 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h
@@ -155,6 +155,14 @@
     return use_last_baseline_for_inline_baseline_;
   }
 
+  bool UseBlockEndMarginEdgeForInlineBaseline() const {
+    if (!use_last_baseline_for_inline_baseline_)
+      return false;
+    if (const auto* layout_block = DynamicTo<LayoutBlock>(GetLayoutObject()))
+      return layout_block->UseLogicalBottomMarginEdgeForInlineBlockBaseline();
+    return false;
+  }
+
   LogicalRect TableGridRect() const {
     return ComputeRareDataAddress()->table_grid_rect;
   }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.cc
index 8ab3179..3627944e 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.cc
@@ -312,13 +312,6 @@
 
   NGOutOfFlowLayoutPart(Node(), ConstraintSpace(), &container_builder_).Run();
 
-  // The block size may have been changed. This may affect the inline block
-  // baseline if it is from the logical bottom margin edge.
-  DCHECK_EQ(previous_fragment.LastBaseline().has_value(),
-            container_builder_.LastBaseline().has_value());
-  if (Node().IsBlockFlow() && container_builder_.LastBaseline())
-    container_builder_.SetLastBaselineToBlockEndMarginEdgeIfNeeded();
-
   return container_builder_.ToBoxFragment();
 }
 
diff --git a/third_party/blink/renderer/core/script/script_loader.cc b/third_party/blink/renderer/core/script/script_loader.cc
index cd1fdb4..919a9aa 100644
--- a/third_party/blink/renderer/core/script/script_loader.cc
+++ b/third_party/blink/renderer/core/script/script_loader.cc
@@ -564,13 +564,6 @@
       break;
 
     case ScriptTypeAtPrepare::kWebBundle:
-      if (!RuntimeEnabledFeatures::SubresourceWebBundlesEnabled(
-              element_document.GetExecutionContext())) {
-        script_type_ = ScriptTypeAtPrepare::kInvalid;
-        return nullptr;
-      }
-      break;
-
     case ScriptTypeAtPrepare::kClassic:
     case ScriptTypeAtPrepare::kModule:
     case ScriptTypeAtPrepare::kImportMap:
@@ -975,8 +968,6 @@
         return nullptr;
       }
       case ScriptTypeAtPrepare::kWebBundle: {
-        DCHECK(RuntimeEnabledFeatures::SubresourceWebBundlesEnabled(
-            context_window));
         DCHECK(!script_web_bundle_);
 
         absl::variant<ScriptWebBundle*, ScriptWebBundleError>
diff --git a/third_party/blink/renderer/core/svg/svg_svg_element.cc b/third_party/blink/renderer/core/svg/svg_svg_element.cc
index c8860d6..e4ee1df6 100644
--- a/third_party/blink/renderer/core/svg/svg_svg_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_svg_element.cc
@@ -518,7 +518,6 @@
 
 LayoutObject* SVGSVGElement::CreateLayoutObject(const ComputedStyle&,
                                                 LegacyLayout) {
-  UseCounter::Count(GetDocument(), WebFeature::kLegacyLayoutBySVG);
   if (IsOutermostSVGSVGElement())
     return MakeGarbageCollected<LayoutSVGRoot>(this);
 
diff --git a/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc b/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc
index 45ebe5b..7996d422c0 100644
--- a/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc
+++ b/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc
@@ -36,15 +36,6 @@
   window->AddConsoleMessage(console_message);
 }
 
-void LogToConsole(ScriptState* script_state,
-                  mojom::blink::ConsoleMessageLevel level,
-                  const String& message) {
-  DCHECK(script_state);
-  ScriptState::Scope scope(script_state);
-  LocalFrame* frame = ToLocalFrameIfNotDetached(script_state->GetContext());
-  LogToConsole(frame, level, message);
-}
-
 }  // namespace
 
 // static
@@ -136,17 +127,11 @@
                                             const String& url) {
   if (!SetFlagIfDescendantAndCheck(script_state, FlagType::kURLChange, url)) {
     ResetHeuristic();
-  } else {
-    LogToConsole(script_state, mojom::blink::ConsoleMessageLevel::kVerbose,
-                 String("URL change."));
   }
 }
 
-void SoftNavigationHeuristics::ModifiedMain(ScriptState* script_state) {
-  if (SetFlagIfDescendantAndCheck(script_state, FlagType::kMainModification)) {
-    LogToConsole(script_state, mojom::blink::ConsoleMessageLevel::kVerbose,
-                 String("Modified main element."));
-  }
+void SoftNavigationHeuristics::ModifiedDOM(ScriptState* script_state) {
+  SetFlagIfDescendantAndCheck(script_state, FlagType::kMainModification);
   SetIsTrackingSoftNavigationHeuristicsOnDocument(false);
 }
 
diff --git a/third_party/blink/renderer/core/timing/soft_navigation_heuristics.h b/third_party/blink/renderer/core/timing/soft_navigation_heuristics.h
index 68b0e95f0..53bab34 100644
--- a/third_party/blink/renderer/core/timing/soft_navigation_heuristics.h
+++ b/third_party/blink/renderer/core/timing/soft_navigation_heuristics.h
@@ -37,7 +37,7 @@
   void UserInitiatedClick(ScriptState*);
   void ClickEventEnded(ScriptState*);
   void SawURLChange(ScriptState*, const String& url);
-  void ModifiedMain(ScriptState*);
+  void ModifiedDOM(ScriptState*);
   uint32_t SoftNavigationCount() { return soft_navigation_count_; }
 
   // TaskAttributionTracker::Observer's implementation.
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index f6d1d95..51cd444 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -2486,11 +2486,6 @@
       name: "StylusHandwriting",
     },
     {
-      name: "SubresourceWebBundles",
-      public: true,
-      status: "experimental"
-    },
-    {
       name: "SupportsFontFormatTech",
       status: "experimental"
     },
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
index d632987..b9f3fc8 100644
--- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
+++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -116,6 +116,7 @@
 
 ### external/wpt/css/CSS2/floats/
 crbug.com/591099 external/wpt/css/CSS2/floats/float-nowrap-3.html [ Failure ]
+crbug.com/1323571 external/wpt/css/CSS2/floats/float-root.html [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/floats/floats-line-wrap-shifted-001.html [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-003.tentative.html [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-004.html [ Failure ]
@@ -1115,6 +1116,14 @@
 crbug.com/591099 external/wpt/css/css-writing-modes/available-size-017.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/baseline-with-orthogonal-flow-001.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/block-flow-direction-vrl-009.xht [ Failure ]
+crbug.com/492664 external/wpt/css/css-writing-modes/clip-rect-vlr-003.xht [ Failure ]
+crbug.com/492664 external/wpt/css/css-writing-modes/clip-rect-vlr-005.xht [ Failure ]
+crbug.com/492664 external/wpt/css/css-writing-modes/clip-rect-vlr-007.xht [ Failure ]
+crbug.com/492664 external/wpt/css/css-writing-modes/clip-rect-vlr-009.xht [ Failure ]
+crbug.com/492664 external/wpt/css/css-writing-modes/clip-rect-vrl-002.xht [ Failure ]
+crbug.com/492664 external/wpt/css/css-writing-modes/clip-rect-vrl-004.xht [ Failure ]
+crbug.com/492664 external/wpt/css/css-writing-modes/clip-rect-vrl-006.xht [ Failure ]
+crbug.com/492664 external/wpt/css/css-writing-modes/clip-rect-vrl-008.xht [ Failure ]
 crbug.com/492664 external/wpt/css/css-writing-modes/inline-block-alignment-003.xht [ Failure ]
 crbug.com/492664 external/wpt/css/css-writing-modes/inline-block-alignment-005.xht [ Failure ]
 crbug.com/492664 external/wpt/css/css-writing-modes/inline-block-alignment-007.xht [ Failure ]
@@ -1122,6 +1131,7 @@
 crbug.com/591099 external/wpt/css/css-writing-modes/line-box-direction-vrl-009.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/line-box-height-vlr-021.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/line-box-height-vlr-023.xht [ Failure ]
+crbug.com/464569 external/wpt/css/css-writing-modes/margin-collapse-vrl-022.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/ortho-htb-alongside-vrl-floats-006.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/ortho-htb-alongside-vrl-floats-014.xht [ Failure ]
 crbug.com/1281318 external/wpt/css/css-writing-modes/padding-percent-orthogonal-dynamic.html [ Failure ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 403eaeb..b4ae89a 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -2273,16 +2273,6 @@
 
 # These tests pass but images do not match because of wrong half-leading in vertical-lr
 
-# These tests pass but images do not match because of position: absolute in vertical flow bug
-crbug.com/492664 external/wpt/css/css-writing-modes/clip-rect-vlr-003.xht [ Failure ]
-crbug.com/492664 external/wpt/css/css-writing-modes/clip-rect-vlr-005.xht [ Failure ]
-crbug.com/492664 external/wpt/css/css-writing-modes/clip-rect-vlr-007.xht [ Failure ]
-crbug.com/492664 external/wpt/css/css-writing-modes/clip-rect-vlr-009.xht [ Failure ]
-crbug.com/492664 external/wpt/css/css-writing-modes/clip-rect-vrl-002.xht [ Failure ]
-crbug.com/492664 external/wpt/css/css-writing-modes/clip-rect-vrl-004.xht [ Failure ]
-crbug.com/492664 external/wpt/css/css-writing-modes/clip-rect-vrl-006.xht [ Failure ]
-crbug.com/492664 external/wpt/css/css-writing-modes/clip-rect-vrl-008.xht [ Failure ]
-
 # These tests pass but images do not match because tests are stricter than the spec.
 crbug.com/492664 external/wpt/css/css-writing-modes/text-combine-upright-value-all-001.html [ Failure ]
 crbug.com/492664 external/wpt/css/css-writing-modes/text-combine-upright-value-all-002.html [ Failure ]
@@ -2290,12 +2280,6 @@
 
 # We're experimenting with changing the behavior of the 'nonce' attribute
 
-# These CSS Writing Modes Level 3 tests pass but causes 1px diff on images, notified to the submitter.
-crbug.com/492664 [ Mac ] external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vlr-008.xht [ Failure ]
-crbug.com/492664 [ Mac ] external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vlr-020.xht [ Failure ]
-crbug.com/492664 [ Mac ] external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vrl-008.xht [ Failure ]
-crbug.com/492664 [ Mac ] external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vrl-020.xht [ Failure ]
-
 crbug.com/381684 [ Mac ] fonts/family-fallback-gardiner.html [ Skip ]
 crbug.com/381684 [ Win ] fonts/family-fallback-gardiner.html [ Skip ]
 
@@ -3318,6 +3302,26 @@
 crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=forwarddelete&left-white-space=pre-wrap&right-white-space=nowrap [ Failure ]
 crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=forwarddelete&left-white-space=pre-wrap&right-white-space=pre [ Failure ]
 crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=forwarddelete&left-white-space=pre-wrap&right-white-space=pre-line [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=normal&right-white-space=nowrap [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=normal&right-white-space=pre [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=normal&right-white-space=pre-line [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=normal&right-white-space=pre-wrap [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=nowrap&right-white-space=normal [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=nowrap&right-white-space=pre [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=nowrap&right-white-space=pre-line [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=nowrap&right-white-space=pre-wrap [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=pre&right-white-space=normal [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=pre&right-white-space=nowrap [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=pre&right-white-space=pre-line [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=pre&right-white-space=pre-wrap [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=pre-line&right-white-space=normal [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=pre-line&right-white-space=nowrap [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=pre-line&right-white-space=pre [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=pre-line&right-white-space=pre-wrap [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=pre-wrap&right-white-space=normal [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=pre-wrap&right-white-space=nowrap [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=pre-wrap&right-white-space=pre [ Failure ]
+crbug.com/626703 external/wpt/editing/other/join-different-white-space-style-left-paragraph-and-right-line.html?method=select-boundary&left-white-space=pre-wrap&right-white-space=pre-line [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
 crbug.com/626703 [ Linux ] external/wpt/encoding/unsupported-labels.window.html [ Failure Timeout ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 425d81b..0cc2f4f1 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -134,6 +134,10 @@
     "platforms": ["Linux", "Mac", "Win", "Fuchsia"],
     "bases": ["fast/css3-text/css3-text-decoration/stable",
               "fast/dom/Window",
+              "external/wpt/css/css-color/parsing/",
+              "external/wpt/css/css-transitions/parsing/",
+              "external/wpt/css/css-animations/parsing/",
+              "external/wpt/css/css-images/parsing/",
               "http/tests/navigation",
               "http/tests/sendbeacon",
               "http/tests/serviceworker/webexposed",
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/float-root-ref.html b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/float-root-ref.html
new file mode 100644
index 0000000..1f593f46
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/float-root-ref.html
@@ -0,0 +1,11 @@
+<!DOCTYPe html>
+<style>
+body {
+  float: right;
+  margin-top: 0;
+}
+</style>
+
+<body>
+<p>foo</p>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/float-root.html b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/float-root.html
new file mode 100644
index 0000000..ee7f70e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/float-root.html
@@ -0,0 +1,13 @@
+<!DOCTYPe html>
+<link rel="help" href="https://w3c.github.io/csswg-drafts/css2/#propdef-float">
+<link rel="match" href="float-root-ref.html">
+
+<style>
+:root {
+  float: right;
+}
+</style>
+
+<body>
+<p>foo</p>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/margin-collapse-vlr-023.xht b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/margin-collapse-vlr-023.xht
index d72e475a..e655202e 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/margin-collapse-vlr-023.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/margin-collapse-vlr-023.xht
@@ -24,23 +24,11 @@
   The margin collapsing rules apply exactly with the block-start margin substituted for the top margin and the block-end margin substituted for the bottom margin.
   "
   -->
+  <link rel="match" href="reference/margin-collapse-022-023-1.xht" />
+  <link rel="match" href="reference/margin-collapse-022-023-2.xht" />
 
   <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
   <style type="text/css"><![CDATA[
-  body
-    {
-      margin-left: 66px;
-      /*
-      The sole purpose of this rule is to increase noticeability
-      of test failure in Google Chrome 40+
-      */
-    }
-
-  p
-    {
-      font: 16px/1.25 serif; /* computes to 16px/20px */
-    }
-
   div#test
     {
       border: teal solid 1em;
@@ -67,39 +55,15 @@
     {
       background-color: blue;
       position: absolute;
-      top: 97px;
-      /*
-      16px : p's margin-top
-    +
-      20px : p's top-most line box height
-    +
-      20px : p's bottom-most line box height
-    +
-      16px : p's margin-bottom
-    +
-      25px : div#test's border-top
-   ==========
-      97px
-      */
+      top: 33px;  /* body's margin + div#test's border-top */
       width: 1em;
     }
-
-  div.ref
-    {
-      border: teal solid 1em;
-      font: 25px/1 Ahem;
-      height: 4em; /* computes to 100px */
-      margin-bottom: 0.2em;
-      width: 4em;
-    }
   ]]></style>
 
  </head>
 
  <body>
 
-  <p>Test passes if the top square has a layout<br />identical to one of the squares below it.</p>
-
   <div id="test">
     <div id="wrapper">
       <div id="widthless-static"></div>
@@ -107,9 +71,5 @@
     </div>
   </div>
 
-  <div class="ref" id="ref1"><img src="support/swatch-blue.png" width="25" height="100" alt="Image download support must be enabled" /><img src="support/swatch-orange.png" width="25" height="100" alt="Image download support must be enabled" /><img src="support/swatch-orange.png" width="25" height="100" alt="Image download support must be enabled" /><img src="support/swatch-blue.png" width="25" height="100" alt="Image download support must be enabled" /></div>
-
-  <div class="ref" id="ref2"><img src="support/swatch-blue.png" width="25" height="100" alt="Image download support must be enabled" /><img src="support/swatch-orange.png" width="25" height="100" alt="Image download support must be enabled" /><img src="support/swatch-blue.png" width="25" height="100" alt="Image download support must be enabled" /><img src="support/swatch-orange.png" width="25" height="100" alt="Image download support must be enabled" /></div>
-
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/margin-collapse-vrl-022.xht b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/margin-collapse-vrl-022.xht
index 05cce8b..a83835e3 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/margin-collapse-vrl-022.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/margin-collapse-vrl-022.xht
@@ -24,14 +24,11 @@
   The margin collapsing rules apply exactly with the block-start margin substituted for the top margin and the block-end margin substituted for the bottom margin.
   "
   -->
+  <link rel="match" href="reference/margin-collapse-022-023-1.xht" />
+  <link rel="match" href="reference/margin-collapse-022-023-2.xht" />
 
   <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
   <style type="text/css"><![CDATA[
-  p
-    {
-      font: 16px/1.25 serif; /* computes to 16px/20px */
-    }
-
   div#test
     {
       border: teal solid 1em;
@@ -58,35 +55,15 @@
     {
       background-color: blue;
       position: absolute;
-      top: 77px;
-      /*
-      16px : p's margin-top
-    + 20px : p's line box height
-    + 16px : p's margin-bottom
-    + 25px : div#test's border-top
-   ==========
-      77px
-      */
+      top: 33px; /* body's margin + div#test's border-top */
       width: 1em;
     }
-
-
-  div.ref
-    {
-      border: teal solid 1em;
-      font: 25px/1 Ahem;
-      height: 4em; /* computes to 100px */
-      margin-bottom: 0.2em;
-      width: 4em; /* and not 100px + 8px for #ref1 */
-    }
   ]]></style>
 
  </head>
 
  <body>
 
-  <p>Test passes if the top square has a layout identical to one of the squares below it.</p>
-
   <div id="test">
     <div id="wrapper">
       <div id="widthless-static"></div>
@@ -94,10 +71,5 @@
     </div>
   </div>
 
-
-  <div class="ref" id="ref1"><img src="support/swatch-blue.png" width="25" height="100" alt="Image download support must be enabled" /><img src="support/swatch-orange.png" width="25" height="100" alt="Image download support must be enabled" /><img src="support/swatch-orange.png" width="25" height="100" alt="Image download support must be enabled" /><!-- width is intentionally not 33 --><img src="support/swatch-blue.png" width="25" height="100" alt="Image download support must be enabled" /></div>
-
-  <div class="ref" id="ref2"><img src="support/swatch-orange.png" width="25" height="100" alt="Image download support must be enabled" /><img src="support/swatch-blue.png" width="25" height="100" alt="Image download support must be enabled" /><img src="support/swatch-orange.png" width="25" height="100" alt="Image download support must be enabled" /><img src="support/swatch-blue.png" width="25" height="100" alt="Image download support must be enabled" /></div>
-
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/reference/margin-collapse-022-023-1.xht b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/reference/margin-collapse-022-023-1.xht
new file mode 100644
index 0000000..f54f327
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/reference/margin-collapse-022-023-1.xht
@@ -0,0 +1,21 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+  <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+  <style type="text/css"><![CDATA[
+  div.ref
+    {
+      border: teal solid 1em;
+      font: 25px/1 Ahem;
+      height: 4em; /* computes to 100px */
+      margin-bottom: 0.2em;
+      width: 4em;
+    }
+  ]]></style>
+
+ </head>
+
+ <body>
+  <div class="ref" id="ref1"><img src="../support/swatch-blue.png" width="25" height="100" alt="Image download support must be enabled" /><img src="../support/swatch-orange.png" width="25" height="100" alt="Image download support must be enabled" /><img src="../support/swatch-orange.png" width="25" height="100" alt="Image download support must be enabled" /><img src="../support/swatch-blue.png" width="25" height="100" alt="Image download support must be enabled" /></div>
+ </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/reference/margin-collapse-022-023-2.xht b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/reference/margin-collapse-022-023-2.xht
new file mode 100644
index 0000000..dab33c3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/reference/margin-collapse-022-023-2.xht
@@ -0,0 +1,21 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+  <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+  <style type="text/css"><![CDATA[
+  div.ref
+    {
+      border: teal solid 1em;
+      font: 25px/1 Ahem;
+      height: 4em; /* computes to 100px */
+      margin-bottom: 0.2em;
+      width: 4em;
+    }
+  ]]></style>
+
+ </head>
+
+ <body>
+  <div class="ref" id="ref2"><img src="../support/swatch-orange.png" width="25" height="100" alt="Image download support must be enabled" /><img src="../support/swatch-blue.png" width="25" height="100" alt="Image download support must be enabled" /><img src="../support/swatch-orange.png" width="25" height="100" alt="Image download support must be enabled" /><img src="../support/swatch-blue.png" width="25" height="100" alt="Image download support must be enabled" /></div>
+ </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/soft-navigation-detection-non-main.tentative.html b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/soft-navigation-detection-non-main.tentative.html
new file mode 100644
index 0000000..ccf436b6
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/soft-navigation-detection-non-main.tentative.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Detect simple soft navigation.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="resources/soft-navigation-helper.js"></script>
+</head>
+<body>
+  <a id=link>Click me!</a>
+  <script>
+    const link = document.getElementById("link");
+    test_soft_navigation(async json => {
+      // Add the content to the main element
+      const img = new Image();
+      img.src = json["image"];
+      await new Promise(resolve => {
+        img.onload = resolve;
+      });
+      document.body.appendChild(img);
+    }, link, /*push_state=*/true,
+       /*clicks=*/1, ()=>{},
+       "Test that a soft navigation is detected on a non-main element");
+  </script>
+</body>
+</html>
+
diff --git a/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-animations/parsing/animation-shorthand-expected.txt b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-animations/parsing/animation-shorthand-expected.txt
new file mode 100644
index 0000000..90c1d9dad
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-animations/parsing/animation-shorthand-expected.txt
@@ -0,0 +1,33 @@
+This is a testharness.js-based test.
+PASS e.style['animation'] = "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-delay
+PASS e.style['animation'] = "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-direction
+PASS e.style['animation'] = "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-duration
+PASS e.style['animation'] = "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-fill-mode
+PASS e.style['animation'] = "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-iteration-count
+PASS e.style['animation'] = "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-name
+PASS e.style['animation'] = "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-play-state
+FAIL e.style['animation'] = "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-timeline assert_equals: animation-timeline should be canonical expected (string) "auto" but got (undefined) undefined
+PASS e.style['animation'] = "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-timing-function
+PASS e.style['animation'] = "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)" should not set unrelated longhands
+PASS e.style['animation'] = "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-delay
+PASS e.style['animation'] = "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-direction
+PASS e.style['animation'] = "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-duration
+PASS e.style['animation'] = "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-fill-mode
+PASS e.style['animation'] = "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-iteration-count
+PASS e.style['animation'] = "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-name
+PASS e.style['animation'] = "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-play-state
+FAIL e.style['animation'] = "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-timeline assert_equals: animation-timeline should be canonical expected (string) "auto, auto" but got (undefined) undefined
+PASS e.style['animation'] = "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-timing-function
+PASS e.style['animation'] = "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)" should not set unrelated longhands
+PASS e.style['animation'] = "4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse" should set animation-delay
+PASS e.style['animation'] = "4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse" should set animation-direction
+PASS e.style['animation'] = "4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse" should set animation-duration
+PASS e.style['animation'] = "4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse" should set animation-fill-mode
+PASS e.style['animation'] = "4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse" should set animation-iteration-count
+PASS e.style['animation'] = "4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse" should set animation-name
+PASS e.style['animation'] = "4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse" should set animation-play-state
+FAIL e.style['animation'] = "4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse" should set animation-timeline assert_equals: animation-timeline should be canonical expected (string) "auto, auto" but got (undefined) undefined
+PASS e.style['animation'] = "4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse" should set animation-timing-function
+PASS e.style['animation'] = "4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse" should not set unrelated longhands
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-computed-expected.txt b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-computed-expected.txt
new file mode 100644
index 0000000..6910908c
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-computed-expected.txt
@@ -0,0 +1,444 @@
+This is a testharness.js-based test.
+Found 440 tests; 72 PASS, 368 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS Property color value 'currentcolor'
+PASS Property color value 'transparent'
+PASS Property color value 'red'
+PASS Property color value 'magenta'
+PASS Property color value '#234'
+PASS Property color value '#FEDCBA'
+PASS Property color value 'rgb(2, 3, 4)'
+PASS Property color value 'rgb(100%, 0%, 0%)'
+PASS Property color value 'rgba(2, 3, 4, 0.5)'
+PASS Property color value 'rgba(2, 3, 4, 50%)'
+PASS Property color value 'hsl(120, 100%, 50%)'
+PASS Property color value 'hsla(120, 100%, 50%, 0.25)'
+PASS Property color value 'rgb(-2, 3, 4)'
+PASS Property color value 'rgb(100, 200, 300)'
+PASS Property color value 'rgb(20, 10, 0, -10)'
+PASS Property color value 'rgb(100%, 200%, 300%)'
+PASS Property color value 'rgb(none none none)'
+PASS Property color value 'rgb(none none none / none)'
+PASS Property color value 'rgb(128 none none)'
+PASS Property color value 'rgb(128 none none / none)'
+PASS Property color value 'rgb(none none none / .5)'
+PASS Property color value 'rgb(20% none none)'
+PASS Property color value 'rgb(20% none none / none)'
+PASS Property color value 'rgb(none none none / 50%)'
+PASS Property color value 'rgba(none none none)'
+PASS Property color value 'rgba(none none none / none)'
+PASS Property color value 'rgba(128 none none)'
+PASS Property color value 'rgba(128 none none / none)'
+PASS Property color value 'rgba(none none none / .5)'
+PASS Property color value 'rgba(20% none none)'
+PASS Property color value 'rgba(20% none none / none)'
+PASS Property color value 'rgba(none none none / 50%)'
+PASS Property color value 'hsl(120 30% 50%)'
+PASS Property color value 'hsl(120 30% 50% / 0.5)'
+PASS Property color value 'hsl(120 30% 50% / 50%)'
+PASS Property color value 'hsl(none none none)'
+PASS Property color value 'hsl(0 0% 0%)'
+PASS Property color value 'hsl(none none none / none)'
+PASS Property color value 'hsl(0 0% 0% / 0)'
+PASS Property color value 'hsla(none none none)'
+PASS Property color value 'hsla(0 0% 0%)'
+PASS Property color value 'hsla(none none none / none)'
+PASS Property color value 'hsla(0 0% 0% / 0)'
+PASS Property color value 'hsl(120 none none)'
+PASS Property color value 'hsl(120 0% 0%)'
+PASS Property color value 'hsl(120 80% none)'
+PASS Property color value 'hsl(120 80% 0%)'
+PASS Property color value 'hsl(120 none 50%)'
+PASS Property color value 'hsl(120 0% 50%)'
+PASS Property color value 'hsl(120 100% 50% / none)'
+PASS Property color value 'hsl(120 100% 50% / 0)'
+PASS Property color value 'hsl(120 100% 50% / 0%)'
+PASS Property color value 'hsl(none 100% 50%)'
+PASS Property color value 'hsl(0 100% 50%)'
+PASS Property color value 'hwb(120 30% 50%)'
+PASS Property color value 'hwb(120 30% 50% / 0.5)'
+PASS Property color value 'hwb(120 30% 50% / 50%)'
+PASS Property color value 'hwb(none none none)'
+PASS Property color value 'hwb(0 0% 0%)'
+PASS Property color value 'hwb(none none none / none)'
+PASS Property color value 'hwb(0 0% 0% / 0)'
+PASS Property color value 'hwb(120 none none)'
+PASS Property color value 'hwb(120 0% 0%)'
+PASS Property color value 'hwb(120 80% none)'
+PASS Property color value 'hwb(120 80% 0%)'
+PASS Property color value 'hwb(120 none 50%)'
+PASS Property color value 'hwb(120 0% 50%)'
+PASS Property color value 'hwb(120 30% 50% / none)'
+PASS Property color value 'hwb(120 30% 50% / 0)'
+PASS Property color value 'hwb(120 30% 50% / 0%)'
+PASS Property color value 'hwb(none 100% 50% / none)'
+PASS Property color value 'hwb(0 100% 50% / 0)'
+FAIL Property color value 'color(srgb 0% 0% 0%)' assert_true: 'color(srgb 0% 0% 0%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 10% 10% 10%)' assert_true: 'color(srgb 10% 10% 10%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb .2 .2 25%)' assert_true: 'color(srgb .2 .2 25%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 0 0 0 / 1)' assert_true: 'color(srgb 0 0 0 / 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 0% 0 0 / 0.5)' assert_true: 'color(srgb 0% 0 0 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 20% 0 10/0.5)' assert_true: 'color(srgb 20% 0 10/0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 20% 0 10/50%)' assert_true: 'color(srgb 20% 0 10/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 400% 0 10/50%)' assert_true: 'color(srgb 400% 0 10/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 50% -160 160)' assert_true: 'color(srgb 50% -160 160)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 50% -200 200)' assert_true: 'color(srgb 50% -200 200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 0 0 0 / -10%)' assert_true: 'color(srgb 0 0 0 / -10%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 0 0 0 / 110%)' assert_true: 'color(srgb 0 0 0 / 110%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 0 0 0 / 300%)' assert_true: 'color(srgb 0 0 0 / 300%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 50% -200)' assert_true: 'color(srgb 50% -200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 50%)' assert_true: 'color(srgb 50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb)' assert_true: 'color(srgb)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 50% -200 / 0.5)' assert_true: 'color(srgb 50% -200 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 50% / 0.5)' assert_true: 'color(srgb 50% / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb / 0.5)' assert_true: 'color(srgb / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 200 200 200)' assert_true: 'color(srgb 200 200 200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 200 200 200 / 200)' assert_true: 'color(srgb 200 200 200 / 200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb -200 -200 -200)' assert_true: 'color(srgb -200 -200 -200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb -200 -200 -200 / -200)' assert_true: 'color(srgb -200 -200 -200 / -200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 200% 200% 200%)' assert_true: 'color(srgb 200% 200% 200%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 200% 200% 200% / 200%)' assert_true: 'color(srgb 200% 200% 200% / 200%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb -200% -200% -200% / -200%)' assert_true: 'color(srgb -200% -200% -200% / -200%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' assert_true: 'color(srgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' assert_true: 'color(srgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb none none none / none)' assert_true: 'color(srgb none none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb none none none)' assert_true: 'color(srgb none none none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 10% none none / none)' assert_true: 'color(srgb 10% none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb none none none / 0.5)' assert_true: 'color(srgb none none none / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb 0 0 0 / none)' assert_true: 'color(srgb 0 0 0 / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 0% 0% 0%)' assert_true: 'color(srgb-linear 0% 0% 0%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 10% 10% 10%)' assert_true: 'color(srgb-linear 10% 10% 10%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear .2 .2 25%)' assert_true: 'color(srgb-linear .2 .2 25%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 0 0 0 / 1)' assert_true: 'color(srgb-linear 0 0 0 / 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 0% 0 0 / 0.5)' assert_true: 'color(srgb-linear 0% 0 0 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 20% 0 10/0.5)' assert_true: 'color(srgb-linear 20% 0 10/0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 20% 0 10/50%)' assert_true: 'color(srgb-linear 20% 0 10/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 400% 0 10/50%)' assert_true: 'color(srgb-linear 400% 0 10/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 50% -160 160)' assert_true: 'color(srgb-linear 50% -160 160)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 50% -200 200)' assert_true: 'color(srgb-linear 50% -200 200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 0 0 0 / -10%)' assert_true: 'color(srgb-linear 0 0 0 / -10%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 0 0 0 / 110%)' assert_true: 'color(srgb-linear 0 0 0 / 110%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 0 0 0 / 300%)' assert_true: 'color(srgb-linear 0 0 0 / 300%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 50% -200)' assert_true: 'color(srgb-linear 50% -200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 50%)' assert_true: 'color(srgb-linear 50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear)' assert_true: 'color(srgb-linear)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 50% -200 / 0.5)' assert_true: 'color(srgb-linear 50% -200 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 50% / 0.5)' assert_true: 'color(srgb-linear 50% / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear / 0.5)' assert_true: 'color(srgb-linear / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 200 200 200)' assert_true: 'color(srgb-linear 200 200 200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 200 200 200 / 200)' assert_true: 'color(srgb-linear 200 200 200 / 200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear -200 -200 -200)' assert_true: 'color(srgb-linear -200 -200 -200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear -200 -200 -200 / -200)' assert_true: 'color(srgb-linear -200 -200 -200 / -200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 200% 200% 200%)' assert_true: 'color(srgb-linear 200% 200% 200%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 200% 200% 200% / 200%)' assert_true: 'color(srgb-linear 200% 200% 200% / 200%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear -200% -200% -200% / -200%)' assert_true: 'color(srgb-linear -200% -200% -200% / -200%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' assert_true: 'color(srgb-linear calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' assert_true: 'color(srgb-linear calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear none none none / none)' assert_true: 'color(srgb-linear none none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear none none none)' assert_true: 'color(srgb-linear none none none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 10% none none / none)' assert_true: 'color(srgb-linear 10% none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear none none none / 0.5)' assert_true: 'color(srgb-linear none none none / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(srgb-linear 0 0 0 / none)' assert_true: 'color(srgb-linear 0 0 0 / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 0% 0% 0%)' assert_true: 'color(a98-rgb 0% 0% 0%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 10% 10% 10%)' assert_true: 'color(a98-rgb 10% 10% 10%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb .2 .2 25%)' assert_true: 'color(a98-rgb .2 .2 25%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 0 0 0 / 1)' assert_true: 'color(a98-rgb 0 0 0 / 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 0% 0 0 / 0.5)' assert_true: 'color(a98-rgb 0% 0 0 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 20% 0 10/0.5)' assert_true: 'color(a98-rgb 20% 0 10/0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 20% 0 10/50%)' assert_true: 'color(a98-rgb 20% 0 10/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 400% 0 10/50%)' assert_true: 'color(a98-rgb 400% 0 10/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 50% -160 160)' assert_true: 'color(a98-rgb 50% -160 160)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 50% -200 200)' assert_true: 'color(a98-rgb 50% -200 200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 0 0 0 / -10%)' assert_true: 'color(a98-rgb 0 0 0 / -10%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 0 0 0 / 110%)' assert_true: 'color(a98-rgb 0 0 0 / 110%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 0 0 0 / 300%)' assert_true: 'color(a98-rgb 0 0 0 / 300%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 50% -200)' assert_true: 'color(a98-rgb 50% -200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 50%)' assert_true: 'color(a98-rgb 50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb)' assert_true: 'color(a98-rgb)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 50% -200 / 0.5)' assert_true: 'color(a98-rgb 50% -200 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 50% / 0.5)' assert_true: 'color(a98-rgb 50% / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb / 0.5)' assert_true: 'color(a98-rgb / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 200 200 200)' assert_true: 'color(a98-rgb 200 200 200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 200 200 200 / 200)' assert_true: 'color(a98-rgb 200 200 200 / 200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb -200 -200 -200)' assert_true: 'color(a98-rgb -200 -200 -200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb -200 -200 -200 / -200)' assert_true: 'color(a98-rgb -200 -200 -200 / -200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 200% 200% 200%)' assert_true: 'color(a98-rgb 200% 200% 200%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 200% 200% 200% / 200%)' assert_true: 'color(a98-rgb 200% 200% 200% / 200%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb -200% -200% -200% / -200%)' assert_true: 'color(a98-rgb -200% -200% -200% / -200%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' assert_true: 'color(a98-rgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' assert_true: 'color(a98-rgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb none none none / none)' assert_true: 'color(a98-rgb none none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb none none none)' assert_true: 'color(a98-rgb none none none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 10% none none / none)' assert_true: 'color(a98-rgb 10% none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb none none none / 0.5)' assert_true: 'color(a98-rgb none none none / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(a98-rgb 0 0 0 / none)' assert_true: 'color(a98-rgb 0 0 0 / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 0% 0% 0%)' assert_true: 'color(rec2020 0% 0% 0%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 10% 10% 10%)' assert_true: 'color(rec2020 10% 10% 10%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 .2 .2 25%)' assert_true: 'color(rec2020 .2 .2 25%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 0 0 0 / 1)' assert_true: 'color(rec2020 0 0 0 / 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 0% 0 0 / 0.5)' assert_true: 'color(rec2020 0% 0 0 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 20% 0 10/0.5)' assert_true: 'color(rec2020 20% 0 10/0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 20% 0 10/50%)' assert_true: 'color(rec2020 20% 0 10/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 400% 0 10/50%)' assert_true: 'color(rec2020 400% 0 10/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 50% -160 160)' assert_true: 'color(rec2020 50% -160 160)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 50% -200 200)' assert_true: 'color(rec2020 50% -200 200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 0 0 0 / -10%)' assert_true: 'color(rec2020 0 0 0 / -10%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 0 0 0 / 110%)' assert_true: 'color(rec2020 0 0 0 / 110%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 0 0 0 / 300%)' assert_true: 'color(rec2020 0 0 0 / 300%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 50% -200)' assert_true: 'color(rec2020 50% -200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 50%)' assert_true: 'color(rec2020 50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020)' assert_true: 'color(rec2020)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 50% -200 / 0.5)' assert_true: 'color(rec2020 50% -200 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 50% / 0.5)' assert_true: 'color(rec2020 50% / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 / 0.5)' assert_true: 'color(rec2020 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 200 200 200)' assert_true: 'color(rec2020 200 200 200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 200 200 200 / 200)' assert_true: 'color(rec2020 200 200 200 / 200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 -200 -200 -200)' assert_true: 'color(rec2020 -200 -200 -200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 -200 -200 -200 / -200)' assert_true: 'color(rec2020 -200 -200 -200 / -200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 200% 200% 200%)' assert_true: 'color(rec2020 200% 200% 200%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 200% 200% 200% / 200%)' assert_true: 'color(rec2020 200% 200% 200% / 200%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 -200% -200% -200% / -200%)' assert_true: 'color(rec2020 -200% -200% -200% / -200%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' assert_true: 'color(rec2020 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' assert_true: 'color(rec2020 calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 none none none / none)' assert_true: 'color(rec2020 none none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 none none none)' assert_true: 'color(rec2020 none none none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 10% none none / none)' assert_true: 'color(rec2020 10% none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 none none none / 0.5)' assert_true: 'color(rec2020 none none none / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(rec2020 0 0 0 / none)' assert_true: 'color(rec2020 0 0 0 / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 0% 0% 0%)' assert_true: 'color(prophoto-rgb 0% 0% 0%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 10% 10% 10%)' assert_true: 'color(prophoto-rgb 10% 10% 10%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb .2 .2 25%)' assert_true: 'color(prophoto-rgb .2 .2 25%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 0 0 0 / 1)' assert_true: 'color(prophoto-rgb 0 0 0 / 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 0% 0 0 / 0.5)' assert_true: 'color(prophoto-rgb 0% 0 0 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 20% 0 10/0.5)' assert_true: 'color(prophoto-rgb 20% 0 10/0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 20% 0 10/50%)' assert_true: 'color(prophoto-rgb 20% 0 10/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 400% 0 10/50%)' assert_true: 'color(prophoto-rgb 400% 0 10/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 50% -160 160)' assert_true: 'color(prophoto-rgb 50% -160 160)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 50% -200 200)' assert_true: 'color(prophoto-rgb 50% -200 200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 0 0 0 / -10%)' assert_true: 'color(prophoto-rgb 0 0 0 / -10%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 0 0 0 / 110%)' assert_true: 'color(prophoto-rgb 0 0 0 / 110%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 0 0 0 / 300%)' assert_true: 'color(prophoto-rgb 0 0 0 / 300%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 50% -200)' assert_true: 'color(prophoto-rgb 50% -200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 50%)' assert_true: 'color(prophoto-rgb 50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb)' assert_true: 'color(prophoto-rgb)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 50% -200 / 0.5)' assert_true: 'color(prophoto-rgb 50% -200 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 50% / 0.5)' assert_true: 'color(prophoto-rgb 50% / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb / 0.5)' assert_true: 'color(prophoto-rgb / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 200 200 200)' assert_true: 'color(prophoto-rgb 200 200 200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 200 200 200 / 200)' assert_true: 'color(prophoto-rgb 200 200 200 / 200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb -200 -200 -200)' assert_true: 'color(prophoto-rgb -200 -200 -200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb -200 -200 -200 / -200)' assert_true: 'color(prophoto-rgb -200 -200 -200 / -200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 200% 200% 200%)' assert_true: 'color(prophoto-rgb 200% 200% 200%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 200% 200% 200% / 200%)' assert_true: 'color(prophoto-rgb 200% 200% 200% / 200%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb -200% -200% -200% / -200%)' assert_true: 'color(prophoto-rgb -200% -200% -200% / -200%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' assert_true: 'color(prophoto-rgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' assert_true: 'color(prophoto-rgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb none none none / none)' assert_true: 'color(prophoto-rgb none none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb none none none)' assert_true: 'color(prophoto-rgb none none none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 10% none none / none)' assert_true: 'color(prophoto-rgb 10% none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb none none none / 0.5)' assert_true: 'color(prophoto-rgb none none none / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(prophoto-rgb 0 0 0 / none)' assert_true: 'color(prophoto-rgb 0 0 0 / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 0% 0% 0%)' assert_true: 'color(display-p3 0% 0% 0%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 10% 10% 10%)' assert_true: 'color(display-p3 10% 10% 10%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 .2 .2 25%)' assert_true: 'color(display-p3 .2 .2 25%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 0 0 0 / 1)' assert_true: 'color(display-p3 0 0 0 / 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 0% 0 0 / 0.5)' assert_true: 'color(display-p3 0% 0 0 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 20% 0 10/0.5)' assert_true: 'color(display-p3 20% 0 10/0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 20% 0 10/50%)' assert_true: 'color(display-p3 20% 0 10/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 400% 0 10/50%)' assert_true: 'color(display-p3 400% 0 10/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 50% -160 160)' assert_true: 'color(display-p3 50% -160 160)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 50% -200 200)' assert_true: 'color(display-p3 50% -200 200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 0 0 0 / -10%)' assert_true: 'color(display-p3 0 0 0 / -10%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 0 0 0 / 110%)' assert_true: 'color(display-p3 0 0 0 / 110%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 0 0 0 / 300%)' assert_true: 'color(display-p3 0 0 0 / 300%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 50% -200)' assert_true: 'color(display-p3 50% -200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 50%)' assert_true: 'color(display-p3 50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3)' assert_true: 'color(display-p3)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 50% -200 / 0.5)' assert_true: 'color(display-p3 50% -200 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 50% / 0.5)' assert_true: 'color(display-p3 50% / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 / 0.5)' assert_true: 'color(display-p3 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 200 200 200)' assert_true: 'color(display-p3 200 200 200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 200 200 200 / 200)' assert_true: 'color(display-p3 200 200 200 / 200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 -200 -200 -200)' assert_true: 'color(display-p3 -200 -200 -200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 -200 -200 -200 / -200)' assert_true: 'color(display-p3 -200 -200 -200 / -200)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 200% 200% 200%)' assert_true: 'color(display-p3 200% 200% 200%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 200% 200% 200% / 200%)' assert_true: 'color(display-p3 200% 200% 200% / 200%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 -200% -200% -200% / -200%)' assert_true: 'color(display-p3 -200% -200% -200% / -200%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' assert_true: 'color(display-p3 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' assert_true: 'color(display-p3 calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 none none none / none)' assert_true: 'color(display-p3 none none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 none none none)' assert_true: 'color(display-p3 none none none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 10% none none / none)' assert_true: 'color(display-p3 10% none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 none none none / 0.5)' assert_true: 'color(display-p3 none none none / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(display-p3 0 0 0 / none)' assert_true: 'color(display-p3 0 0 0 / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz 0 0 0)' assert_true: 'color(xyz 0 0 0)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz 0 0 0 / 1)' assert_true: 'color(xyz 0 0 0 / 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz 1 1 1)' assert_true: 'color(xyz 1 1 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz 1 1 1 / 1)' assert_true: 'color(xyz 1 1 1 / 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz -1 -1 -1)' assert_true: 'color(xyz -1 -1 -1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz 0.1 0.1 0.1)' assert_true: 'color(xyz 0.1 0.1 0.1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz 10 10 10)' assert_true: 'color(xyz 10 10 10)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz .2 .2 .25)' assert_true: 'color(xyz .2 .2 .25)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz 0 0 0 / 0.5)' assert_true: 'color(xyz 0 0 0 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz .20 0 10/0.5)' assert_true: 'color(xyz .20 0 10/0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz .20 0 10/50%)' assert_true: 'color(xyz .20 0 10/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz 0 0 0 / -10%)' assert_true: 'color(xyz 0 0 0 / -10%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz 0 0 0 / 110%)' assert_true: 'color(xyz 0 0 0 / 110%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz 0 0 0 / 300%)' assert_true: 'color(xyz 0 0 0 / 300%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz 1 1)' assert_true: 'color(xyz 1 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz 1)' assert_true: 'color(xyz 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz)' assert_true: 'color(xyz)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz 1 1 / .5)' assert_true: 'color(xyz 1 1 / .5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz 1 / 0.5)' assert_true: 'color(xyz 1 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz / 50%)' assert_true: 'color(xyz / 50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' assert_true: 'color(xyz calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz none none none / none)' assert_true: 'color(xyz none none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz none none none)' assert_true: 'color(xyz none none none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz 0.2 none none / none)' assert_true: 'color(xyz 0.2 none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz none none none / 0.5)' assert_true: 'color(xyz none none none / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz 0 0 0 / none)' assert_true: 'color(xyz 0 0 0 / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 0 0 0)' assert_true: 'color(xyz-d50 0 0 0)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 0 0 0 / 1)' assert_true: 'color(xyz-d50 0 0 0 / 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 1 1 1)' assert_true: 'color(xyz-d50 1 1 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 1 1 1 / 1)' assert_true: 'color(xyz-d50 1 1 1 / 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 -1 -1 -1)' assert_true: 'color(xyz-d50 -1 -1 -1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 0.1 0.1 0.1)' assert_true: 'color(xyz-d50 0.1 0.1 0.1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 10 10 10)' assert_true: 'color(xyz-d50 10 10 10)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 .2 .2 .25)' assert_true: 'color(xyz-d50 .2 .2 .25)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 0 0 0 / 0.5)' assert_true: 'color(xyz-d50 0 0 0 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 .20 0 10/0.5)' assert_true: 'color(xyz-d50 .20 0 10/0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 .20 0 10/50%)' assert_true: 'color(xyz-d50 .20 0 10/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 0 0 0 / -10%)' assert_true: 'color(xyz-d50 0 0 0 / -10%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 0 0 0 / 110%)' assert_true: 'color(xyz-d50 0 0 0 / 110%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 0 0 0 / 300%)' assert_true: 'color(xyz-d50 0 0 0 / 300%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 1 1)' assert_true: 'color(xyz-d50 1 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 1)' assert_true: 'color(xyz-d50 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50)' assert_true: 'color(xyz-d50)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 1 1 / .5)' assert_true: 'color(xyz-d50 1 1 / .5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 1 / 0.5)' assert_true: 'color(xyz-d50 1 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 / 50%)' assert_true: 'color(xyz-d50 / 50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' assert_true: 'color(xyz-d50 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 none none none / none)' assert_true: 'color(xyz-d50 none none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 none none none)' assert_true: 'color(xyz-d50 none none none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 0.2 none none / none)' assert_true: 'color(xyz-d50 0.2 none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 none none none / 0.5)' assert_true: 'color(xyz-d50 none none none / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d50 0 0 0 / none)' assert_true: 'color(xyz-d50 0 0 0 / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 0 0 0)' assert_true: 'color(xyz-d65 0 0 0)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 0 0 0 / 1)' assert_true: 'color(xyz-d65 0 0 0 / 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 1 1 1)' assert_true: 'color(xyz-d65 1 1 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 1 1 1 / 1)' assert_true: 'color(xyz-d65 1 1 1 / 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 -1 -1 -1)' assert_true: 'color(xyz-d65 -1 -1 -1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 0.1 0.1 0.1)' assert_true: 'color(xyz-d65 0.1 0.1 0.1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 10 10 10)' assert_true: 'color(xyz-d65 10 10 10)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 .2 .2 .25)' assert_true: 'color(xyz-d65 .2 .2 .25)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 0 0 0 / 0.5)' assert_true: 'color(xyz-d65 0 0 0 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 .20 0 10/0.5)' assert_true: 'color(xyz-d65 .20 0 10/0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 .20 0 10/50%)' assert_true: 'color(xyz-d65 .20 0 10/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 0 0 0 / -10%)' assert_true: 'color(xyz-d65 0 0 0 / -10%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 0 0 0 / 110%)' assert_true: 'color(xyz-d65 0 0 0 / 110%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 0 0 0 / 300%)' assert_true: 'color(xyz-d65 0 0 0 / 300%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 1 1)' assert_true: 'color(xyz-d65 1 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 1)' assert_true: 'color(xyz-d65 1)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65)' assert_true: 'color(xyz-d65)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 1 1 / .5)' assert_true: 'color(xyz-d65 1 1 / .5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 1 / 0.5)' assert_true: 'color(xyz-d65 1 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 / 50%)' assert_true: 'color(xyz-d65 / 50%)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' assert_true: 'color(xyz-d65 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 none none none / none)' assert_true: 'color(xyz-d65 none none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 none none none)' assert_true: 'color(xyz-d65 none none none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 0.2 none none / none)' assert_true: 'color(xyz-d65 0.2 none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 none none none / 0.5)' assert_true: 'color(xyz-d65 none none none / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'color(xyz-d65 0 0 0 / none)' assert_true: 'color(xyz-d65 0 0 0 / none)' is a supported value for color. expected true got false
+FAIL Property color value 'lab(0 0 0)' assert_true: 'lab(0 0 0)' is a supported value for color. expected true got false
+FAIL Property color value 'lab(0 0 0 / 1)' assert_true: 'lab(0 0 0 / 1)' is a supported value for color. expected true got false
+FAIL Property color value 'lab(0 0 0 / 0.5)' assert_true: 'lab(0 0 0 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'lab(20 0 10/0.5)' assert_true: 'lab(20 0 10/0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'lab(20 0 10/50%)' assert_true: 'lab(20 0 10/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'lab(400 0 10/50%)' assert_true: 'lab(400 0 10/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'lab(50 -160 160)' assert_true: 'lab(50 -160 160)' is a supported value for color. expected true got false
+FAIL Property color value 'lab(50 -200 200)' assert_true: 'lab(50 -200 200)' is a supported value for color. expected true got false
+FAIL Property color value 'lab(0 0 0 / -10%)' assert_true: 'lab(0 0 0 / -10%)' is a supported value for color. expected true got false
+FAIL Property color value 'lab(0 0 0 / 110%)' assert_true: 'lab(0 0 0 / 110%)' is a supported value for color. expected true got false
+FAIL Property color value 'lab(0 0 0 / 300%)' assert_true: 'lab(0 0 0 / 300%)' is a supported value for color. expected true got false
+FAIL Property color value 'lab(-40 0 0)' assert_true: 'lab(-40 0 0)' is a supported value for color. expected true got false
+FAIL Property color value 'lab(50 -20 0)' assert_true: 'lab(50 -20 0)' is a supported value for color. expected true got false
+FAIL Property color value 'lab(50 0 -20)' assert_true: 'lab(50 0 -20)' is a supported value for color. expected true got false
+FAIL Property color value 'lab(calc(50 * 3) calc(0.5 - 1) calc(1.5) / calc(-0.5 + 1))' assert_true: 'lab(calc(50 * 3) calc(0.5 - 1) calc(1.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false
+FAIL Property color value 'lab(calc(-50 * 3) calc(0.5 + 1) calc(-1.5) / calc(-0.5 * 2))' assert_true: 'lab(calc(-50 * 3) calc(0.5 + 1) calc(-1.5) / calc(-0.5 * 2))' is a supported value for color. expected true got false
+FAIL Property color value 'lab(none none none / none)' assert_true: 'lab(none none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'lab(none none none)' assert_true: 'lab(none none none)' is a supported value for color. expected true got false
+FAIL Property color value 'lab(20 none none / none)' assert_true: 'lab(20 none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'lab(none none none / 0.5)' assert_true: 'lab(none none none / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'lab(0 0 0 / none)' assert_true: 'lab(0 0 0 / none)' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(0 0 0)' assert_true: 'oklab(0 0 0)' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(0 0 0 / 1)' assert_true: 'oklab(0 0 0 / 1)' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(0 0 0 / 0.5)' assert_true: 'oklab(0 0 0 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(20 0 10/0.5)' assert_true: 'oklab(20 0 10/0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(20 0 10/50%)' assert_true: 'oklab(20 0 10/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(400 0 10/50%)' assert_true: 'oklab(400 0 10/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(50 -160 160)' assert_true: 'oklab(50 -160 160)' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(50 -200 200)' assert_true: 'oklab(50 -200 200)' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(0 0 0 / -10%)' assert_true: 'oklab(0 0 0 / -10%)' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(0 0 0 / 110%)' assert_true: 'oklab(0 0 0 / 110%)' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(0 0 0 / 300%)' assert_true: 'oklab(0 0 0 / 300%)' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(-40 0 0)' assert_true: 'oklab(-40 0 0)' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(50 -20 0)' assert_true: 'oklab(50 -20 0)' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(50 0 -20)' assert_true: 'oklab(50 0 -20)' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(calc(50 * 3) calc(0.5 - 1) calc(1.5) / calc(-0.5 + 1))' assert_true: 'oklab(calc(50 * 3) calc(0.5 - 1) calc(1.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(calc(-50 * 3) calc(0.5 + 1) calc(-1.5) / calc(-0.5 * 2))' assert_true: 'oklab(calc(-50 * 3) calc(0.5 + 1) calc(-1.5) / calc(-0.5 * 2))' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(none none none / none)' assert_true: 'oklab(none none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(none none none)' assert_true: 'oklab(none none none)' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(20 none none / none)' assert_true: 'oklab(20 none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(none none none / 0.5)' assert_true: 'oklab(none none none / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'oklab(0 0 0 / none)' assert_true: 'oklab(0 0 0 / none)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(0 0 0deg)' assert_true: 'lch(0 0 0deg)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(0 0 0deg / 1)' assert_true: 'lch(0 0 0deg / 1)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(0 0 0deg / 0.5)' assert_true: 'lch(0 0 0deg / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(100 230 0deg / 0.5)' assert_true: 'lch(100 230 0deg / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(20 50 20deg/0.5)' assert_true: 'lch(20 50 20deg/0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(20 50 20deg/50%)' assert_true: 'lch(20 50 20deg/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(10 20 20deg / -10%)' assert_true: 'lch(10 20 20deg / -10%)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(10 20 20deg / 110%)' assert_true: 'lch(10 20 20deg / 110%)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(10 20 1.28rad)' assert_true: 'lch(10 20 1.28rad)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(10 20 380deg)' assert_true: 'lch(10 20 380deg)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(10 20 -340deg)' assert_true: 'lch(10 20 -340deg)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(10 20 740deg)' assert_true: 'lch(10 20 740deg)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(10 20 -700deg)' assert_true: 'lch(10 20 -700deg)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(-40 0 0)' assert_true: 'lch(-40 0 0)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(20 -20 0)' assert_true: 'lch(20 -20 0)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(0 0 0 / 0.5)' assert_true: 'lch(0 0 0 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(10 20 20 / 110%)' assert_true: 'lch(10 20 20 / 110%)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(10 20 -700)' assert_true: 'lch(10 20 -700)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(calc(50 * 3) calc(0.5 - 1) calc(20deg * 2) / calc(-0.5 + 1))' assert_true: 'lch(calc(50 * 3) calc(0.5 - 1) calc(20deg * 2) / calc(-0.5 + 1))' is a supported value for color. expected true got false
+FAIL Property color value 'lch(calc(-50 * 3) calc(0.5 + 1) calc(-20deg * 2) / calc(-0.5 * 2))' assert_true: 'lch(calc(-50 * 3) calc(0.5 + 1) calc(-20deg * 2) / calc(-0.5 * 2))' is a supported value for color. expected true got false
+FAIL Property color value 'lch(none none none / none)' assert_true: 'lch(none none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(none none none)' assert_true: 'lch(none none none)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(20 none none / none)' assert_true: 'lch(20 none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(none none none / 0.5)' assert_true: 'lch(none none none / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'lch(0 0 0 / none)' assert_true: 'lch(0 0 0 / none)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(0 0 0deg)' assert_true: 'oklch(0 0 0deg)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(0 0 0deg / 1)' assert_true: 'oklch(0 0 0deg / 1)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(0 0 0deg / 0.5)' assert_true: 'oklch(0 0 0deg / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(100 230 0deg / 0.5)' assert_true: 'oklch(100 230 0deg / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(20 50 20deg/0.5)' assert_true: 'oklch(20 50 20deg/0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(20 50 20deg/50%)' assert_true: 'oklch(20 50 20deg/50%)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(10 20 20deg / -10%)' assert_true: 'oklch(10 20 20deg / -10%)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(10 20 20deg / 110%)' assert_true: 'oklch(10 20 20deg / 110%)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(10 20 1.28rad)' assert_true: 'oklch(10 20 1.28rad)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(10 20 380deg)' assert_true: 'oklch(10 20 380deg)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(10 20 -340deg)' assert_true: 'oklch(10 20 -340deg)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(10 20 740deg)' assert_true: 'oklch(10 20 740deg)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(10 20 -700deg)' assert_true: 'oklch(10 20 -700deg)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(-40 0 0)' assert_true: 'oklch(-40 0 0)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(20 -20 0)' assert_true: 'oklch(20 -20 0)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(0 0 0 / 0.5)' assert_true: 'oklch(0 0 0 / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(10 20 20 / 110%)' assert_true: 'oklch(10 20 20 / 110%)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(10 20 -700)' assert_true: 'oklch(10 20 -700)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(calc(50 * 3) calc(0.5 - 1) calc(20deg * 2) / calc(-0.5 + 1))' assert_true: 'oklch(calc(50 * 3) calc(0.5 - 1) calc(20deg * 2) / calc(-0.5 + 1))' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(calc(-50 * 3) calc(0.5 + 1) calc(-20deg * 2) / calc(-0.5 * 2))' assert_true: 'oklch(calc(-50 * 3) calc(0.5 + 1) calc(-20deg * 2) / calc(-0.5 * 2))' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(none none none / none)' assert_true: 'oklch(none none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(none none none)' assert_true: 'oklch(none none none)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(20 none none / none)' assert_true: 'oklch(20 none none / none)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(none none none / 0.5)' assert_true: 'oklch(none none none / 0.5)' is a supported value for color. expected true got false
+FAIL Property color value 'oklch(0 0 0 / none)' assert_true: 'oklch(0 0 0 / none)' is a supported value for color. expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-contrast-computed-expected.txt b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-contrast-computed-expected.txt
new file mode 100644
index 0000000..da359f0
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-contrast-computed-expected.txt
@@ -0,0 +1,25 @@
+This is a testharness.js-based test.
+FAIL Property color value 'color-contrast(white vs red, blue)' assert_true: 'color-contrast(white vs red, blue)' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(white vs blue, red)' assert_true: 'color-contrast(white vs blue, red)' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(white vs red, blue, green)' assert_true: 'color-contrast(white vs red, blue, green)' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(white vs white, white)' assert_true: 'color-contrast(white vs white, white)' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(blue vs red, white)' assert_true: 'color-contrast(blue vs red, white)' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(red vs blue, white, red)' assert_true: 'color-contrast(red vs blue, white, red)' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(black vs red, blue)' assert_true: 'color-contrast(black vs red, blue)' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(black vs blue, red)' assert_true: 'color-contrast(black vs blue, red)' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(black vs white, white)' assert_true: 'color-contrast(black vs white, white)' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(red vs blue, rgb(255, 255, 255, .5))' assert_true: 'color-contrast(red vs blue, rgb(255, 255, 255, .5))' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(wheat vs bisque, darkgoldenrod, olive, sienna, darkgreen, maroon to AA)' assert_true: 'color-contrast(wheat vs bisque, darkgoldenrod, olive, sienna, darkgreen, maroon to AA)' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(wheat vs bisque, darkgoldenrod, olive, sienna, darkgreen, maroon to AA-large)' assert_true: 'color-contrast(wheat vs bisque, darkgoldenrod, olive, sienna, darkgreen, maroon to AA-large)' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(wheat vs bisque, darkgoldenrod, olive, sienna, darkgreen, maroon to AAA)' assert_true: 'color-contrast(wheat vs bisque, darkgoldenrod, olive, sienna, darkgreen, maroon to AAA)' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(wheat vs bisque, darkgoldenrod, olive, sienna, darkgreen, maroon to AAA-large)' assert_true: 'color-contrast(wheat vs bisque, darkgoldenrod, olive, sienna, darkgreen, maroon to AAA-large)' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(wheat vs bisque, darkgoldenrod, olive, sienna, darkgreen, maroon to 5.8)' assert_true: 'color-contrast(wheat vs bisque, darkgoldenrod, olive, sienna, darkgreen, maroon to 5.8)' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(wheat vs bisque, darkgoldenrod, olive to 100)' assert_true: 'color-contrast(wheat vs bisque, darkgoldenrod, olive to 100)' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(green vs bisque, darkgoldenrod, olive to 100)' assert_true: 'color-contrast(green vs bisque, darkgoldenrod, olive to 100)' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(green vs color(display-p3 0 1 0), color(display-p3 0 0 1))' assert_true: 'color-contrast(green vs color(display-p3 0 1 0), color(display-p3 0 0 1))' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(color(display-p3 1 1 0) vs color(display-p3 0 1 0), color(display-p3 0 0 1))' assert_true: 'color-contrast(color(display-p3 1 1 0) vs color(display-p3 0 1 0), color(display-p3 0 0 1))' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(green vs lab(50% -160 160), lch(0.2 50 20deg))' assert_true: 'color-contrast(green vs lab(50% -160 160), lch(0.2 50 20deg))' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast(lab(50% -160 160) vs green, lch(0.2 50 20deg))' assert_true: 'color-contrast(lab(50% -160 160) vs green, lch(0.2 50 20deg))' is a supported value for color. expected true got false
+FAIL Property color value 'color-contrast( white vs red, blue )' assert_true: 'color-contrast( white vs red, blue )' is a supported value for color. expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-contrast-valid-expected.txt b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-contrast-valid-expected.txt
new file mode 100644
index 0000000..bcfcf80
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-contrast-valid-expected.txt
@@ -0,0 +1,25 @@
+This is a testharness.js-based test.
+FAIL e.style['color'] = "color-contrast(white vs red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(white vs blue, red)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(white vs red, blue, green)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(white vs white, white)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(blue vs red, white)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(red vs blue, white, red)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(black vs red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(black vs blue, red)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(black vs white, white)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(red vs blue, rgb(255, 255, 255, .5))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(wheat vs bisque, darkgoldenrod, olive, sienna, darkgreen, maroon to AA)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(wheat vs bisque, darkgoldenrod, olive, sienna, darkgreen, maroon to AA-large)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(wheat vs bisque, darkgoldenrod, olive, sienna, darkgreen, maroon to AAA)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(wheat vs bisque, darkgoldenrod, olive, sienna, darkgreen, maroon to AAA-large)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(wheat vs bisque, darkgoldenrod, olive, sienna, darkgreen, maroon to 5.8)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(wheat vs bisque, darkgoldenrod, olive to 100)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(green vs bisque, darkgoldenrod, olive to 100)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(green vs color(display-p3 0 1 0), color(display-p3 0 0 1))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(color(display-p3 1 1 0) vs color(display-p3 0 1 0), color(display-p3 0 0 1))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(green vs lab(50% -160 160), lch(0.2 50 20deg))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast(lab(50% -160 160) vs green, lch(0.2 50 20deg))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color-contrast( white vs red, blue )" should set the property value assert_not_equals: property should be set got disallowed value ""
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-mixed-num-pct-expected.txt b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-mixed-num-pct-expected.txt
new file mode 100644
index 0000000..6a4fdac
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-mixed-num-pct-expected.txt
@@ -0,0 +1,148 @@
+This is a testharness.js-based test.
+Found 144 tests; 0 PASS, 144 FAIL, 0 TIMEOUT, 0 NOTRUN.
+FAIL sRGB all numbers assert_equals: expected "color(srgb 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL sRGB all percent assert_equals: expected "color(srgb 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL sRGB mixed number and percent assert_equals: expected "color(srgb 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL sRGB mixed number and percent 2 assert_equals: expected "color(srgb 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL sRGB all none assert_equals: expected "color(srgb none none none)" but got "rgb(0, 0, 0)"
+FAIL sRGB number and none assert_equals: expected "color(srgb 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL sRGB percent and none assert_equals: expected "color(srgb 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL sRGB number, percent and none assert_equals: expected "color(srgb 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL sRGB with alpha, all numbers assert_equals: expected "color(srgb 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL sRGB with alpha, all percent assert_equals: expected "color(srgb 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL sRGB with alpha, mixed number and percent assert_equals: expected "color(srgb 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL sRGB with alpha, mixed number and percent 2 assert_equals: expected "color(srgb 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL sRGB with alpha, all none assert_equals: expected "color(srgb none none none / none)" but got "rgb(0, 0, 0)"
+FAIL sRGB with alpha, number and none assert_equals: expected "color(srgb 1 none 0.2 / none)" but got "rgb(0, 0, 0)"
+FAIL sRGB with alpha, percent and none assert_equals: expected "color(srgb 1 none 0.2 / 0.3)" but got "rgb(0, 0, 0)"
+FAIL sRGB with alpha, number, percent and none assert_equals: expected "color(srgb 1 none 0.2 / 0.237)" but got "rgb(0, 0, 0)"
+FAIL Linear-light sRGB all numbers assert_equals: expected "color(srgb-linear 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL Linear-light sRGB all percent assert_equals: expected "color(srgb-linear 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL Linear-light sRGB mixed number and percent assert_equals: expected "color(srgb-linear 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL Linear-light sRGB mixed number and percent 2 assert_equals: expected "color(srgb-linear 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL Linear-light sRGB all none assert_equals: expected "color(srgb-linear none none none)" but got "rgb(0, 0, 0)"
+FAIL Linear-light sRGB number and none assert_equals: expected "color(srgb-linear 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL Linear-light sRGB percent and none assert_equals: expected "color(srgb-linear 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL Linear-light sRGB number, percent and none assert_equals: expected "color(srgb-linear 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL Linear-light sRGB with alpha, all numbers assert_equals: expected "color(srgb-linear 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL Linear-light sRGB with alpha, all percent assert_equals: expected "color(srgb-linear 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL Linear-light sRGB with alpha, mixed number and percent assert_equals: expected "color(srgb-linear 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL Linear-light sRGB with alpha, mixed number and percent 2 assert_equals: expected "color(srgb-linear 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL Linear-light sRGB with alpha, all none assert_equals: expected "color(srgb-linear none none none / none)" but got "rgb(0, 0, 0)"
+FAIL Linear-light sRGB with alpha, number and none assert_equals: expected "color(srgb-linear 1 none 0.2 / none)" but got "rgb(0, 0, 0)"
+FAIL Linear-light sRGB with alpha, percent and none assert_equals: expected "color(srgb-linear 1 none 0.2 / 0.3)" but got "rgb(0, 0, 0)"
+FAIL Linear-light sRGB with alpha, number, percent and none assert_equals: expected "color(srgb-linear 1 none 0.2 / 0.237)" but got "rgb(0, 0, 0)"
+FAIL Display P3 all numbers assert_equals: expected "color(display-p3 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL Display P3 all percent assert_equals: expected "color(display-p3 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL Display P3 mixed number and percent assert_equals: expected "color(display-p3 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL Display P3 mixed number and percent 2 assert_equals: expected "color(display-p3 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL Display P3 all none assert_equals: expected "color(display-p3 none none none)" but got "rgb(0, 0, 0)"
+FAIL Display P3 number and none assert_equals: expected "color(display-p3 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL Display P3 percent and none assert_equals: expected "color(display-p3 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL Display P3 number, percent and none assert_equals: expected "color(display-p3 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL Display P3 with alpha, all numbers assert_equals: expected "color(display-p3 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL Display P3 with alpha, all percent assert_equals: expected "color(display-p3 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL Display P3 with alpha, mixed number and percent assert_equals: expected "color(display-p3 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL Display P3 with alpha, mixed number and percent 2 assert_equals: expected "color(display-p3 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL Display P3 with alpha, all none assert_equals: expected "color(display-p3 none none none / none)" but got "rgb(0, 0, 0)"
+FAIL Display P3 with alpha, number and none assert_equals: expected "color(display-p3 1 none 0.2 / none)" but got "rgb(0, 0, 0)"
+FAIL Display P3 with alpha, percent and none assert_equals: expected "color(display-p3 1 none 0.2 / 0.3)" but got "rgb(0, 0, 0)"
+FAIL Display P3 with alpha, number, percent and none assert_equals: expected "color(display-p3 1 none 0.2 / 0.237)" but got "rgb(0, 0, 0)"
+FAIL A98 RGB all numbers assert_equals: expected "color(a98-rgb 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL A98 RGB all percent assert_equals: expected "color(a98-rgb 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL A98 RGB mixed number and percent assert_equals: expected "color(a98-rgb 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL A98 RGB mixed number and percent 2 assert_equals: expected "color(a98-rgb 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL A98 RGB all none assert_equals: expected "color(a98-rgb none none none)" but got "rgb(0, 0, 0)"
+FAIL A98 RGB number and none assert_equals: expected "color(a98-rgb 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL A98 RGB percent and none assert_equals: expected "color(a98-rgb 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL A98 RGB number, percent and none assert_equals: expected "color(a98-rgb 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL A98 RGB with alpha, all numbers assert_equals: expected "color(a98-rgb 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL A98 RGB with alpha, all percent assert_equals: expected "color(a98-rgb 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL A98 RGB with alpha, mixed number and percent assert_equals: expected "color(a98-rgb 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL A98 RGB with alpha, mixed number and percent 2 assert_equals: expected "color(a98-rgb 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL A98 RGB with alpha, all none assert_equals: expected "color(a98-rgb none none none / none)" but got "rgb(0, 0, 0)"
+FAIL A98 RGB with alpha, number and none assert_equals: expected "color(a98-rgb 1 none 0.2 / none)" but got "rgb(0, 0, 0)"
+FAIL A98 RGB with alpha, percent and none assert_equals: expected "color(a98-rgb 1 none 0.2 / 0.3)" but got "rgb(0, 0, 0)"
+FAIL A98 RGB with alpha, number, percent and none assert_equals: expected "color(a98-rgb 1 none 0.2 / 0.237)" but got "rgb(0, 0, 0)"
+FAIL ProPhoto RGB all numbers assert_equals: expected "color(prophoto-rgb 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL ProPhoto RGB all percent assert_equals: expected "color(prophoto-rgb 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL ProPhoto RGB mixed number and percent assert_equals: expected "color(prophoto-rgb 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL ProPhoto RGB mixed number and percent 2 assert_equals: expected "color(prophoto-rgb 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL ProPhoto RGB all none assert_equals: expected "color(prophoto-rgb none none none)" but got "rgb(0, 0, 0)"
+FAIL ProPhoto RGB number and none assert_equals: expected "color(prophoto-rgb 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL ProPhoto RGB percent and none assert_equals: expected "color(prophoto-rgb 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL ProPhoto RGB number, percent and none assert_equals: expected "color(prophoto-rgb 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL ProPhoto RGB with alpha, all numbers assert_equals: expected "color(prophoto-rgb 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL ProPhoto RGB with alpha, all percent assert_equals: expected "color(prophoto-rgb 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL ProPhoto RGB with alpha, mixed number and percent assert_equals: expected "color(prophoto-rgb 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL ProPhoto RGB with alpha, mixed number and percent 2 assert_equals: expected "color(prophoto-rgb 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL ProPhoto RGB with alpha, all none assert_equals: expected "color(prophoto-rgb none none none / none)" but got "rgb(0, 0, 0)"
+FAIL ProPhoto RGB with alpha, number and none assert_equals: expected "color(prophoto-rgb 1 none 0.2 / none)" but got "rgb(0, 0, 0)"
+FAIL ProPhoto RGB with alpha, percent and none assert_equals: expected "color(prophoto-rgb 1 none 0.2 / 0.3)" but got "rgb(0, 0, 0)"
+FAIL ProPhoto RGB with alpha, number, percent and none assert_equals: expected "color(prophoto-rgb 1 none 0.2 / 0.237)" but got "rgb(0, 0, 0)"
+FAIL Rec BT.2020 all numbers assert_equals: expected "color(rec2020 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL Rec BT.2020 all percent assert_equals: expected "color(rec2020 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL Rec BT.2020 mixed number and percent assert_equals: expected "color(rec2020 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL Rec BT.2020 mixed number and percent 2 assert_equals: expected "color(rec2020 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL Rec BT.2020 all none assert_equals: expected "color(rec2020 none none none)" but got "rgb(0, 0, 0)"
+FAIL Rec BT.2020 number and none assert_equals: expected "color(rec2020 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL Rec BT.2020 percent and none assert_equals: expected "color(rec2020 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL Rec BT.2020 number, percent and none assert_equals: expected "color(rec2020 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL Rec BT.2020 with alpha, all numbers assert_equals: expected "color(rec2020 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL Rec BT.2020 with alpha, all percent assert_equals: expected "color(rec2020 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL Rec BT.2020 with alpha, mixed number and percent assert_equals: expected "color(rec2020 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL Rec BT.2020 with alpha, mixed number and percent 2 assert_equals: expected "color(rec2020 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL Rec BT.2020 with alpha, all none assert_equals: expected "color(rec2020 none none none / none)" but got "rgb(0, 0, 0)"
+FAIL Rec BT.2020 with alpha, number and none assert_equals: expected "color(rec2020 1 none 0.2 / none)" but got "rgb(0, 0, 0)"
+FAIL Rec BT.2020 with alpha, percent and none assert_equals: expected "color(rec2020 1 none 0.2 / 0.3)" but got "rgb(0, 0, 0)"
+FAIL Rec BT.2020 with alpha, number, percent and none assert_equals: expected "color(rec2020 1 none 0.2 / 0.237)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D50 all numbers assert_equals: expected "color(xyz-d50 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D50 all percent assert_equals: expected "color(xyz-d50 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D50 mixed number and percent assert_equals: expected "color(xyz-d50 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D50 mixed number and percent 2 assert_equals: expected "color(xyz-d50 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D50 all none assert_equals: expected "color(xyz-d50 none none none)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D50 number and none assert_equals: expected "color(xyz-d50 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D50 percent and none assert_equals: expected "color(xyz-d50 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D50 number, percent and none assert_equals: expected "color(xyz-d50 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D50 with alpha, all numbers assert_equals: expected "color(xyz-d50 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D50 with alpha, all percent assert_equals: expected "color(xyz-d50 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D50 with alpha, mixed number and percent assert_equals: expected "color(xyz-d50 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D50 with alpha, mixed number and percent 2 assert_equals: expected "color(xyz-d50 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D50 with alpha, all none assert_equals: expected "color(xyz-d50 none none none / none)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D50 with alpha, number and none assert_equals: expected "color(xyz-d50 1 none 0.2 / none)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D50 with alpha, percent and none assert_equals: expected "color(xyz-d50 1 none 0.2 / 0.3)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D50 with alpha, number, percent and none assert_equals: expected "color(xyz-d50 1 none 0.2 / 0.237)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D65 all numbers assert_equals: expected "color(xyz-d65 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D65 all percent assert_equals: expected "color(xyz-d65 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D65 mixed number and percent assert_equals: expected "color(xyz-d65 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D65 mixed number and percent 2 assert_equals: expected "color(xyz-d65 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D65 all none assert_equals: expected "color(xyz-d65 none none none)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D65 number and none assert_equals: expected "color(xyz-d65 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D65 percent and none assert_equals: expected "color(xyz-d65 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D65 number, percent and none assert_equals: expected "color(xyz-d65 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D65 with alpha, all numbers assert_equals: expected "color(xyz-d65 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D65 with alpha, all percent assert_equals: expected "color(xyz-d65 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D65 with alpha, mixed number and percent assert_equals: expected "color(xyz-d65 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D65 with alpha, mixed number and percent 2 assert_equals: expected "color(xyz-d65 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D65 with alpha, all none assert_equals: expected "color(xyz-d65 none none none / none)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D65 with alpha, number and none assert_equals: expected "color(xyz-d65 1 none 0.2 / none)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D65 with alpha, percent and none assert_equals: expected "color(xyz-d65 1 none 0.2 / 0.3)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ D65 with alpha, number, percent and none assert_equals: expected "color(xyz-d65 1 none 0.2 / 0.237)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ (implicit D65) all numbers assert_equals: expected "color(xyz-d65 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ (implicit D65) all percent assert_equals: expected "color(xyz-d65 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ (implicit D65) mixed number and percent assert_equals: expected "color(xyz-d65 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ (implicit D65) mixed number and percent 2 assert_equals: expected "color(xyz-d65 1 0.5 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ (implicit D65) all none assert_equals: expected "color(xyz-d65 none none none)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ (implicit D65) number and none assert_equals: expected "color(xyz-d65 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ (implicit D65) percent and none assert_equals: expected "color(xyz-d65 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ (implicit D65) number, percent and none assert_equals: expected "color(xyz-d65 1 none 0.2)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ (implicit D65) with alpha, all numbers assert_equals: expected "color(xyz-d65 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ (implicit D65) with alpha, all percent assert_equals: expected "color(xyz-d65 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ (implicit D65) with alpha, mixed number and percent assert_equals: expected "color(xyz-d65 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ (implicit D65) with alpha, mixed number and percent 2 assert_equals: expected "color(xyz-d65 1 0.5 0.2 / 0.6)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ (implicit D65) with alpha, all none assert_equals: expected "color(xyz-d65 none none none / none)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ (implicit D65) with alpha, number and none assert_equals: expected "color(xyz-d65 1 none 0.2 / none)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ (implicit D65) with alpha, percent and none assert_equals: expected "color(xyz-d65 1 none 0.2 / 0.3)" but got "rgb(0, 0, 0)"
+FAIL CIE XYZ (implicit D65) with alpha, number, percent and none assert_equals: expected "color(xyz-d65 1 none 0.2 / 0.237)" but got "rgb(0, 0, 0)"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-valid-expected.txt b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-valid-expected.txt
new file mode 100644
index 0000000..c6024e2
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-valid-expected.txt
@@ -0,0 +1,440 @@
+This is a testharness.js-based test.
+Found 436 tests; 68 PASS, 368 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS e.style['color'] = "currentcolor" should set the property value
+PASS e.style['color'] = "transparent" should set the property value
+PASS e.style['color'] = "red" should set the property value
+PASS e.style['color'] = "magenta" should set the property value
+PASS e.style['color'] = "#234" should set the property value
+PASS e.style['color'] = "#FEDCBA" should set the property value
+PASS e.style['color'] = "rgb(2, 3, 4)" should set the property value
+PASS e.style['color'] = "rgb(100%, 0%, 0%)" should set the property value
+PASS e.style['color'] = "rgba(2, 3, 4, 0.5)" should set the property value
+PASS e.style['color'] = "rgba(2, 3, 4, 50%)" should set the property value
+PASS e.style['color'] = "hsl(120, 100%, 50%)" should set the property value
+PASS e.style['color'] = "hsla(120, 100%, 50%, 0.25)" should set the property value
+PASS e.style['color'] = "rgb(-2, 3, 4)" should set the property value
+PASS e.style['color'] = "rgb(100, 200, 300)" should set the property value
+PASS e.style['color'] = "rgb(20, 10, 0, -10)" should set the property value
+PASS e.style['color'] = "rgb(100%, 200%, 300%)" should set the property value
+PASS e.style['color'] = "rgb(none none none)" should set the property value
+PASS e.style['color'] = "rgb(none none none / none)" should set the property value
+PASS e.style['color'] = "rgb(128 none none)" should set the property value
+PASS e.style['color'] = "rgb(128 none none / none)" should set the property value
+PASS e.style['color'] = "rgb(none none none / .5)" should set the property value
+PASS e.style['color'] = "rgb(20% none none)" should set the property value
+PASS e.style['color'] = "rgb(20% none none / none)" should set the property value
+PASS e.style['color'] = "rgb(none none none / 50%)" should set the property value
+PASS e.style['color'] = "rgba(none none none)" should set the property value
+PASS e.style['color'] = "rgba(none none none / none)" should set the property value
+PASS e.style['color'] = "rgba(128 none none)" should set the property value
+PASS e.style['color'] = "rgba(128 none none / none)" should set the property value
+PASS e.style['color'] = "rgba(none none none / .5)" should set the property value
+PASS e.style['color'] = "rgba(20% none none)" should set the property value
+PASS e.style['color'] = "rgba(20% none none / none)" should set the property value
+PASS e.style['color'] = "rgba(none none none / 50%)" should set the property value
+PASS e.style['color'] = "hsl(120 30% 50%)" should set the property value
+PASS e.style['color'] = "hsl(120 30% 50% / 0.5)" should set the property value
+PASS e.style['color'] = "hsl(none none none)" should set the property value
+PASS e.style['color'] = "hsl(0 0% 0%)" should set the property value
+PASS e.style['color'] = "hsl(none none none / none)" should set the property value
+PASS e.style['color'] = "hsl(0 0% 0% / 0)" should set the property value
+PASS e.style['color'] = "hsla(none none none)" should set the property value
+PASS e.style['color'] = "hsla(0 0% 0%)" should set the property value
+PASS e.style['color'] = "hsla(none none none / none)" should set the property value
+PASS e.style['color'] = "hsla(0 0% 0% / 0)" should set the property value
+PASS e.style['color'] = "hsl(120 none none)" should set the property value
+PASS e.style['color'] = "hsl(120 0% 0%)" should set the property value
+PASS e.style['color'] = "hsl(120 80% none)" should set the property value
+PASS e.style['color'] = "hsl(120 80% 0%)" should set the property value
+PASS e.style['color'] = "hsl(120 none 50%)" should set the property value
+PASS e.style['color'] = "hsl(120 0% 50%)" should set the property value
+PASS e.style['color'] = "hsl(120 100% 50% / none)" should set the property value
+PASS e.style['color'] = "hsl(120 100% 50% / 0)" should set the property value
+PASS e.style['color'] = "hsl(none 100% 50%)" should set the property value
+PASS e.style['color'] = "hsl(0 100% 50%)" should set the property value
+PASS e.style['color'] = "hwb(120 30% 50%)" should set the property value
+PASS e.style['color'] = "hwb(120 30% 50% / 0.5)" should set the property value
+PASS e.style['color'] = "hwb(none none none)" should set the property value
+PASS e.style['color'] = "hwb(0 0% 0%)" should set the property value
+PASS e.style['color'] = "hwb(none none none / none)" should set the property value
+PASS e.style['color'] = "hwb(0 0% 0% / 0)" should set the property value
+PASS e.style['color'] = "hwb(120 none none)" should set the property value
+PASS e.style['color'] = "hwb(120 0% 0%)" should set the property value
+PASS e.style['color'] = "hwb(120 80% none)" should set the property value
+PASS e.style['color'] = "hwb(120 80% 0%)" should set the property value
+PASS e.style['color'] = "hwb(120 none 50%)" should set the property value
+PASS e.style['color'] = "hwb(120 0% 50%)" should set the property value
+PASS e.style['color'] = "hwb(120 30% 50% / none)" should set the property value
+PASS e.style['color'] = "hwb(120 30% 50% / 0)" should set the property value
+PASS e.style['color'] = "hwb(none 100% 50% / none)" should set the property value
+PASS e.style['color'] = "hwb(0 100% 50% / 0)" should set the property value
+FAIL e.style['color'] = "color(srgb 0% 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 10% 10% 10%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb .2 .2 25%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 0 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 0% 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 20% 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 20% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 400% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 50% -160 160)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 50% -200 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 0 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 0 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 0 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 50% -200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 50% -200 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 50% / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 200 200 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 200 200 200 / 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb -200 -200 -200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb -200 -200 -200 / -200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 200% 200% 200%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 200% 200% 200% / 200%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb -200% -200% -200% / -200%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb none none none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 10% none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb 0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 0% 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 10% 10% 10%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear .2 .2 25%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 0 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 0% 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 20% 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 20% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 400% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 50% -160 160)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 50% -200 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 0 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 0 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 0 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 50% -200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 50% -200 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 50% / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 200 200 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 200 200 200 / 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear -200 -200 -200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear -200 -200 -200 / -200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 200% 200% 200%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 200% 200% 200% / 200%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear -200% -200% -200% / -200%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear none none none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 10% none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(srgb-linear 0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 0% 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 10% 10% 10%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb .2 .2 25%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 0 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 0% 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 20% 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 20% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 400% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 50% -160 160)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 50% -200 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 0 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 0 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 0 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 50% -200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 50% -200 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 50% / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 200 200 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 200 200 200 / 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb -200 -200 -200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb -200 -200 -200 / -200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 200% 200% 200%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 200% 200% 200% / 200%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb -200% -200% -200% / -200%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb none none none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 10% none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(a98-rgb 0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 0% 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 10% 10% 10%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 .2 .2 25%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 0 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 0% 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 20% 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 20% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 400% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 50% -160 160)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 50% -200 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 0 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 0 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 0 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 50% -200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 50% -200 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 50% / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 200 200 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 200 200 200 / 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 -200 -200 -200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 -200 -200 -200 / -200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 200% 200% 200%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 200% 200% 200% / 200%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 -200% -200% -200% / -200%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 none none none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 10% none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(rec2020 0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 0% 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 10% 10% 10%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb .2 .2 25%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 0 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 0% 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 20% 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 20% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 400% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 50% -160 160)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 50% -200 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 0 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 0 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 0 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 50% -200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 50% -200 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 50% / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 200 200 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 200 200 200 / 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb -200 -200 -200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb -200 -200 -200 / -200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 200% 200% 200%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 200% 200% 200% / 200%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb -200% -200% -200% / -200%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb none none none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 10% none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(prophoto-rgb 0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 0% 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 10% 10% 10%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 .2 .2 25%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 0 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 0% 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 20% 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 20% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 400% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 50% -160 160)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 50% -200 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 0 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 0 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 0 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 50% -200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 50% -200 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 50% / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 200 200 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 200 200 200 / 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 -200 -200 -200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 -200 -200 -200 / -200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 200% 200% 200%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 200% 200% 200% / 200%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 -200% -200% -200% / -200%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 none none none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 10% none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(display-p3 0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz 0 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz 1 1 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz 1 1 1 / 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz -1 -1 -1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz 0.1 0.1 0.1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz 10 10 10)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz .2 .2 .25)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz 0 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz .20 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz .20 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz 0 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz 0 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz 0 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz 1 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz 1 1 / .5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz 1 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz / 50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz none none none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz 0.2 none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz 0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 0 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 1 1 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 1 1 1 / 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 -1 -1 -1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 0.1 0.1 0.1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 10 10 10)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 .2 .2 .25)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 0 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 .20 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 .20 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 0 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 0 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 0 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 1 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 1 1 / .5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 1 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 / 50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 none none none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 0.2 none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d50 0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 0 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 1 1 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 1 1 1 / 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 -1 -1 -1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 0.1 0.1 0.1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 10 10 10)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 .2 .2 .25)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 0 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 .20 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 .20 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 0 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 0 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 0 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 1 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 1 1 / .5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 1 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 / 50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 none none none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 0.2 none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "color(xyz-d65 0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(0 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(0 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(20 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(20 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(400 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(50 -160 160)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(50 -200 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(0 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(0 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(0 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(-40 0 0)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(50 -20 0)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(50 0 -20)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(calc(50 * 3) calc(0.5 - 1) calc(1.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(calc(-50 * 3) calc(0.5 + 1) calc(-1.5) / calc(-0.5 * 2))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(none none none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(20 none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lab(0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(0 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(0 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(20 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(20 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(400 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(50 -160 160)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(50 -200 200)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(0 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(0 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(0 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(-40 0 0)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(50 -20 0)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(50 0 -20)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(calc(50 * 3) calc(0.5 - 1) calc(1.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(calc(-50 * 3) calc(0.5 + 1) calc(-1.5) / calc(-0.5 * 2))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(none none none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(20 none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklab(0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(0 0 0deg)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(0 0 0deg / 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(0 0 0deg / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(100 230 0deg / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(20 50 20deg/0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(20 50 20deg/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(10 20 20deg / -10%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(10 20 20deg / 110%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(10 20 1.28rad)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(10 20 380deg)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(10 20 -340deg)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(10 20 740deg)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(10 20 -700deg)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(-40 0 0)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(20 -20 0)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(0 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(10 20 20 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(10 20 -700)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(calc(50 * 3) calc(0.5 - 1) calc(20deg * 2) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(calc(-50 * 3) calc(0.5 + 1) calc(-20deg * 2) / calc(-0.5 * 2))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(none none none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(20 none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "lch(0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(0 0 0deg)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(0 0 0deg / 1)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(0 0 0deg / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(100 230 0deg / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(20 50 20deg/0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(20 50 20deg/50%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(10 20 20deg / -10%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(10 20 20deg / 110%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(10 20 1.28rad)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(10 20 380deg)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(10 20 -340deg)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(10 20 740deg)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(10 20 -700deg)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(-40 0 0)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(20 -20 0)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(0 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(10 20 20 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(10 20 -700)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(calc(50 * 3) calc(0.5 - 1) calc(20deg * 2) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(calc(-50 * 3) calc(0.5 + 1) calc(-20deg * 2) / calc(-0.5 * 2))" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(none none none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(20 none none / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['color'] = "oklch(0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value ""
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-images/parsing/gradient-interpolation-method-computed-expected.txt b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-images/parsing/gradient-interpolation-method-computed-expected.txt
new file mode 100644
index 0000000..d6c629f0
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-images/parsing/gradient-interpolation-method-computed-expected.txt
@@ -0,0 +1,1072 @@
+This is a testharness.js-based test.
+Found 1068 tests; 7 PASS, 1061 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS Property background-image value 'linear-gradient(30deg, red, blue)'
+PASS Property background-image value 'linear-gradient(to right bottom, red, blue)'
+FAIL Property background-image value 'linear-gradient(30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lab, red, blue)' assert_true: 'linear-gradient(in lab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in lab, red, blue)' assert_true: 'linear-gradient(30deg in lab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lab 30deg, red, blue)' assert_true: 'linear-gradient(in lab 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in lab, red, blue)' assert_true: 'linear-gradient(to right bottom in lab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lab to right bottom, red, blue)' assert_true: 'linear-gradient(in lab to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lab, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in lab, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in lab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lab 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lab 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in lab, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in lab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lab to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lab to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklab, red, blue)' assert_true: 'linear-gradient(in oklab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in oklab, red, blue)' assert_true: 'linear-gradient(30deg in oklab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklab 30deg, red, blue)' assert_true: 'linear-gradient(in oklab 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in oklab, red, blue)' assert_true: 'linear-gradient(to right bottom in oklab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklab to right bottom, red, blue)' assert_true: 'linear-gradient(in oklab to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklab, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in oklab, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in oklab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklab 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklab 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in oklab, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in oklab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklab to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklab to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in srgb, red, blue)' assert_true: 'linear-gradient(in srgb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in srgb, red, blue)' assert_true: 'linear-gradient(30deg in srgb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in srgb 30deg, red, blue)' assert_true: 'linear-gradient(in srgb 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in srgb, red, blue)' assert_true: 'linear-gradient(to right bottom in srgb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in srgb to right bottom, red, blue)' assert_true: 'linear-gradient(in srgb to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in srgb, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in srgb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in srgb, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in srgb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in srgb 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in srgb 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in srgb, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in srgb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in srgb to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in srgb to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in srgb-linear, red, blue)' assert_true: 'linear-gradient(in srgb-linear, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in srgb-linear, red, blue)' assert_true: 'linear-gradient(30deg in srgb-linear, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in srgb-linear 30deg, red, blue)' assert_true: 'linear-gradient(in srgb-linear 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in srgb-linear, red, blue)' assert_true: 'linear-gradient(to right bottom in srgb-linear, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in srgb-linear to right bottom, red, blue)' assert_true: 'linear-gradient(in srgb-linear to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in srgb-linear, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in srgb-linear, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in srgb-linear, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in srgb-linear, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in srgb-linear 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in srgb-linear 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in srgb-linear, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in srgb-linear, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in srgb-linear to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in srgb-linear to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in xyz, red, blue)' assert_true: 'linear-gradient(in xyz, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in xyz, red, blue)' assert_true: 'linear-gradient(30deg in xyz, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in xyz 30deg, red, blue)' assert_true: 'linear-gradient(in xyz 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in xyz, red, blue)' assert_true: 'linear-gradient(to right bottom in xyz, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in xyz to right bottom, red, blue)' assert_true: 'linear-gradient(in xyz to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in xyz, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in xyz, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in xyz, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in xyz, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in xyz 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in xyz 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in xyz, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in xyz, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in xyz to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in xyz to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in xyz-d50, red, blue)' assert_true: 'linear-gradient(in xyz-d50, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in xyz-d50, red, blue)' assert_true: 'linear-gradient(30deg in xyz-d50, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in xyz-d50 30deg, red, blue)' assert_true: 'linear-gradient(in xyz-d50 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in xyz-d50, red, blue)' assert_true: 'linear-gradient(to right bottom in xyz-d50, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in xyz-d50 to right bottom, red, blue)' assert_true: 'linear-gradient(in xyz-d50 to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in xyz-d50, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in xyz-d50, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in xyz-d50, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in xyz-d50, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in xyz-d50 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in xyz-d50 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in xyz-d50, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in xyz-d50, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in xyz-d50 to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in xyz-d50 to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in xyz-d65, red, blue)' assert_true: 'linear-gradient(in xyz-d65, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in xyz-d65, red, blue)' assert_true: 'linear-gradient(30deg in xyz-d65, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in xyz-d65 30deg, red, blue)' assert_true: 'linear-gradient(in xyz-d65 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in xyz-d65, red, blue)' assert_true: 'linear-gradient(to right bottom in xyz-d65, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in xyz-d65 to right bottom, red, blue)' assert_true: 'linear-gradient(in xyz-d65 to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in xyz-d65, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in xyz-d65, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in xyz-d65, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in xyz-d65, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in xyz-d65 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in xyz-d65 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in xyz-d65, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in xyz-d65, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in xyz-d65 to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in xyz-d65 to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl, red, blue)' assert_true: 'linear-gradient(in hsl, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hsl, red, blue)' assert_true: 'linear-gradient(30deg in hsl, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl 30deg, red, blue)' assert_true: 'linear-gradient(in hsl 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hsl, red, blue)' assert_true: 'linear-gradient(to right bottom in hsl, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl to right bottom, red, blue)' assert_true: 'linear-gradient(in hsl to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hsl, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hsl, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in hsl, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hsl 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hsl, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in hsl, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hsl to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl shorter hue, red, blue)' assert_true: 'linear-gradient(in hsl shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hsl shorter hue, red, blue)' assert_true: 'linear-gradient(30deg in hsl shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl shorter hue 30deg, red, blue)' assert_true: 'linear-gradient(in hsl shorter hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hsl shorter hue, red, blue)' assert_true: 'linear-gradient(to right bottom in hsl shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl shorter hue to right bottom, red, blue)' assert_true: 'linear-gradient(in hsl shorter hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl shorter hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hsl shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hsl shorter hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in hsl shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl shorter hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hsl shorter hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hsl shorter hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in hsl shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl shorter hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hsl shorter hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl longer hue, red, blue)' assert_true: 'linear-gradient(in hsl longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hsl longer hue, red, blue)' assert_true: 'linear-gradient(30deg in hsl longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl longer hue 30deg, red, blue)' assert_true: 'linear-gradient(in hsl longer hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hsl longer hue, red, blue)' assert_true: 'linear-gradient(to right bottom in hsl longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl longer hue to right bottom, red, blue)' assert_true: 'linear-gradient(in hsl longer hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl longer hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hsl longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hsl longer hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in hsl longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl longer hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hsl longer hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hsl longer hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in hsl longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl longer hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hsl longer hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl increasing hue, red, blue)' assert_true: 'linear-gradient(in hsl increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hsl increasing hue, red, blue)' assert_true: 'linear-gradient(30deg in hsl increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl increasing hue 30deg, red, blue)' assert_true: 'linear-gradient(in hsl increasing hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hsl increasing hue, red, blue)' assert_true: 'linear-gradient(to right bottom in hsl increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl increasing hue to right bottom, red, blue)' assert_true: 'linear-gradient(in hsl increasing hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl increasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hsl increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hsl increasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in hsl increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl increasing hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hsl increasing hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hsl increasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in hsl increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl increasing hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hsl increasing hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl decreasing hue, red, blue)' assert_true: 'linear-gradient(in hsl decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hsl decreasing hue, red, blue)' assert_true: 'linear-gradient(30deg in hsl decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl decreasing hue 30deg, red, blue)' assert_true: 'linear-gradient(in hsl decreasing hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hsl decreasing hue, red, blue)' assert_true: 'linear-gradient(to right bottom in hsl decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl decreasing hue to right bottom, red, blue)' assert_true: 'linear-gradient(in hsl decreasing hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hsl decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hsl decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in hsl decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl decreasing hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hsl decreasing hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hsl decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in hsl decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl decreasing hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hsl decreasing hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl specified hue, red, blue)' assert_true: 'linear-gradient(in hsl specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hsl specified hue, red, blue)' assert_true: 'linear-gradient(30deg in hsl specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl specified hue 30deg, red, blue)' assert_true: 'linear-gradient(in hsl specified hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hsl specified hue, red, blue)' assert_true: 'linear-gradient(to right bottom in hsl specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl specified hue to right bottom, red, blue)' assert_true: 'linear-gradient(in hsl specified hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl specified hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hsl specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hsl specified hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in hsl specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl specified hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hsl specified hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hsl specified hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in hsl specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hsl specified hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hsl specified hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb, red, blue)' assert_true: 'linear-gradient(in hwb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hwb, red, blue)' assert_true: 'linear-gradient(30deg in hwb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb 30deg, red, blue)' assert_true: 'linear-gradient(in hwb 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hwb, red, blue)' assert_true: 'linear-gradient(to right bottom in hwb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb to right bottom, red, blue)' assert_true: 'linear-gradient(in hwb to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hwb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hwb, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in hwb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hwb 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hwb, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in hwb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hwb to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb shorter hue, red, blue)' assert_true: 'linear-gradient(in hwb shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hwb shorter hue, red, blue)' assert_true: 'linear-gradient(30deg in hwb shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb shorter hue 30deg, red, blue)' assert_true: 'linear-gradient(in hwb shorter hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hwb shorter hue, red, blue)' assert_true: 'linear-gradient(to right bottom in hwb shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb shorter hue to right bottom, red, blue)' assert_true: 'linear-gradient(in hwb shorter hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb shorter hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hwb shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hwb shorter hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in hwb shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb shorter hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hwb shorter hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hwb shorter hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in hwb shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb shorter hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hwb shorter hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb longer hue, red, blue)' assert_true: 'linear-gradient(in hwb longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hwb longer hue, red, blue)' assert_true: 'linear-gradient(30deg in hwb longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb longer hue 30deg, red, blue)' assert_true: 'linear-gradient(in hwb longer hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hwb longer hue, red, blue)' assert_true: 'linear-gradient(to right bottom in hwb longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb longer hue to right bottom, red, blue)' assert_true: 'linear-gradient(in hwb longer hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb longer hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hwb longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hwb longer hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in hwb longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb longer hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hwb longer hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hwb longer hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in hwb longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb longer hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hwb longer hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb increasing hue, red, blue)' assert_true: 'linear-gradient(in hwb increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hwb increasing hue, red, blue)' assert_true: 'linear-gradient(30deg in hwb increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb increasing hue 30deg, red, blue)' assert_true: 'linear-gradient(in hwb increasing hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hwb increasing hue, red, blue)' assert_true: 'linear-gradient(to right bottom in hwb increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb increasing hue to right bottom, red, blue)' assert_true: 'linear-gradient(in hwb increasing hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb increasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hwb increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hwb increasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in hwb increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb increasing hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hwb increasing hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hwb increasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in hwb increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb increasing hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hwb increasing hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb decreasing hue, red, blue)' assert_true: 'linear-gradient(in hwb decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hwb decreasing hue, red, blue)' assert_true: 'linear-gradient(30deg in hwb decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb decreasing hue 30deg, red, blue)' assert_true: 'linear-gradient(in hwb decreasing hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hwb decreasing hue, red, blue)' assert_true: 'linear-gradient(to right bottom in hwb decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb decreasing hue to right bottom, red, blue)' assert_true: 'linear-gradient(in hwb decreasing hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hwb decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hwb decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in hwb decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb decreasing hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hwb decreasing hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hwb decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in hwb decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb decreasing hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hwb decreasing hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb specified hue, red, blue)' assert_true: 'linear-gradient(in hwb specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hwb specified hue, red, blue)' assert_true: 'linear-gradient(30deg in hwb specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb specified hue 30deg, red, blue)' assert_true: 'linear-gradient(in hwb specified hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hwb specified hue, red, blue)' assert_true: 'linear-gradient(to right bottom in hwb specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb specified hue to right bottom, red, blue)' assert_true: 'linear-gradient(in hwb specified hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb specified hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hwb specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in hwb specified hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in hwb specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb specified hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hwb specified hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in hwb specified hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in hwb specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in hwb specified hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in hwb specified hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch, red, blue)' assert_true: 'linear-gradient(in lch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in lch, red, blue)' assert_true: 'linear-gradient(30deg in lch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch 30deg, red, blue)' assert_true: 'linear-gradient(in lch 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in lch, red, blue)' assert_true: 'linear-gradient(to right bottom in lch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch to right bottom, red, blue)' assert_true: 'linear-gradient(in lch to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in lch, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in lch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lch 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in lch, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in lch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lch to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch shorter hue, red, blue)' assert_true: 'linear-gradient(in lch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in lch shorter hue, red, blue)' assert_true: 'linear-gradient(30deg in lch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch shorter hue 30deg, red, blue)' assert_true: 'linear-gradient(in lch shorter hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in lch shorter hue, red, blue)' assert_true: 'linear-gradient(to right bottom in lch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch shorter hue to right bottom, red, blue)' assert_true: 'linear-gradient(in lch shorter hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in lch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in lch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch shorter hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lch shorter hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in lch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in lch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch shorter hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lch shorter hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch longer hue, red, blue)' assert_true: 'linear-gradient(in lch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in lch longer hue, red, blue)' assert_true: 'linear-gradient(30deg in lch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch longer hue 30deg, red, blue)' assert_true: 'linear-gradient(in lch longer hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in lch longer hue, red, blue)' assert_true: 'linear-gradient(to right bottom in lch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch longer hue to right bottom, red, blue)' assert_true: 'linear-gradient(in lch longer hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch longer hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in lch longer hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in lch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch longer hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lch longer hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in lch longer hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in lch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch longer hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lch longer hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch increasing hue, red, blue)' assert_true: 'linear-gradient(in lch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in lch increasing hue, red, blue)' assert_true: 'linear-gradient(30deg in lch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch increasing hue 30deg, red, blue)' assert_true: 'linear-gradient(in lch increasing hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in lch increasing hue, red, blue)' assert_true: 'linear-gradient(to right bottom in lch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch increasing hue to right bottom, red, blue)' assert_true: 'linear-gradient(in lch increasing hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in lch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in lch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch increasing hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lch increasing hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in lch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in lch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch increasing hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lch increasing hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch decreasing hue, red, blue)' assert_true: 'linear-gradient(in lch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in lch decreasing hue, red, blue)' assert_true: 'linear-gradient(30deg in lch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch decreasing hue 30deg, red, blue)' assert_true: 'linear-gradient(in lch decreasing hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in lch decreasing hue, red, blue)' assert_true: 'linear-gradient(to right bottom in lch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch decreasing hue to right bottom, red, blue)' assert_true: 'linear-gradient(in lch decreasing hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in lch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in lch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch decreasing hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lch decreasing hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in lch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in lch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch decreasing hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lch decreasing hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch specified hue, red, blue)' assert_true: 'linear-gradient(in lch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in lch specified hue, red, blue)' assert_true: 'linear-gradient(30deg in lch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch specified hue 30deg, red, blue)' assert_true: 'linear-gradient(in lch specified hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in lch specified hue, red, blue)' assert_true: 'linear-gradient(to right bottom in lch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch specified hue to right bottom, red, blue)' assert_true: 'linear-gradient(in lch specified hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch specified hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in lch specified hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in lch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch specified hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lch specified hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in lch specified hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in lch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in lch specified hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in lch specified hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch, red, blue)' assert_true: 'linear-gradient(in oklch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in oklch, red, blue)' assert_true: 'linear-gradient(30deg in oklch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch 30deg, red, blue)' assert_true: 'linear-gradient(in oklch 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in oklch, red, blue)' assert_true: 'linear-gradient(to right bottom in oklch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch to right bottom, red, blue)' assert_true: 'linear-gradient(in oklch to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in oklch, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in oklch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklch 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in oklch, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in oklch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklch to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch shorter hue, red, blue)' assert_true: 'linear-gradient(in oklch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in oklch shorter hue, red, blue)' assert_true: 'linear-gradient(30deg in oklch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch shorter hue 30deg, red, blue)' assert_true: 'linear-gradient(in oklch shorter hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in oklch shorter hue, red, blue)' assert_true: 'linear-gradient(to right bottom in oklch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch shorter hue to right bottom, red, blue)' assert_true: 'linear-gradient(in oklch shorter hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in oklch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in oklch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch shorter hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklch shorter hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in oklch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in oklch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch shorter hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklch shorter hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch longer hue, red, blue)' assert_true: 'linear-gradient(in oklch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in oklch longer hue, red, blue)' assert_true: 'linear-gradient(30deg in oklch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch longer hue 30deg, red, blue)' assert_true: 'linear-gradient(in oklch longer hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in oklch longer hue, red, blue)' assert_true: 'linear-gradient(to right bottom in oklch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch longer hue to right bottom, red, blue)' assert_true: 'linear-gradient(in oklch longer hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch longer hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in oklch longer hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in oklch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch longer hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklch longer hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in oklch longer hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in oklch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch longer hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklch longer hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch increasing hue, red, blue)' assert_true: 'linear-gradient(in oklch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in oklch increasing hue, red, blue)' assert_true: 'linear-gradient(30deg in oklch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch increasing hue 30deg, red, blue)' assert_true: 'linear-gradient(in oklch increasing hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in oklch increasing hue, red, blue)' assert_true: 'linear-gradient(to right bottom in oklch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch increasing hue to right bottom, red, blue)' assert_true: 'linear-gradient(in oklch increasing hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in oklch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in oklch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch increasing hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklch increasing hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in oklch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in oklch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch increasing hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklch increasing hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch decreasing hue, red, blue)' assert_true: 'linear-gradient(in oklch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in oklch decreasing hue, red, blue)' assert_true: 'linear-gradient(30deg in oklch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch decreasing hue 30deg, red, blue)' assert_true: 'linear-gradient(in oklch decreasing hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in oklch decreasing hue, red, blue)' assert_true: 'linear-gradient(to right bottom in oklch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch decreasing hue to right bottom, red, blue)' assert_true: 'linear-gradient(in oklch decreasing hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in oklch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in oklch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch decreasing hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklch decreasing hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in oklch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in oklch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch decreasing hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklch decreasing hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch specified hue, red, blue)' assert_true: 'linear-gradient(in oklch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in oklch specified hue, red, blue)' assert_true: 'linear-gradient(30deg in oklch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch specified hue 30deg, red, blue)' assert_true: 'linear-gradient(in oklch specified hue 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in oklch specified hue, red, blue)' assert_true: 'linear-gradient(to right bottom in oklch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch specified hue to right bottom, red, blue)' assert_true: 'linear-gradient(in oklch specified hue to right bottom, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch specified hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(30deg in oklch specified hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(30deg in oklch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch specified hue 30deg, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklch specified hue 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(to right bottom in oklch specified hue, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(to right bottom in oklch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'linear-gradient(in oklch specified hue to right bottom, color(srgb 1 0 0), blue)' assert_true: 'linear-gradient(in oklch specified hue to right bottom, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+PASS Property background-image value 'radial-gradient(50px, red, blue)'
+PASS Property background-image value 'radial-gradient(ellipse 50% 40em, red, blue)'
+PASS Property background-image value 'radial-gradient(at right center, red, blue)'
+FAIL Property background-image value 'radial-gradient(50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lab, red, blue)' assert_true: 'radial-gradient(in lab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in lab, red, blue)' assert_true: 'radial-gradient(50px in lab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lab 50px, red, blue)' assert_true: 'radial-gradient(in lab 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in lab, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in lab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lab ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in lab ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in lab, red, blue)' assert_true: 'radial-gradient(at right center in lab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lab at right center, red, blue)' assert_true: 'radial-gradient(in lab at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lab, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in lab, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in lab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lab 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lab 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in lab, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in lab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lab ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lab ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in lab, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in lab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lab at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lab at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklab, red, blue)' assert_true: 'radial-gradient(in oklab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in oklab, red, blue)' assert_true: 'radial-gradient(50px in oklab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklab 50px, red, blue)' assert_true: 'radial-gradient(in oklab 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in oklab, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in oklab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklab ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in oklab ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in oklab, red, blue)' assert_true: 'radial-gradient(at right center in oklab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklab at right center, red, blue)' assert_true: 'radial-gradient(in oklab at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklab, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in oklab, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in oklab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklab 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklab 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in oklab, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in oklab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklab ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklab ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in oklab, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in oklab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklab at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklab at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in srgb, red, blue)' assert_true: 'radial-gradient(in srgb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in srgb, red, blue)' assert_true: 'radial-gradient(50px in srgb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in srgb 50px, red, blue)' assert_true: 'radial-gradient(in srgb 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in srgb, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in srgb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in srgb ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in srgb ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in srgb, red, blue)' assert_true: 'radial-gradient(at right center in srgb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in srgb at right center, red, blue)' assert_true: 'radial-gradient(in srgb at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in srgb, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in srgb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in srgb, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in srgb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in srgb 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in srgb 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in srgb, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in srgb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in srgb ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in srgb ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in srgb, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in srgb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in srgb at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in srgb at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in srgb-linear, red, blue)' assert_true: 'radial-gradient(in srgb-linear, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in srgb-linear, red, blue)' assert_true: 'radial-gradient(50px in srgb-linear, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in srgb-linear 50px, red, blue)' assert_true: 'radial-gradient(in srgb-linear 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in srgb-linear, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in srgb-linear, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in srgb-linear ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in srgb-linear ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in srgb-linear, red, blue)' assert_true: 'radial-gradient(at right center in srgb-linear, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in srgb-linear at right center, red, blue)' assert_true: 'radial-gradient(in srgb-linear at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in srgb-linear, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in srgb-linear, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in srgb-linear, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in srgb-linear, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in srgb-linear 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in srgb-linear 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in srgb-linear, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in srgb-linear, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in srgb-linear ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in srgb-linear ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in srgb-linear, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in srgb-linear, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in srgb-linear at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in srgb-linear at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz, red, blue)' assert_true: 'radial-gradient(in xyz, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in xyz, red, blue)' assert_true: 'radial-gradient(50px in xyz, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz 50px, red, blue)' assert_true: 'radial-gradient(in xyz 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in xyz, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in xyz, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in xyz ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in xyz, red, blue)' assert_true: 'radial-gradient(at right center in xyz, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz at right center, red, blue)' assert_true: 'radial-gradient(in xyz at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in xyz, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in xyz, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in xyz, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in xyz 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in xyz, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in xyz, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in xyz ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in xyz, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in xyz, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in xyz at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz-d50, red, blue)' assert_true: 'radial-gradient(in xyz-d50, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in xyz-d50, red, blue)' assert_true: 'radial-gradient(50px in xyz-d50, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz-d50 50px, red, blue)' assert_true: 'radial-gradient(in xyz-d50 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in xyz-d50, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in xyz-d50, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz-d50 ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in xyz-d50 ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in xyz-d50, red, blue)' assert_true: 'radial-gradient(at right center in xyz-d50, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz-d50 at right center, red, blue)' assert_true: 'radial-gradient(in xyz-d50 at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz-d50, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in xyz-d50, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in xyz-d50, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in xyz-d50, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz-d50 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in xyz-d50 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in xyz-d50, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in xyz-d50, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz-d50 ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in xyz-d50 ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in xyz-d50, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in xyz-d50, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz-d50 at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in xyz-d50 at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz-d65, red, blue)' assert_true: 'radial-gradient(in xyz-d65, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in xyz-d65, red, blue)' assert_true: 'radial-gradient(50px in xyz-d65, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz-d65 50px, red, blue)' assert_true: 'radial-gradient(in xyz-d65 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in xyz-d65, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in xyz-d65, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz-d65 ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in xyz-d65 ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in xyz-d65, red, blue)' assert_true: 'radial-gradient(at right center in xyz-d65, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz-d65 at right center, red, blue)' assert_true: 'radial-gradient(in xyz-d65 at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz-d65, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in xyz-d65, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in xyz-d65, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in xyz-d65, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz-d65 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in xyz-d65 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in xyz-d65, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in xyz-d65, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz-d65 ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in xyz-d65 ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in xyz-d65, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in xyz-d65, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in xyz-d65 at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in xyz-d65 at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl, red, blue)' assert_true: 'radial-gradient(in hsl, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hsl, red, blue)' assert_true: 'radial-gradient(50px in hsl, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl 50px, red, blue)' assert_true: 'radial-gradient(in hsl 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hsl, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hsl, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in hsl ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hsl, red, blue)' assert_true: 'radial-gradient(at right center in hsl, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl at right center, red, blue)' assert_true: 'radial-gradient(in hsl at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hsl, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in hsl, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hsl, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hsl, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hsl, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in hsl, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl shorter hue, red, blue)' assert_true: 'radial-gradient(in hsl shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hsl shorter hue, red, blue)' assert_true: 'radial-gradient(50px in hsl shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl shorter hue 50px, red, blue)' assert_true: 'radial-gradient(in hsl shorter hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hsl shorter hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hsl shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl shorter hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in hsl shorter hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hsl shorter hue, red, blue)' assert_true: 'radial-gradient(at right center in hsl shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl shorter hue at right center, red, blue)' assert_true: 'radial-gradient(in hsl shorter hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl shorter hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hsl shorter hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in hsl shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl shorter hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl shorter hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hsl shorter hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hsl shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl shorter hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl shorter hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hsl shorter hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in hsl shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl shorter hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl shorter hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl longer hue, red, blue)' assert_true: 'radial-gradient(in hsl longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hsl longer hue, red, blue)' assert_true: 'radial-gradient(50px in hsl longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl longer hue 50px, red, blue)' assert_true: 'radial-gradient(in hsl longer hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hsl longer hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hsl longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl longer hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in hsl longer hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hsl longer hue, red, blue)' assert_true: 'radial-gradient(at right center in hsl longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl longer hue at right center, red, blue)' assert_true: 'radial-gradient(in hsl longer hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl longer hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hsl longer hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in hsl longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl longer hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl longer hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hsl longer hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hsl longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl longer hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl longer hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hsl longer hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in hsl longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl longer hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl longer hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl increasing hue, red, blue)' assert_true: 'radial-gradient(in hsl increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hsl increasing hue, red, blue)' assert_true: 'radial-gradient(50px in hsl increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl increasing hue 50px, red, blue)' assert_true: 'radial-gradient(in hsl increasing hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hsl increasing hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hsl increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl increasing hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in hsl increasing hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hsl increasing hue, red, blue)' assert_true: 'radial-gradient(at right center in hsl increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl increasing hue at right center, red, blue)' assert_true: 'radial-gradient(in hsl increasing hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl increasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hsl increasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in hsl increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl increasing hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl increasing hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hsl increasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hsl increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl increasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl increasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hsl increasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in hsl increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl increasing hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl increasing hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl decreasing hue, red, blue)' assert_true: 'radial-gradient(in hsl decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hsl decreasing hue, red, blue)' assert_true: 'radial-gradient(50px in hsl decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl decreasing hue 50px, red, blue)' assert_true: 'radial-gradient(in hsl decreasing hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hsl decreasing hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hsl decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl decreasing hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in hsl decreasing hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hsl decreasing hue, red, blue)' assert_true: 'radial-gradient(at right center in hsl decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl decreasing hue at right center, red, blue)' assert_true: 'radial-gradient(in hsl decreasing hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hsl decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in hsl decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl decreasing hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl decreasing hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hsl decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hsl decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl decreasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl decreasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hsl decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in hsl decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl decreasing hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl decreasing hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl specified hue, red, blue)' assert_true: 'radial-gradient(in hsl specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hsl specified hue, red, blue)' assert_true: 'radial-gradient(50px in hsl specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl specified hue 50px, red, blue)' assert_true: 'radial-gradient(in hsl specified hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hsl specified hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hsl specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl specified hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in hsl specified hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hsl specified hue, red, blue)' assert_true: 'radial-gradient(at right center in hsl specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl specified hue at right center, red, blue)' assert_true: 'radial-gradient(in hsl specified hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl specified hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hsl specified hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in hsl specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl specified hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl specified hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hsl specified hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hsl specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl specified hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl specified hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hsl specified hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in hsl specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hsl specified hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hsl specified hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb, red, blue)' assert_true: 'radial-gradient(in hwb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hwb, red, blue)' assert_true: 'radial-gradient(50px in hwb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb 50px, red, blue)' assert_true: 'radial-gradient(in hwb 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hwb, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hwb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in hwb ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hwb, red, blue)' assert_true: 'radial-gradient(at right center in hwb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb at right center, red, blue)' assert_true: 'radial-gradient(in hwb at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hwb, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in hwb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hwb, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hwb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hwb, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in hwb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb shorter hue, red, blue)' assert_true: 'radial-gradient(in hwb shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hwb shorter hue, red, blue)' assert_true: 'radial-gradient(50px in hwb shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb shorter hue 50px, red, blue)' assert_true: 'radial-gradient(in hwb shorter hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hwb shorter hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hwb shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb shorter hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in hwb shorter hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hwb shorter hue, red, blue)' assert_true: 'radial-gradient(at right center in hwb shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb shorter hue at right center, red, blue)' assert_true: 'radial-gradient(in hwb shorter hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb shorter hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hwb shorter hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in hwb shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb shorter hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb shorter hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hwb shorter hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hwb shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb shorter hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb shorter hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hwb shorter hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in hwb shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb shorter hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb shorter hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb longer hue, red, blue)' assert_true: 'radial-gradient(in hwb longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hwb longer hue, red, blue)' assert_true: 'radial-gradient(50px in hwb longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb longer hue 50px, red, blue)' assert_true: 'radial-gradient(in hwb longer hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hwb longer hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hwb longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb longer hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in hwb longer hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hwb longer hue, red, blue)' assert_true: 'radial-gradient(at right center in hwb longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb longer hue at right center, red, blue)' assert_true: 'radial-gradient(in hwb longer hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb longer hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hwb longer hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in hwb longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb longer hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb longer hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hwb longer hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hwb longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb longer hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb longer hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hwb longer hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in hwb longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb longer hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb longer hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb increasing hue, red, blue)' assert_true: 'radial-gradient(in hwb increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hwb increasing hue, red, blue)' assert_true: 'radial-gradient(50px in hwb increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb increasing hue 50px, red, blue)' assert_true: 'radial-gradient(in hwb increasing hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hwb increasing hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hwb increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb increasing hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in hwb increasing hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hwb increasing hue, red, blue)' assert_true: 'radial-gradient(at right center in hwb increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb increasing hue at right center, red, blue)' assert_true: 'radial-gradient(in hwb increasing hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb increasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hwb increasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in hwb increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb increasing hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb increasing hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hwb increasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hwb increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb increasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb increasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hwb increasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in hwb increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb increasing hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb increasing hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb decreasing hue, red, blue)' assert_true: 'radial-gradient(in hwb decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hwb decreasing hue, red, blue)' assert_true: 'radial-gradient(50px in hwb decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb decreasing hue 50px, red, blue)' assert_true: 'radial-gradient(in hwb decreasing hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hwb decreasing hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hwb decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb decreasing hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in hwb decreasing hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hwb decreasing hue, red, blue)' assert_true: 'radial-gradient(at right center in hwb decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb decreasing hue at right center, red, blue)' assert_true: 'radial-gradient(in hwb decreasing hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hwb decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in hwb decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb decreasing hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb decreasing hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hwb decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hwb decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb decreasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb decreasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hwb decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in hwb decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb decreasing hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb decreasing hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb specified hue, red, blue)' assert_true: 'radial-gradient(in hwb specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hwb specified hue, red, blue)' assert_true: 'radial-gradient(50px in hwb specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb specified hue 50px, red, blue)' assert_true: 'radial-gradient(in hwb specified hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hwb specified hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hwb specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb specified hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in hwb specified hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hwb specified hue, red, blue)' assert_true: 'radial-gradient(at right center in hwb specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb specified hue at right center, red, blue)' assert_true: 'radial-gradient(in hwb specified hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb specified hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in hwb specified hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in hwb specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb specified hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb specified hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in hwb specified hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in hwb specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb specified hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb specified hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in hwb specified hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in hwb specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in hwb specified hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in hwb specified hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch, red, blue)' assert_true: 'radial-gradient(in lch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in lch, red, blue)' assert_true: 'radial-gradient(50px in lch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch 50px, red, blue)' assert_true: 'radial-gradient(in lch 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in lch, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in lch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in lch ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in lch, red, blue)' assert_true: 'radial-gradient(at right center in lch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch at right center, red, blue)' assert_true: 'radial-gradient(in lch at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in lch, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in lch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in lch, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in lch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in lch, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in lch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch shorter hue, red, blue)' assert_true: 'radial-gradient(in lch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in lch shorter hue, red, blue)' assert_true: 'radial-gradient(50px in lch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch shorter hue 50px, red, blue)' assert_true: 'radial-gradient(in lch shorter hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in lch shorter hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in lch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch shorter hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in lch shorter hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in lch shorter hue, red, blue)' assert_true: 'radial-gradient(at right center in lch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch shorter hue at right center, red, blue)' assert_true: 'radial-gradient(in lch shorter hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in lch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in lch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch shorter hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch shorter hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in lch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in lch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch shorter hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch shorter hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in lch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in lch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch shorter hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch shorter hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch longer hue, red, blue)' assert_true: 'radial-gradient(in lch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in lch longer hue, red, blue)' assert_true: 'radial-gradient(50px in lch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch longer hue 50px, red, blue)' assert_true: 'radial-gradient(in lch longer hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in lch longer hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in lch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch longer hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in lch longer hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in lch longer hue, red, blue)' assert_true: 'radial-gradient(at right center in lch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch longer hue at right center, red, blue)' assert_true: 'radial-gradient(in lch longer hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch longer hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in lch longer hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in lch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch longer hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch longer hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in lch longer hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in lch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch longer hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch longer hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in lch longer hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in lch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch longer hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch longer hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch increasing hue, red, blue)' assert_true: 'radial-gradient(in lch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in lch increasing hue, red, blue)' assert_true: 'radial-gradient(50px in lch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch increasing hue 50px, red, blue)' assert_true: 'radial-gradient(in lch increasing hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in lch increasing hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in lch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch increasing hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in lch increasing hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in lch increasing hue, red, blue)' assert_true: 'radial-gradient(at right center in lch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch increasing hue at right center, red, blue)' assert_true: 'radial-gradient(in lch increasing hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in lch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in lch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch increasing hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch increasing hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in lch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in lch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch increasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch increasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in lch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in lch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch increasing hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch increasing hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch decreasing hue, red, blue)' assert_true: 'radial-gradient(in lch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in lch decreasing hue, red, blue)' assert_true: 'radial-gradient(50px in lch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch decreasing hue 50px, red, blue)' assert_true: 'radial-gradient(in lch decreasing hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in lch decreasing hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in lch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch decreasing hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in lch decreasing hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in lch decreasing hue, red, blue)' assert_true: 'radial-gradient(at right center in lch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch decreasing hue at right center, red, blue)' assert_true: 'radial-gradient(in lch decreasing hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in lch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in lch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch decreasing hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch decreasing hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in lch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in lch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch decreasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch decreasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in lch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in lch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch decreasing hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch decreasing hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch specified hue, red, blue)' assert_true: 'radial-gradient(in lch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in lch specified hue, red, blue)' assert_true: 'radial-gradient(50px in lch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch specified hue 50px, red, blue)' assert_true: 'radial-gradient(in lch specified hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in lch specified hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in lch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch specified hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in lch specified hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in lch specified hue, red, blue)' assert_true: 'radial-gradient(at right center in lch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch specified hue at right center, red, blue)' assert_true: 'radial-gradient(in lch specified hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch specified hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in lch specified hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in lch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch specified hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch specified hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in lch specified hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in lch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch specified hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch specified hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in lch specified hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in lch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in lch specified hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in lch specified hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch, red, blue)' assert_true: 'radial-gradient(in oklch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in oklch, red, blue)' assert_true: 'radial-gradient(50px in oklch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch 50px, red, blue)' assert_true: 'radial-gradient(in oklch 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in oklch, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in oklch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in oklch ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in oklch, red, blue)' assert_true: 'radial-gradient(at right center in oklch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch at right center, red, blue)' assert_true: 'radial-gradient(in oklch at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in oklch, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in oklch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in oklch, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in oklch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in oklch, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in oklch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch shorter hue, red, blue)' assert_true: 'radial-gradient(in oklch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in oklch shorter hue, red, blue)' assert_true: 'radial-gradient(50px in oklch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch shorter hue 50px, red, blue)' assert_true: 'radial-gradient(in oklch shorter hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in oklch shorter hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in oklch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch shorter hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in oklch shorter hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in oklch shorter hue, red, blue)' assert_true: 'radial-gradient(at right center in oklch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch shorter hue at right center, red, blue)' assert_true: 'radial-gradient(in oklch shorter hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in oklch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in oklch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch shorter hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch shorter hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in oklch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in oklch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch shorter hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch shorter hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in oklch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in oklch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch shorter hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch shorter hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch longer hue, red, blue)' assert_true: 'radial-gradient(in oklch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in oklch longer hue, red, blue)' assert_true: 'radial-gradient(50px in oklch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch longer hue 50px, red, blue)' assert_true: 'radial-gradient(in oklch longer hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in oklch longer hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in oklch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch longer hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in oklch longer hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in oklch longer hue, red, blue)' assert_true: 'radial-gradient(at right center in oklch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch longer hue at right center, red, blue)' assert_true: 'radial-gradient(in oklch longer hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch longer hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in oklch longer hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in oklch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch longer hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch longer hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in oklch longer hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in oklch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch longer hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch longer hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in oklch longer hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in oklch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch longer hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch longer hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch increasing hue, red, blue)' assert_true: 'radial-gradient(in oklch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in oklch increasing hue, red, blue)' assert_true: 'radial-gradient(50px in oklch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch increasing hue 50px, red, blue)' assert_true: 'radial-gradient(in oklch increasing hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in oklch increasing hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in oklch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch increasing hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in oklch increasing hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in oklch increasing hue, red, blue)' assert_true: 'radial-gradient(at right center in oklch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch increasing hue at right center, red, blue)' assert_true: 'radial-gradient(in oklch increasing hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in oklch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in oklch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch increasing hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch increasing hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in oklch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in oklch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch increasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch increasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in oklch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in oklch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch increasing hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch increasing hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch decreasing hue, red, blue)' assert_true: 'radial-gradient(in oklch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in oklch decreasing hue, red, blue)' assert_true: 'radial-gradient(50px in oklch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch decreasing hue 50px, red, blue)' assert_true: 'radial-gradient(in oklch decreasing hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in oklch decreasing hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in oklch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch decreasing hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in oklch decreasing hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in oklch decreasing hue, red, blue)' assert_true: 'radial-gradient(at right center in oklch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch decreasing hue at right center, red, blue)' assert_true: 'radial-gradient(in oklch decreasing hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in oklch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in oklch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch decreasing hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch decreasing hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in oklch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in oklch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch decreasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch decreasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in oklch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in oklch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch decreasing hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch decreasing hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch specified hue, red, blue)' assert_true: 'radial-gradient(in oklch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in oklch specified hue, red, blue)' assert_true: 'radial-gradient(50px in oklch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch specified hue 50px, red, blue)' assert_true: 'radial-gradient(in oklch specified hue 50px, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in oklch specified hue, red, blue)' assert_true: 'radial-gradient(ellipse 50% 40em in oklch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch specified hue ellipse 50% 40em, red, blue)' assert_true: 'radial-gradient(in oklch specified hue ellipse 50% 40em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in oklch specified hue, red, blue)' assert_true: 'radial-gradient(at right center in oklch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch specified hue at right center, red, blue)' assert_true: 'radial-gradient(in oklch specified hue at right center, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch specified hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(50px in oklch specified hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(50px in oklch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch specified hue 50px, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch specified hue 50px, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(ellipse 50% 40em in oklch specified hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(ellipse 50% 40em in oklch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch specified hue ellipse 50% 40em, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch specified hue ellipse 50% 40em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(at right center in oklch specified hue, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(at right center in oklch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'radial-gradient(in oklch specified hue at right center, color(srgb 1 0 0), blue)' assert_true: 'radial-gradient(in oklch specified hue at right center, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+PASS Property background-image value 'conic-gradient(from 30deg, red, blue)'
+PASS Property background-image value 'conic-gradient(at left 10px top 50em, red, blue)'
+FAIL Property background-image value 'conic-gradient(from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lab, red, blue)' assert_true: 'conic-gradient(in lab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in lab, red, blue)' assert_true: 'conic-gradient(from 30deg in lab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lab from 30deg, red, blue)' assert_true: 'conic-gradient(in lab from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in lab, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in lab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lab at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in lab at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lab, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in lab, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in lab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lab from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lab from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in lab, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in lab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lab at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lab at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklab, red, blue)' assert_true: 'conic-gradient(in oklab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in oklab, red, blue)' assert_true: 'conic-gradient(from 30deg in oklab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklab from 30deg, red, blue)' assert_true: 'conic-gradient(in oklab from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in oklab, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in oklab, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklab at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in oklab at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklab, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in oklab, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in oklab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklab from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklab from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in oklab, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in oklab, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklab at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklab at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in srgb, red, blue)' assert_true: 'conic-gradient(in srgb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in srgb, red, blue)' assert_true: 'conic-gradient(from 30deg in srgb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in srgb from 30deg, red, blue)' assert_true: 'conic-gradient(in srgb from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in srgb, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in srgb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in srgb at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in srgb at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in srgb, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in srgb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in srgb, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in srgb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in srgb from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in srgb from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in srgb, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in srgb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in srgb at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in srgb at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in srgb-linear, red, blue)' assert_true: 'conic-gradient(in srgb-linear, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in srgb-linear, red, blue)' assert_true: 'conic-gradient(from 30deg in srgb-linear, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in srgb-linear from 30deg, red, blue)' assert_true: 'conic-gradient(in srgb-linear from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in srgb-linear, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in srgb-linear, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in srgb-linear at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in srgb-linear at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in srgb-linear, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in srgb-linear, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in srgb-linear, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in srgb-linear, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in srgb-linear from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in srgb-linear from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in srgb-linear, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in srgb-linear, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in srgb-linear at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in srgb-linear at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in xyz, red, blue)' assert_true: 'conic-gradient(in xyz, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in xyz, red, blue)' assert_true: 'conic-gradient(from 30deg in xyz, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in xyz from 30deg, red, blue)' assert_true: 'conic-gradient(in xyz from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in xyz, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in xyz, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in xyz at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in xyz at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in xyz, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in xyz, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in xyz, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in xyz, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in xyz from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in xyz from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in xyz, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in xyz, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in xyz at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in xyz at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in xyz-d50, red, blue)' assert_true: 'conic-gradient(in xyz-d50, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in xyz-d50, red, blue)' assert_true: 'conic-gradient(from 30deg in xyz-d50, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in xyz-d50 from 30deg, red, blue)' assert_true: 'conic-gradient(in xyz-d50 from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in xyz-d50, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in xyz-d50, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in xyz-d50 at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in xyz-d50 at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in xyz-d50, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in xyz-d50, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in xyz-d50, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in xyz-d50, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in xyz-d50 from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in xyz-d50 from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in xyz-d50, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in xyz-d50, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in xyz-d50 at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in xyz-d50 at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in xyz-d65, red, blue)' assert_true: 'conic-gradient(in xyz-d65, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in xyz-d65, red, blue)' assert_true: 'conic-gradient(from 30deg in xyz-d65, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in xyz-d65 from 30deg, red, blue)' assert_true: 'conic-gradient(in xyz-d65 from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in xyz-d65, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in xyz-d65, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in xyz-d65 at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in xyz-d65 at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in xyz-d65, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in xyz-d65, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in xyz-d65, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in xyz-d65, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in xyz-d65 from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in xyz-d65 from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in xyz-d65, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in xyz-d65, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in xyz-d65 at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in xyz-d65 at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl, red, blue)' assert_true: 'conic-gradient(in hsl, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hsl, red, blue)' assert_true: 'conic-gradient(from 30deg in hsl, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl from 30deg, red, blue)' assert_true: 'conic-gradient(in hsl from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hsl, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in hsl, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in hsl at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hsl, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hsl, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in hsl, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hsl from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hsl, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in hsl, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hsl at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl shorter hue, red, blue)' assert_true: 'conic-gradient(in hsl shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hsl shorter hue, red, blue)' assert_true: 'conic-gradient(from 30deg in hsl shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl shorter hue from 30deg, red, blue)' assert_true: 'conic-gradient(in hsl shorter hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hsl shorter hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in hsl shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl shorter hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in hsl shorter hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl shorter hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hsl shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hsl shorter hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in hsl shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl shorter hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hsl shorter hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hsl shorter hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in hsl shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl shorter hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hsl shorter hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl longer hue, red, blue)' assert_true: 'conic-gradient(in hsl longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hsl longer hue, red, blue)' assert_true: 'conic-gradient(from 30deg in hsl longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl longer hue from 30deg, red, blue)' assert_true: 'conic-gradient(in hsl longer hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hsl longer hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in hsl longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl longer hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in hsl longer hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl longer hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hsl longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hsl longer hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in hsl longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl longer hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hsl longer hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hsl longer hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in hsl longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl longer hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hsl longer hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl increasing hue, red, blue)' assert_true: 'conic-gradient(in hsl increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hsl increasing hue, red, blue)' assert_true: 'conic-gradient(from 30deg in hsl increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl increasing hue from 30deg, red, blue)' assert_true: 'conic-gradient(in hsl increasing hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hsl increasing hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in hsl increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl increasing hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in hsl increasing hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl increasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hsl increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hsl increasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in hsl increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl increasing hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hsl increasing hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hsl increasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in hsl increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl increasing hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hsl increasing hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl decreasing hue, red, blue)' assert_true: 'conic-gradient(in hsl decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hsl decreasing hue, red, blue)' assert_true: 'conic-gradient(from 30deg in hsl decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl decreasing hue from 30deg, red, blue)' assert_true: 'conic-gradient(in hsl decreasing hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hsl decreasing hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in hsl decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl decreasing hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in hsl decreasing hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hsl decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hsl decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in hsl decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl decreasing hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hsl decreasing hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hsl decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in hsl decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl decreasing hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hsl decreasing hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl specified hue, red, blue)' assert_true: 'conic-gradient(in hsl specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hsl specified hue, red, blue)' assert_true: 'conic-gradient(from 30deg in hsl specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl specified hue from 30deg, red, blue)' assert_true: 'conic-gradient(in hsl specified hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hsl specified hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in hsl specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl specified hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in hsl specified hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl specified hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hsl specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hsl specified hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in hsl specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl specified hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hsl specified hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hsl specified hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in hsl specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hsl specified hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hsl specified hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb, red, blue)' assert_true: 'conic-gradient(in hwb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hwb, red, blue)' assert_true: 'conic-gradient(from 30deg in hwb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb from 30deg, red, blue)' assert_true: 'conic-gradient(in hwb from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hwb, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in hwb, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in hwb at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hwb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hwb, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in hwb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hwb from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hwb, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in hwb, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hwb at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb shorter hue, red, blue)' assert_true: 'conic-gradient(in hwb shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hwb shorter hue, red, blue)' assert_true: 'conic-gradient(from 30deg in hwb shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb shorter hue from 30deg, red, blue)' assert_true: 'conic-gradient(in hwb shorter hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hwb shorter hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in hwb shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb shorter hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in hwb shorter hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb shorter hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hwb shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hwb shorter hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in hwb shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb shorter hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hwb shorter hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hwb shorter hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in hwb shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb shorter hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hwb shorter hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb longer hue, red, blue)' assert_true: 'conic-gradient(in hwb longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hwb longer hue, red, blue)' assert_true: 'conic-gradient(from 30deg in hwb longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb longer hue from 30deg, red, blue)' assert_true: 'conic-gradient(in hwb longer hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hwb longer hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in hwb longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb longer hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in hwb longer hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb longer hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hwb longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hwb longer hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in hwb longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb longer hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hwb longer hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hwb longer hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in hwb longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb longer hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hwb longer hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb increasing hue, red, blue)' assert_true: 'conic-gradient(in hwb increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hwb increasing hue, red, blue)' assert_true: 'conic-gradient(from 30deg in hwb increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb increasing hue from 30deg, red, blue)' assert_true: 'conic-gradient(in hwb increasing hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hwb increasing hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in hwb increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb increasing hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in hwb increasing hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb increasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hwb increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hwb increasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in hwb increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb increasing hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hwb increasing hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hwb increasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in hwb increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb increasing hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hwb increasing hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb decreasing hue, red, blue)' assert_true: 'conic-gradient(in hwb decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hwb decreasing hue, red, blue)' assert_true: 'conic-gradient(from 30deg in hwb decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb decreasing hue from 30deg, red, blue)' assert_true: 'conic-gradient(in hwb decreasing hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hwb decreasing hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in hwb decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb decreasing hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in hwb decreasing hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hwb decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hwb decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in hwb decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb decreasing hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hwb decreasing hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hwb decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in hwb decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb decreasing hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hwb decreasing hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb specified hue, red, blue)' assert_true: 'conic-gradient(in hwb specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hwb specified hue, red, blue)' assert_true: 'conic-gradient(from 30deg in hwb specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb specified hue from 30deg, red, blue)' assert_true: 'conic-gradient(in hwb specified hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hwb specified hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in hwb specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb specified hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in hwb specified hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb specified hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hwb specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in hwb specified hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in hwb specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb specified hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hwb specified hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in hwb specified hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in hwb specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in hwb specified hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in hwb specified hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch, red, blue)' assert_true: 'conic-gradient(in lch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in lch, red, blue)' assert_true: 'conic-gradient(from 30deg in lch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch from 30deg, red, blue)' assert_true: 'conic-gradient(in lch from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in lch, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in lch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in lch at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in lch, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in lch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lch from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in lch, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in lch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lch at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch shorter hue, red, blue)' assert_true: 'conic-gradient(in lch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in lch shorter hue, red, blue)' assert_true: 'conic-gradient(from 30deg in lch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch shorter hue from 30deg, red, blue)' assert_true: 'conic-gradient(in lch shorter hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in lch shorter hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in lch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch shorter hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in lch shorter hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in lch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in lch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch shorter hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lch shorter hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in lch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in lch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch shorter hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lch shorter hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch longer hue, red, blue)' assert_true: 'conic-gradient(in lch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in lch longer hue, red, blue)' assert_true: 'conic-gradient(from 30deg in lch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch longer hue from 30deg, red, blue)' assert_true: 'conic-gradient(in lch longer hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in lch longer hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in lch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch longer hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in lch longer hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch longer hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in lch longer hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in lch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch longer hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lch longer hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in lch longer hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in lch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch longer hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lch longer hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch increasing hue, red, blue)' assert_true: 'conic-gradient(in lch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in lch increasing hue, red, blue)' assert_true: 'conic-gradient(from 30deg in lch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch increasing hue from 30deg, red, blue)' assert_true: 'conic-gradient(in lch increasing hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in lch increasing hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in lch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch increasing hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in lch increasing hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in lch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in lch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch increasing hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lch increasing hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in lch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in lch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch increasing hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lch increasing hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch decreasing hue, red, blue)' assert_true: 'conic-gradient(in lch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in lch decreasing hue, red, blue)' assert_true: 'conic-gradient(from 30deg in lch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch decreasing hue from 30deg, red, blue)' assert_true: 'conic-gradient(in lch decreasing hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in lch decreasing hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in lch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch decreasing hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in lch decreasing hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in lch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in lch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch decreasing hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lch decreasing hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in lch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in lch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch decreasing hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lch decreasing hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch specified hue, red, blue)' assert_true: 'conic-gradient(in lch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in lch specified hue, red, blue)' assert_true: 'conic-gradient(from 30deg in lch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch specified hue from 30deg, red, blue)' assert_true: 'conic-gradient(in lch specified hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in lch specified hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in lch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch specified hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in lch specified hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch specified hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in lch specified hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in lch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch specified hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lch specified hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in lch specified hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in lch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in lch specified hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in lch specified hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch, red, blue)' assert_true: 'conic-gradient(in oklch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in oklch, red, blue)' assert_true: 'conic-gradient(from 30deg in oklch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch from 30deg, red, blue)' assert_true: 'conic-gradient(in oklch from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in oklch, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in oklch, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in oklch at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in oklch, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in oklch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklch from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in oklch, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in oklch, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklch at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch shorter hue, red, blue)' assert_true: 'conic-gradient(in oklch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in oklch shorter hue, red, blue)' assert_true: 'conic-gradient(from 30deg in oklch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch shorter hue from 30deg, red, blue)' assert_true: 'conic-gradient(in oklch shorter hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in oklch shorter hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in oklch shorter hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch shorter hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in oklch shorter hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in oklch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in oklch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch shorter hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklch shorter hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in oklch shorter hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in oklch shorter hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch shorter hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklch shorter hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch longer hue, red, blue)' assert_true: 'conic-gradient(in oklch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in oklch longer hue, red, blue)' assert_true: 'conic-gradient(from 30deg in oklch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch longer hue from 30deg, red, blue)' assert_true: 'conic-gradient(in oklch longer hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in oklch longer hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in oklch longer hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch longer hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in oklch longer hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch longer hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in oklch longer hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in oklch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch longer hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklch longer hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in oklch longer hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in oklch longer hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch longer hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklch longer hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch increasing hue, red, blue)' assert_true: 'conic-gradient(in oklch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in oklch increasing hue, red, blue)' assert_true: 'conic-gradient(from 30deg in oklch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch increasing hue from 30deg, red, blue)' assert_true: 'conic-gradient(in oklch increasing hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in oklch increasing hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in oklch increasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch increasing hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in oklch increasing hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in oklch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in oklch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch increasing hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklch increasing hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in oklch increasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in oklch increasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch increasing hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklch increasing hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch decreasing hue, red, blue)' assert_true: 'conic-gradient(in oklch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in oklch decreasing hue, red, blue)' assert_true: 'conic-gradient(from 30deg in oklch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch decreasing hue from 30deg, red, blue)' assert_true: 'conic-gradient(in oklch decreasing hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in oklch decreasing hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in oklch decreasing hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch decreasing hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in oklch decreasing hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in oklch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in oklch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch decreasing hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklch decreasing hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in oklch decreasing hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in oklch decreasing hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch decreasing hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklch decreasing hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch specified hue, red, blue)' assert_true: 'conic-gradient(in oklch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in oklch specified hue, red, blue)' assert_true: 'conic-gradient(from 30deg in oklch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch specified hue from 30deg, red, blue)' assert_true: 'conic-gradient(in oklch specified hue from 30deg, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in oklch specified hue, red, blue)' assert_true: 'conic-gradient(at left 10px top 50em in oklch specified hue, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch specified hue at left 10px top 50em, red, blue)' assert_true: 'conic-gradient(in oklch specified hue at left 10px top 50em, red, blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch specified hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(from 30deg in oklch specified hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(from 30deg in oklch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch specified hue from 30deg, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklch specified hue from 30deg, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(at left 10px top 50em in oklch specified hue, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(at left 10px top 50em in oklch specified hue, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+FAIL Property background-image value 'conic-gradient(in oklch specified hue at left 10px top 50em, color(srgb 1 0 0), blue)' assert_true: 'conic-gradient(in oklch specified hue at left 10px top 50em, color(srgb 1 0 0), blue)' is a supported value for background-image. expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-images/parsing/gradient-interpolation-method-valid-expected.txt b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-images/parsing/gradient-interpolation-method-valid-expected.txt
new file mode 100644
index 0000000..301cb98c
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-images/parsing/gradient-interpolation-method-valid-expected.txt
@@ -0,0 +1,1072 @@
+This is a testharness.js-based test.
+Found 1068 tests; 7 PASS, 1061 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS e.style['background-image'] = "linear-gradient(30deg, red, blue)" should set the property value
+PASS e.style['background-image'] = "linear-gradient(to right bottom, red, blue)" should set the property value
+FAIL e.style['background-image'] = "linear-gradient(30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in lab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lab 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in lab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lab to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in lab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lab 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in lab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lab to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in oklab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklab 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in oklab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklab to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in oklab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklab 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in oklab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklab to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in srgb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in srgb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in srgb 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in srgb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in srgb to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in srgb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in srgb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in srgb 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in srgb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in srgb to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in srgb-linear, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in srgb-linear, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in srgb-linear 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in srgb-linear, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in srgb-linear to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in srgb-linear, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in srgb-linear, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in srgb-linear 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in srgb-linear, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in srgb-linear to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in xyz, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in xyz, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in xyz 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in xyz, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in xyz to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in xyz, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in xyz, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in xyz 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in xyz, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in xyz to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in xyz-d50, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in xyz-d50, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in xyz-d50 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in xyz-d50, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in xyz-d50 to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in xyz-d50, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in xyz-d50, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in xyz-d50 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in xyz-d50, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in xyz-d50 to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in xyz-d65, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in xyz-d65, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in xyz-d65 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in xyz-d65, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in xyz-d65 to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in xyz-d65, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in xyz-d65, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in xyz-d65 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in xyz-d65, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in xyz-d65 to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hsl, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hsl, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hsl, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hsl, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hsl shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl shorter hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hsl shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl shorter hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hsl shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl shorter hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hsl shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl shorter hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hsl longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl longer hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hsl longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl longer hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hsl longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl longer hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hsl longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl longer hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hsl increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl increasing hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hsl increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl increasing hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hsl increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl increasing hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hsl increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl increasing hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hsl decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl decreasing hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hsl decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl decreasing hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hsl decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl decreasing hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hsl decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl decreasing hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hsl specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl specified hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hsl specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl specified hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hsl specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl specified hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hsl specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hsl specified hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hwb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hwb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hwb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hwb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hwb shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb shorter hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hwb shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb shorter hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hwb shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb shorter hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hwb shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb shorter hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hwb longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb longer hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hwb longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb longer hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hwb longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb longer hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hwb longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb longer hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hwb increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb increasing hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hwb increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb increasing hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hwb increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb increasing hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hwb increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb increasing hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hwb decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb decreasing hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hwb decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb decreasing hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hwb decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb decreasing hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hwb decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb decreasing hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hwb specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb specified hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hwb specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb specified hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in hwb specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb specified hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in hwb specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in hwb specified hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in lch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in lch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in lch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in lch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in lch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch shorter hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in lch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch shorter hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in lch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch shorter hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in lch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch shorter hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in lch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch longer hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in lch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch longer hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in lch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch longer hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in lch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch longer hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in lch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch increasing hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in lch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch increasing hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in lch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch increasing hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in lch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch increasing hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in lch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch decreasing hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in lch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch decreasing hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in lch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch decreasing hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in lch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch decreasing hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in lch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch specified hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in lch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch specified hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in lch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch specified hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in lch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in lch specified hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in oklch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in oklch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in oklch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in oklch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in oklch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch shorter hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in oklch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch shorter hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in oklch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch shorter hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in oklch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch shorter hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in oklch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch longer hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in oklch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch longer hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in oklch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch longer hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in oklch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch longer hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in oklch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch increasing hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in oklch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch increasing hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in oklch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch increasing hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in oklch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch increasing hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in oklch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch decreasing hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in oklch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch decreasing hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in oklch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch decreasing hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in oklch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch decreasing hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in oklch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch specified hue 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in oklch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch specified hue to right bottom, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(30deg in oklch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch specified hue 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(to right bottom in oklch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "linear-gradient(in oklch specified hue to right bottom, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+PASS e.style['background-image'] = "radial-gradient(50px, red, blue)" should set the property value
+PASS e.style['background-image'] = "radial-gradient(ellipse 50% 40em, red, blue)" should set the property value
+PASS e.style['background-image'] = "radial-gradient(at right center, red, blue)" should set the property value
+FAIL e.style['background-image'] = "radial-gradient(50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in lab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lab 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in lab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lab ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in lab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lab at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in lab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lab 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in lab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lab ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in lab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lab at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in oklab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklab 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in oklab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklab ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in oklab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklab at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in oklab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklab 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in oklab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklab ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in oklab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklab at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in srgb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in srgb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in srgb 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in srgb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in srgb ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in srgb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in srgb at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in srgb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in srgb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in srgb 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in srgb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in srgb ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in srgb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in srgb at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in srgb-linear, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in srgb-linear, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in srgb-linear 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in srgb-linear, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in srgb-linear ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in srgb-linear, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in srgb-linear at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in srgb-linear, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in srgb-linear, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in srgb-linear 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in srgb-linear, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in srgb-linear ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in srgb-linear, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in srgb-linear at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in xyz, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in xyz, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in xyz, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in xyz, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in xyz, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in xyz, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz-d50, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in xyz-d50, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz-d50 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in xyz-d50, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz-d50 ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in xyz-d50, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz-d50 at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz-d50, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in xyz-d50, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz-d50 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in xyz-d50, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz-d50 ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in xyz-d50, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz-d50 at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz-d65, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in xyz-d65, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz-d65 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in xyz-d65, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz-d65 ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in xyz-d65, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz-d65 at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz-d65, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in xyz-d65, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz-d65 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in xyz-d65, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz-d65 ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in xyz-d65, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in xyz-d65 at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hsl, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hsl, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hsl, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hsl, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hsl, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hsl, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hsl shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl shorter hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hsl shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl shorter hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hsl shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl shorter hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hsl shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl shorter hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hsl shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl shorter hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hsl shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl shorter hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hsl longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl longer hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hsl longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl longer hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hsl longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl longer hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hsl longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl longer hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hsl longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl longer hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hsl longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl longer hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hsl increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl increasing hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hsl increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl increasing hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hsl increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl increasing hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hsl increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl increasing hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hsl increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl increasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hsl increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl increasing hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hsl decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl decreasing hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hsl decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl decreasing hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hsl decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl decreasing hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hsl decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl decreasing hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hsl decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl decreasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hsl decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl decreasing hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hsl specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl specified hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hsl specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl specified hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hsl specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl specified hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hsl specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl specified hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hsl specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl specified hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hsl specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hsl specified hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hwb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hwb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hwb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hwb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hwb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hwb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hwb shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb shorter hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hwb shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb shorter hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hwb shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb shorter hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hwb shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb shorter hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hwb shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb shorter hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hwb shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb shorter hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hwb longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb longer hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hwb longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb longer hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hwb longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb longer hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hwb longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb longer hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hwb longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb longer hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hwb longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb longer hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hwb increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb increasing hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hwb increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb increasing hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hwb increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb increasing hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hwb increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb increasing hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hwb increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb increasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hwb increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb increasing hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hwb decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb decreasing hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hwb decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb decreasing hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hwb decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb decreasing hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hwb decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb decreasing hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hwb decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb decreasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hwb decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb decreasing hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hwb specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb specified hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hwb specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb specified hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hwb specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb specified hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in hwb specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb specified hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in hwb specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb specified hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in hwb specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in hwb specified hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in lch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in lch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in lch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in lch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in lch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in lch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in lch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch shorter hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in lch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch shorter hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in lch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch shorter hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in lch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch shorter hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in lch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch shorter hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in lch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch shorter hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in lch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch longer hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in lch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch longer hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in lch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch longer hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in lch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch longer hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in lch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch longer hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in lch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch longer hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in lch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch increasing hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in lch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch increasing hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in lch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch increasing hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in lch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch increasing hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in lch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch increasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in lch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch increasing hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in lch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch decreasing hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in lch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch decreasing hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in lch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch decreasing hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in lch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch decreasing hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in lch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch decreasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in lch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch decreasing hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in lch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch specified hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in lch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch specified hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in lch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch specified hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in lch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch specified hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in lch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch specified hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in lch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in lch specified hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in oklch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in oklch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in oklch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in oklch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in oklch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in oklch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in oklch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch shorter hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in oklch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch shorter hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in oklch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch shorter hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in oklch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch shorter hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in oklch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch shorter hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in oklch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch shorter hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in oklch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch longer hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in oklch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch longer hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in oklch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch longer hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in oklch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch longer hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in oklch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch longer hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in oklch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch longer hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in oklch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch increasing hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in oklch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch increasing hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in oklch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch increasing hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in oklch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch increasing hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in oklch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch increasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in oklch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch increasing hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in oklch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch decreasing hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in oklch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch decreasing hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in oklch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch decreasing hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in oklch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch decreasing hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in oklch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch decreasing hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in oklch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch decreasing hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in oklch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch specified hue 50px, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in oklch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch specified hue ellipse 50% 40em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in oklch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch specified hue at right center, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(50px in oklch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch specified hue 50px, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(ellipse 50% 40em in oklch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch specified hue ellipse 50% 40em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(at right center in oklch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "radial-gradient(in oklch specified hue at right center, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+PASS e.style['background-image'] = "conic-gradient(from 30deg, red, blue)" should set the property value
+PASS e.style['background-image'] = "conic-gradient(at left 10px top 50em, red, blue)" should set the property value
+FAIL e.style['background-image'] = "conic-gradient(from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in lab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lab from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in lab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lab at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in lab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lab from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in lab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lab at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in oklab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklab from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in oklab, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklab at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in oklab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklab from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in oklab, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklab at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in srgb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in srgb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in srgb from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in srgb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in srgb at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in srgb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in srgb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in srgb from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in srgb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in srgb at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in srgb-linear, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in srgb-linear, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in srgb-linear from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in srgb-linear, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in srgb-linear at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in srgb-linear, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in srgb-linear, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in srgb-linear from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in srgb-linear, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in srgb-linear at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in xyz, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in xyz, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in xyz from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in xyz, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in xyz at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in xyz, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in xyz, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in xyz from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in xyz, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in xyz at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in xyz-d50, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in xyz-d50, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in xyz-d50 from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in xyz-d50, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in xyz-d50 at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in xyz-d50, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in xyz-d50, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in xyz-d50 from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in xyz-d50, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in xyz-d50 at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in xyz-d65, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in xyz-d65, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in xyz-d65 from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in xyz-d65, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in xyz-d65 at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in xyz-d65, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in xyz-d65, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in xyz-d65 from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in xyz-d65, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in xyz-d65 at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hsl, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hsl, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hsl, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hsl, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hsl shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl shorter hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hsl shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl shorter hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hsl shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl shorter hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hsl shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl shorter hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hsl longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl longer hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hsl longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl longer hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hsl longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl longer hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hsl longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl longer hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hsl increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl increasing hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hsl increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl increasing hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hsl increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl increasing hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hsl increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl increasing hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hsl decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl decreasing hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hsl decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl decreasing hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hsl decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl decreasing hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hsl decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl decreasing hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hsl specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl specified hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hsl specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl specified hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hsl specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl specified hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hsl specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hsl specified hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hwb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hwb, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hwb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hwb, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hwb shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb shorter hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hwb shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb shorter hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hwb shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb shorter hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hwb shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb shorter hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hwb longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb longer hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hwb longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb longer hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hwb longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb longer hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hwb longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb longer hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hwb increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb increasing hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hwb increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb increasing hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hwb increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb increasing hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hwb increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb increasing hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hwb decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb decreasing hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hwb decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb decreasing hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hwb decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb decreasing hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hwb decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb decreasing hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hwb specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb specified hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hwb specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb specified hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in hwb specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb specified hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in hwb specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in hwb specified hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in lch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in lch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in lch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in lch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in lch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch shorter hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in lch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch shorter hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in lch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch shorter hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in lch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch shorter hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in lch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch longer hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in lch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch longer hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in lch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch longer hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in lch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch longer hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in lch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch increasing hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in lch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch increasing hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in lch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch increasing hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in lch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch increasing hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in lch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch decreasing hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in lch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch decreasing hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in lch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch decreasing hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in lch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch decreasing hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in lch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch specified hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in lch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch specified hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in lch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch specified hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in lch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in lch specified hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in oklch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in oklch, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in oklch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in oklch, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in oklch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch shorter hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in oklch shorter hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch shorter hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in oklch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch shorter hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in oklch shorter hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch shorter hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in oklch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch longer hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in oklch longer hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch longer hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in oklch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch longer hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in oklch longer hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch longer hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in oklch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch increasing hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in oklch increasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch increasing hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in oklch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch increasing hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in oklch increasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch increasing hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in oklch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch decreasing hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in oklch decreasing hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch decreasing hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in oklch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch decreasing hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in oklch decreasing hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch decreasing hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in oklch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch specified hue from 30deg, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in oklch specified hue, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch specified hue at left 10px top 50em, red, blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(from 30deg in oklch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch specified hue from 30deg, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(at left 10px top 50em in oklch specified hue, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-image'] = "conic-gradient(in oklch specified hue at left 10px top 50em, color(srgb 1 0 0), blue)" should set the property value assert_not_equals: property should be set got disallowed value ""
+Harness: the test ran to completion.
+
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index e8c23c0..80baa5d 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -40270,27 +40270,27 @@
   <int value="3203" label="ForceLoadAtTop"/>
   <int value="3204" label="OBSOLETE_LegacyLayoutByButton"/>
   <int value="3205" label="OBSOLETE_LegacyLayoutByDeprecatedFlexBox"/>
-  <int value="3206" label="LegacyLayoutByDetailsMarker"/>
-  <int value="3207" label="LegacyLayoutByEditing"/>
+  <int value="3206" label="OBSOLETE_LegacyLayoutByDetailsMarker"/>
+  <int value="3207" label="OBSOLETE_LegacyLayoutByEditing"/>
   <int value="3208" label="OBSOLETE_LegacyLayoutByFieldSet"/>
   <int value="3209" label="OBSOLETE_LegacyLayoutByFileUploadControl"/>
   <int value="3210" label="OBSOLETE_LegacyLayoutByFlexBox"/>
-  <int value="3211" label="LegacyLayoutByFrameSet"/>
-  <int value="3212" label="LegacyLayoutByGrid"/>
+  <int value="3211" label="OBSOLETE_LegacyLayoutByFrameSet"/>
+  <int value="3212" label="OBSOLETE_LegacyLayoutByGrid"/>
   <int value="3213" label="OBSOLETE_LegacyLayoutByMenuList"/>
-  <int value="3214" label="LegacyLayoutByMultiCol"/>
-  <int value="3215" label="LegacyLayoutByPrinting"/>
+  <int value="3214" label="OBSOLETE_LegacyLayoutByMultiCol"/>
+  <int value="3215" label="OBSOLETE_LegacyLayoutByPrinting"/>
   <int value="3216" label="OBSOLETE_LegacyLayoutByRuby"/>
-  <int value="3217" label="LegacyLayoutBySVG"/>
+  <int value="3217" label="OBSOLETE_LegacyLayoutBySVG"/>
   <int value="3218" label="OBSOLETE_LegacyLayoutBySlider"/>
-  <int value="3219" label="LegacyLayoutByTable"/>
-  <int value="3220" label="LegacyLayoutByTextCombine"/>
-  <int value="3221" label="LegacyLayoutByTextControl"/>
-  <int value="3222" label="LegacyLayoutByVTTCue"/>
+  <int value="3219" label="OBSOLETE_LegacyLayoutByTable"/>
+  <int value="3220" label="OBSOLETE_LegacyLayoutByTextCombine"/>
+  <int value="3221" label="OBSOLETE_LegacyLayoutByTextControl"/>
+  <int value="3222" label="OBSOLETE_LegacyLayoutByVTTCue"/>
   <int value="3223"
       label="OBSOLETE_LegacyLayoutByWebkitBoxWithoutVerticalLineClamp"/>
   <int value="3224"
-      label="LegacyLayoutByTableFlexGridBlockInNGFragmentationContext"/>
+      label="OBSOLETE_LegacyLayoutByTableFlexGridBlockInNGFragmentationContext"/>
   <int value="3225" label="DocumentPolicyHeader"/>
   <int value="3226" label="DocumentPolicyReportOnlyHeader"/>
   <int value="3227" label="RequireDocumentPolicyHeader"/>
@@ -40515,7 +40515,7 @@
   <int value="3443" label="PluginName"/>
   <int value="3444" label="PluginFilename"/>
   <int value="3445" label="PluginDescription"/>
-  <int value="3446" label="SubresourceWebBundles"/>
+  <int value="3446" label="OBSOLETE_SubresourceWebBundles"/>
   <int value="3447" label="RTCPeerConnectionSetRemoteDescriptionPromise"/>
   <int value="3448" label="RTCPeerConnectionSetLocalDescriptionPromise"/>
   <int value="3449" label="RTCPeerConnectionCreateOfferPromise"/>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_da.xtb b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
index e5b089a..cb9f245b 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_da.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
@@ -157,6 +157,7 @@
 <translation id="2377319039870049694">Skift til listevisning</translation>
 <translation id="2377590462528165447"><ph name="NUMBER_OF_ITEMS" /> mapper er delt med Linux</translation>
 <translation id="2378075407703503998"><ph name="SELCTED_FILE_COUNT" /> filer valgt</translation>
+<translation id="2383454254762599978">Flyt til papirkurven</translation>
 <translation id="2387458720915042159">Proxy-forbindelsestype</translation>
 <translation id="2389832672041313158">Burmesisk/myanmarsk</translation>
 <translation id="2392369802118427583">Aktivér</translation>
@@ -288,6 +289,7 @@
 <translation id="3549797760399244642">Gå til drive.google.com...</translation>
 <translation id="3553048479571901246">Hvis du vil åbne filer med <ph name="APP_NAME" />, skal du først kopiere dem til mappen med Windows-filer.</translation>
 <translation id="3556731189587832921">Engelsk (USA) med internationalt computertastatur</translation>
+<translation id="3557414470514932909"><ph name="FILE_NAME" /> flyttes til papirkurven</translation>
 <translation id="3567221313191587603">Vælg en fil, og aktivér <ph name="OFFLINE_CHECKBOX_NAME" /> for at give offlineadgang til dine filer.</translation>
 <translation id="357479282490346887">Litauisk</translation>
 <translation id="3587482841069643663">Alle</translation>
@@ -339,6 +341,7 @@
 <translation id="3975895378829046965">Bangla fonetisk</translation>
 <translation id="4002066346123236978">Titel</translation>
 <translation id="4017788180641807848">Engelsk (USA) med Workman-tastatur</translation>
+<translation id="4019998208269143058">Fastgør til Genvej til foretrukne filer</translation>
 <translation id="4040753847560036377">PUK-koden er forkert</translation>
 <translation id="4057991113334098539">Aktiverer...</translation>
 <translation id="4092890906744441904">Irsk</translation>
@@ -348,6 +351,7 @@
 <translation id="4157569377477607576">Administratorpolitikken fraråder:</translation>
 <translation id="4159731583141908892"><ph name="FILE_NAME" /> blev flyttet.</translation>
 <translation id="4176286497474237543">Tøm papirkurven nu</translation>
+<translation id="4179621117429069925">Dette element er i din papirkurv</translation>
 <translation id="4186579485882418952">Aktivér offlinetilstand</translation>
 <translation id="4193154014135846272">Google-dokument</translation>
 <translation id="4197674956721858839">Valg af komprimering</translation>
@@ -377,6 +381,7 @@
 <translation id="4387004326333427325">Godkendelsescertifikatet blev afvist eksternt</translation>
 <translation id="4394214039309501350">Eksternt link</translation>
 <translation id="4394980935660306080">Tidligere i denne uge</translation>
+<translation id="4398096759193130964">Gendan elementerne, eller træk dem til en ny mappe uden for papirkurven</translation>
 <translation id="4401287888955153199">Pak alt ud</translation>
 <translation id="4410695710508688828">Udpakningshandling mislykkedes. <ph name="ERROR_MESSAGE" /></translation>
 <translation id="4418686080762064601">Opret en genvej til dine filer</translation>
@@ -432,6 +437,7 @@
 <translation id="4790766916287588578">Hindi med InScript-tastatur</translation>
 <translation id="4801956050125744859">Behold begge</translation>
 <translation id="4804827417948292437">Avocado</translation>
+<translation id="4805966553127040832"><ph name="COUNT" /> elementer gendannes</translation>
 <translation id="4823651846660089135">Enheden er skrivebeskyttet</translation>
 <translation id="4826849268470072925">Tamil ITRANS</translation>
 <translation id="4839847978919684242"><ph name="SELCTED_FILES_COUNT" /> elementer valgt</translation>
@@ -450,6 +456,7 @@
 <translation id="4935975195727477204">Blomst</translation>
 <translation id="4943368462779413526">Amerikansk fodbold</translation>
 <translation id="4961158930123534723">1 mappe blev delt med Parallels Desktop</translation>
+<translation id="496656650103537022"><ph name="FILE_NAME" /> er gendannet</translation>
 <translation id="4969785127455456148">Album</translation>
 <translation id="4973523518332075481">Brug et navn med højst <ph name="MAX_LENGTH" /> tegn</translation>
 <translation id="4973970068702235170">Komprimering mislykkedes. Der opstod en uventet fejl: <ph name="ERROR_MESSAGE" /></translation>
@@ -552,6 +559,7 @@
 <translation id="5691596662111998220"><ph name="FILE_NAME" /> eksisterer ikke længere.</translation>
 <translation id="5698411045597658393"><ph name="NETWORK_NAME" />, Lås op</translation>
 <translation id="5700087501958648444">Lydoplysninger</translation>
+<translation id="5720028165859493293"><ph name="FILE_NAME" /> er flyttet til papirkurven</translation>
 <translation id="5724172041621205163">Thai med Pattachote-tastatur</translation>
 <translation id="5756666464756035725">Ungarsk QWERTY-tastatur</translation>
 <translation id="5763377084591234761">Tysk (Schweiz)</translation>
@@ -622,6 +630,7 @@
 <translation id="6320212353742551423"><ph name="ARCHIVE_TYPE" />-arkiv</translation>
 <translation id="6321303798550928047">Vink</translation>
 <translation id="6327785803543103246">Automatisk registrering af webproxy</translation>
+<translation id="6337014272874260727">Frigør fra Genvej til foretrukne filer</translation>
 <translation id="6339145975392024142">Amerikansk internationalt (pc)</translation>
 <translation id="6346310558342052870">Begrænset adgang</translation>
 <translation id="6356685157277930264">Feedback i vinduet Filer</translation>
@@ -662,6 +671,7 @@
 <translation id="6751256176799620176">1 mappe er valgt</translation>
 <translation id="6755827872271341378">ChromeOS Flex-enhed</translation>
 <translation id="6790428901817661496">Afspil</translation>
+<translation id="6794539005637808366">Gendan elementet, eller træk det til en ny mappe uden for papirkurven</translation>
 <translation id="6795884519221689054">Panda</translation>
 <translation id="6806699711453372963">Administrer Linux-deling</translation>
 <translation id="6806796368146926706">Alfanumerisk med japansk tastatur</translation>
@@ -698,6 +708,7 @@
 <translation id="6979158407327259162">Google Drev</translation>
 <translation id="6989942356279143254">Svensk</translation>
 <translation id="6990081529015358884">Der er ikke mere plads</translation>
+<translation id="6993826899923627728">Disse elementer er i din papirkurv</translation>
 <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" /> filer er valgt</translation>
 <translation id="7008426324576352165">Din organisation skal bruge lagerplads for at gennemføre uploaden.</translation>
 <translation id="7012943028104619157"><ph name="ROOT_TITLE" /> (<ph name="ROOT_SUMMARY" />)</translation>
@@ -743,6 +754,7 @@
 <translation id="7408870451288633753">Tjekkisk</translation>
 <translation id="7417453074306512035">Etiopisk tastatur</translation>
 <translation id="7417705661718309329">Google-kort</translation>
+<translation id="7419668828140929293">"<ph name="FILENAME" />" gendannes</translation>
 <translation id="7458955835361612701">Du har ikke åbnet nogen billeder for nylig</translation>
 <translation id="7460898608667578234">ukrainsk</translation>
 <translation id="7469894403370665791">Opret automatisk forbindelse til dette netværk</translation>
@@ -771,6 +783,7 @@
 <translation id="7655441028674523381">Få nem adgang til Google Fotos</translation>
 <translation id="7658239707568436148">Annuller</translation>
 <translation id="7663224033570512922">Hindi</translation>
+<translation id="7689532716264131859"><ph name="NUMBER_OF_ITEMS" /> elementer er flyttet til papirkurven</translation>
 <translation id="7693909743393669729">Formatering af et drev sletter alle de data, der er gemt på drevet, og fjerner alle eksisterende partitioner, herunder partitioner, der muligvis ikke er synlige. Denne handling kan ikke fortrydes.</translation>
 <translation id="7695430100978772476"><ph name="DRIVE_NAME" /> kunne ikke formateres</translation>
 <translation id="76959938259365003">Papirkurven kunne ikke tømmes.</translation>
@@ -785,6 +798,7 @@
 <translation id="7760449188139285140">Kinesisk wubi</translation>
 <translation id="7765158879357617694">Flyt</translation>
 <translation id="7774365994322694683">Fugl</translation>
+<translation id="7780322752056734036"><ph name="NUMBER_OF_ITEMS" /> elementer er gendannet</translation>
 <translation id="7781829728241885113">I går</translation>
 <translation id="7788080748068240085">Hvis du vil gemme "<ph name="FILE_NAME" />" offline, skal du frigøre yderligere <ph name="TOTAL_FILE_SIZE" />:<ph name="MARKUP_1" />
     <ph name="MARKUP_2" />frigør filer, som du ikke længere har brug for offlineadgang til<ph name="MARKUP_3" />
@@ -965,6 +979,7 @@
 <translation id="947144732524271678">Valgte et interval med <ph name="ENTRY_COUNT" /> elementer fra <ph name="FROM_ENTRY_NAME" /> til <ph name="TO_ENTRY_NAME" />.</translation>
 <translation id="954194396377670556">Administratorpolitikken forhindrer:</translation>
 <translation id="965477715979482472">Engelsk (Sydafrika)</translation>
+<translation id="976666271385981812"><ph name="NUMBER_OF_ITEMS" /> elementer flyttes til papirkurven</translation>
 <translation id="981121421437150478">Offline</translation>
 <translation id="988685240266037636">Der findes allerede en fil med navnet "<ph name="FILE_NAME" />". Vil du erstatte den?</translation>
 <translation id="992401651319295351">Du har <ph name="RETRIES" /> forsøg tilbage. Du kan ikke bruge dette netværk, før du har oprettet en ny pinkode.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hy.xtb b/ui/chromeos/translations/ui_chromeos_strings_hy.xtb
index 21e4425..363db8f 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_hy.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_hy.xtb
@@ -157,6 +157,7 @@
 <translation id="2377319039870049694">Ցանկի տեսքով</translation>
 <translation id="2377590462528165447">Դուք <ph name="NUMBER_OF_ITEMS" /> պանակով կիսվեցին Լինուքսի հետ</translation>
 <translation id="2378075407703503998">Ընտրված է <ph name="SELCTED_FILE_COUNT" /> ֆայլ</translation>
+<translation id="2383454254762599978">Տեղափոխել աղբարկղ</translation>
 <translation id="2387458720915042159">Պրոքսի սերվերի միացման տեսակը</translation>
 <translation id="2389832672041313158">բիրմաներեն (Մյանմա)</translation>
 <translation id="2392369802118427583">Ակտիվացնել</translation>
@@ -288,6 +289,7 @@
 <translation id="3549797760399244642">Անցնել drive.google.com…</translation>
 <translation id="3553048479571901246"><ph name="APP_NAME" /> հավելվածի միջոցով ֆայլերը բացելու համար նախ պատճենեք դրանք Windows-ի ֆայլերի պանակ։</translation>
 <translation id="3556731189587832921">անգլերեն (ԱՄՆ)՝ միջազգային համակարգչային ստեղնաշարով</translation>
+<translation id="3557414470514932909"><ph name="FILE_NAME" /> ֆայլը տեղափոխվում է աղբարկղ</translation>
 <translation id="3567221313191587603">Ընտրեք ֆայլը և միացրեք «<ph name="OFFLINE_CHECKBOX_NAME" />» կարգավորումը՝ ձեր ֆայլն առանց ինտերնետի օգտագործելու համար։</translation>
 <translation id="357479282490346887">Լիտվական</translation>
 <translation id="3587482841069643663">Բոլորը</translation>
@@ -339,6 +341,7 @@
 <translation id="3975895378829046965">բանգլա (հնչյունային)</translation>
 <translation id="4002066346123236978">Վերնագիր</translation>
 <translation id="4017788180641807848">անգլերեն (ԱՄՆ)՝ Workman ստեղնաշարով</translation>
+<translation id="4019998208269143058">Ամրացնել ֆայլերի արագ մուտքին</translation>
 <translation id="4040753847560036377">PUK կոդը սխալ է</translation>
 <translation id="4057991113334098539">Ակտիվացվում է…</translation>
 <translation id="4092890906744441904">իռլանդերեն</translation>
@@ -348,6 +351,7 @@
 <translation id="4157569377477607576">Ադմինիստրատորը խորհուրդ չի տալիս՝</translation>
 <translation id="4159731583141908892">Տեղափոխվեց <ph name="FILE_NAME" /> տարր։</translation>
 <translation id="4176286497474237543">Դատարկել աղբարկղը</translation>
+<translation id="4179621117429069925">Այս տարրը ձեր աղբարկղում է</translation>
 <translation id="4186579485882418952">Միացնել անցանց ռեժիմը</translation>
 <translation id="4193154014135846272">Google փաստաթուղթ</translation>
 <translation id="4197674956721858839">Արխիվացնել ընտրված տարրերը</translation>
@@ -377,6 +381,7 @@
 <translation id="4387004326333427325">Իսկորոշման վկայագիրը մերժվել է հեռակա կարգով</translation>
 <translation id="4394214039309501350">Արտաքին հղում</translation>
 <translation id="4394980935660306080">Այս շաբաթվա սկզբին</translation>
+<translation id="4398096759193130964">Վերականգնեք տարրերը կամ աղբարկղից քաշեք նոր պանակ</translation>
 <translation id="4401287888955153199">Դուրս բերել բոլորը</translation>
 <translation id="4410695710508688828">Չհաջողվեց կատարել արտահանումը։ <ph name="ERROR_MESSAGE" /></translation>
 <translation id="4418686080762064601">Ստեղծեք դյուրանցում ձեր ֆայլերի համար</translation>
@@ -432,6 +437,7 @@
 <translation id="4790766916287588578">հինդի (InScript ստեղնաշար)</translation>
 <translation id="4801956050125744859">Պահպանել երկուսն էլ</translation>
 <translation id="4804827417948292437">Ավոկադո</translation>
+<translation id="4805966553127040832"><ph name="COUNT" /> տարր վերականգնվում է</translation>
 <translation id="4823651846660089135">Սարքում կարելի է միայն կարդալու գործողություններ կատարել</translation>
 <translation id="4826849268470072925">թամիլերեն (ITRANS ստեղնաշար)</translation>
 <translation id="4839847978919684242">Ընտրված է <ph name="SELCTED_FILES_COUNT" /> տարր</translation>
@@ -450,6 +456,7 @@
 <translation id="4935975195727477204">Ծաղիկ</translation>
 <translation id="4943368462779413526">Ֆուտբոլ</translation>
 <translation id="4961158930123534723">Parallels Desktop-ին հասանելի է դարձել 1 պանակ</translation>
+<translation id="496656650103537022"><ph name="FILE_NAME" /> ֆայլը վերականգնվեց</translation>
 <translation id="4969785127455456148">Ալբոմ</translation>
 <translation id="4973523518332075481">Նշեք անուն՝ առավելագույնը <ph name="MAX_LENGTH" /> նիշից</translation>
 <translation id="4973970068702235170">Չհաջողվեց արխիվացնել: Անսպասելի սխալ առաջացավ՝ <ph name="ERROR_MESSAGE" /></translation>
@@ -551,6 +558,7 @@
 <translation id="5691596662111998220"><ph name="FILE_NAME" />-ն այլևս առկա չէ:</translation>
 <translation id="5698411045597658393"><ph name="NETWORK_NAME" />, Ապակողպել</translation>
 <translation id="5700087501958648444">Տեղեկություններ աուդիո ֆայլի մասին</translation>
+<translation id="5720028165859493293"><ph name="FILE_NAME" /> ֆայլը տեղափոխվեց աղբարկղ</translation>
 <translation id="5724172041621205163">թայերեն (Pattachote ստեղնաշար)</translation>
 <translation id="5756666464756035725">Հունգարական QWERTY</translation>
 <translation id="5763377084591234761">գերմաներեն (Շվեյցարիա)</translation>
@@ -621,6 +629,7 @@
 <translation id="6320212353742551423"><ph name="ARCHIVE_TYPE" /> արխիվ</translation>
 <translation id="6321303798550928047">Ձեռքով ողջույն</translation>
 <translation id="6327785803543103246">Պրոքսի սերվերի ինքնահայտնաբերում</translation>
+<translation id="6337014272874260727">Ապամրացնել ֆայլերի արագ մուտքից</translation>
 <translation id="6339145975392024142">ԱՄՆ միջազգային (PC)</translation>
 <translation id="6346310558342052870">Սահմանափակ հասանելիություն</translation>
 <translation id="6356685157277930264">Ֆայլերի մասին տեղեկությունների պատուհան</translation>
@@ -661,6 +670,7 @@
 <translation id="6751256176799620176">Ընտրված է 1 պանակ</translation>
 <translation id="6755827872271341378">ChromeOS Flex սարք</translation>
 <translation id="6790428901817661496">Նվագարկել</translation>
+<translation id="6794539005637808366">Վերականգնեք տարրը կամ աղբարկղից քաշեք նոր պանակ</translation>
 <translation id="6795884519221689054">Պանդա</translation>
 <translation id="6806699711453372963">Կառավարել Լինուքսի օգտագործումը</translation>
 <translation id="6806796368146926706">ճապոներեն՝ տառաթվային ստեղնաշարով</translation>
@@ -697,6 +707,7 @@
 <translation id="6979158407327259162">Google Drive</translation>
 <translation id="6989942356279143254">շվեդերեն</translation>
 <translation id="6990081529015358884">Ազատ տարածք չունեք</translation>
+<translation id="6993826899923627728">Այս տարրերը ձեր աղբարկղում են</translation>
 <translation id="6998711733709403587">Ընտրված է <ph name="SELCTED_FOLDERS_COUNT" /> պանակ</translation>
 <translation id="7008426324576352165">Վերբեռնումն ավարտելու համար ձեր կազմակերպությանն ավելի շատ տարածք է հարկավոր։</translation>
 <translation id="7012943028104619157"><ph name="ROOT_TITLE" /> (<ph name="ROOT_SUMMARY" />)</translation>
@@ -742,6 +753,7 @@
 <translation id="7408870451288633753">չեխերեն</translation>
 <translation id="7417453074306512035">Եթովպերենի ստեղնաշար</translation>
 <translation id="7417705661718309329">Google քարտեզ</translation>
+<translation id="7419668828140929293"><ph name="FILENAME" /> ֆայլը վերականգնվում է</translation>
 <translation id="7458955835361612701">Վերջերս դիտված պատկերներ չկան</translation>
 <translation id="7460898608667578234">Ուկրաինական</translation>
 <translation id="7469894403370665791">Ավտոմատ միանալ այս ցանցին</translation>
@@ -770,6 +782,7 @@
 <translation id="7655441028674523381">Հեշտությամբ մտեք Google Լուսանկարներ</translation>
 <translation id="7658239707568436148">Չեղարկել</translation>
 <translation id="7663224033570512922">հինդի</translation>
+<translation id="7689532716264131859"><ph name="NUMBER_OF_ITEMS" /> տարր տեղափոխվեց աղբարկղ</translation>
 <translation id="7693909743393669729">Եթե կրիչը ֆորմատավորեք, դրա վրա պահված բոլոր տվյալներն ու բաժինները (այդ թվում՝ անտեսանելի) կջնջվեն։ Գործողությունը հնարավոր չէ հետարկել։</translation>
 <translation id="7695430100978772476">Չհաջողվեց ձևաչափել «<ph name="DRIVE_NAME" />» կրիչը</translation>
 <translation id="76959938259365003">Չհաջողվեց դատարկել աղբարկղը։</translation>
@@ -784,6 +797,7 @@
 <translation id="7760449188139285140">չինարեն (Wubi)</translation>
 <translation id="7765158879357617694">Տեղափոխել</translation>
 <translation id="7774365994322694683">Թռչուն</translation>
+<translation id="7780322752056734036"><ph name="NUMBER_OF_ITEMS" /> տարր վերականգնվեց</translation>
 <translation id="7781829728241885113">Երեկ</translation>
 <translation id="7788080748068240085">«<ph name="FILE_NAME" />» ֆայլն անցանց պահելու համար հարկավոր է <ph name="TOTAL_FILE_SIZE" /> տեղ ազատել.<ph name="MARKUP_1" />
     <ph name="MARKUP_2" />ապամրացրեք ֆայլերը, որոնք անցանց վիճակում ձեզ այլևս պետք չեն<ph name="MARKUP_3" />
@@ -964,6 +978,7 @@
 <translation id="947144732524271678">Դուք ընտրեցիք <ph name="ENTRY_COUNT" /> գրառում՝ «<ph name="FROM_ENTRY_NAME" />»-ից «<ph name="TO_ENTRY_NAME" />»:</translation>
 <translation id="954194396377670556">Արգելափակված է ադմինիստրատորի կողմից՝</translation>
 <translation id="965477715979482472">Անգլերեն (Հարավային Աֆրիկա)</translation>
+<translation id="976666271385981812"><ph name="NUMBER_OF_ITEMS" /> տարր տեղափոխվում է աղբարկղ</translation>
 <translation id="981121421437150478">Անցանց</translation>
 <translation id="988685240266037636">«<ph name="FILE_NAME" />» անունով ֆայլ արդեն գոյություն ունի: Ուզո՞ւմ եք փոխարինել այն:</translation>
 <translation id="992401651319295351">Մնաց <ph name="RETRIES" /> փորձ։ Դուք չեք կարողանա օգտագործել այս ցանցը, մինչև չսահմանեք նոր PIN կոդ։</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_th.xtb b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
index eb20046f..0b35922 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_th.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
@@ -157,6 +157,7 @@
 <translation id="2377319039870049694">เปลี่ยนเป็นมุมมองรายการ</translation>
 <translation id="2377590462528165447">แชร์กับ Linux แล้ว <ph name="NUMBER_OF_ITEMS" /> โฟลเดอร์</translation>
 <translation id="2378075407703503998">เลือก <ph name="SELCTED_FILE_COUNT" /> ไฟล์</translation>
+<translation id="2383454254762599978">ย้ายไปที่ถังขยะ</translation>
 <translation id="2387458720915042159">ประเภทการเชื่อมต่อพร็อกซี</translation>
 <translation id="2389832672041313158">พม่า/เมียนมา</translation>
 <translation id="2392369802118427583">เปิดใช้งาน</translation>
@@ -288,6 +289,7 @@
 <translation id="3549797760399244642">ไปยัง drive.google.com...</translation>
 <translation id="3553048479571901246">หากต้องการเปิดไฟล์ด้วย <ph name="APP_NAME" /> ให้คัดลอกไปที่โฟลเดอร์ไฟล์ของ Windows ก่อน</translation>
 <translation id="3556731189587832921">อังกฤษ (สหรัฐฯ) ด้วยแป้นพิมพ์พีซีแบบสากล</translation>
+<translation id="3557414470514932909">กำลังย้าย <ph name="FILE_NAME" /> ไปที่ถังขยะ</translation>
 <translation id="3567221313191587603">เลือกไฟล์แล้วเปิด <ph name="OFFLINE_CHECKBOX_NAME" /> เพื่อเข้าถึงไฟล์แบบออฟไลน์</translation>
 <translation id="357479282490346887">ลิทัวเนีย</translation>
 <translation id="3587482841069643663">ทั้งหมด</translation>
@@ -339,6 +341,7 @@
 <translation id="3975895378829046965">บังกลา (ตามการออกเสียง)</translation>
 <translation id="4002066346123236978">ชื่อ</translation>
 <translation id="4017788180641807848">อังกฤษ (สหรัฐฯ) ด้วยแป้นพิมพ์ Workman</translation>
+<translation id="4019998208269143058">ปักหมุดไว้ที่ไฟล์ด่วน</translation>
 <translation id="4040753847560036377">PUK ไม่ถูกต้อง</translation>
 <translation id="4057991113334098539">กำลังเปิดการใช้งาน...</translation>
 <translation id="4092890906744441904">ไอร์แลนด์</translation>
@@ -348,6 +351,7 @@
 <translation id="4157569377477607576">นโยบายของผู้ดูแลระบบไม่แนะนำให้ทำสิ่งต่อไปนี้</translation>
 <translation id="4159731583141908892">ย้าย <ph name="FILE_NAME" /> แล้ว</translation>
 <translation id="4176286497474237543">ล้างข้อมูลทั้งหมดในถังขยะเลย</translation>
+<translation id="4179621117429069925">รายการนี้อยู่ในถังขยะ</translation>
 <translation id="4186579485882418952">เปิดใช้แบบออฟไลน์</translation>
 <translation id="4193154014135846272">เอกสารของ Google</translation>
 <translation id="4197674956721858839">การเลือกซิป</translation>
@@ -377,6 +381,7 @@
 <translation id="4387004326333427325">ใบรับรองการตรวจสอบสิทธิ์ได้รับการปฏิเสธจากระยะไกล</translation>
 <translation id="4394214039309501350">ลิงก์ภายนอก</translation>
 <translation id="4394980935660306080">ต้นสัปดาห์นี้</translation>
+<translation id="4398096759193130964">กู้คืนรายการหรือลากไปที่โฟลเดอร์ใหม่นอกถังขยะ</translation>
 <translation id="4401287888955153199">แตกเนื้อหาทั้งหมด</translation>
 <translation id="4410695710508688828">แตกข้อมูลไม่สำเร็จ <ph name="ERROR_MESSAGE" /></translation>
 <translation id="4418686080762064601">สร้างทางลัดสำหรับไฟล์ของคุณ</translation>
@@ -432,6 +437,7 @@
 <translation id="4790766916287588578">ภาษาฮินดีด้วยแป้นพิมพ์ InScript</translation>
 <translation id="4801956050125744859">เก็บไว้ทั้งสองเวอร์ชัน</translation>
 <translation id="4804827417948292437">อะโวคาโด</translation>
+<translation id="4805966553127040832">กำลังกู้คืน <ph name="COUNT" /> รายการ</translation>
 <translation id="4823651846660089135">อุปกรณ์เป็นแบบอ่านอย่างเดียว</translation>
 <translation id="4826849268470072925">ทมิฬ (ITRANS)</translation>
 <translation id="4839847978919684242">เลือก <ph name="SELCTED_FILES_COUNT" /> รายการ</translation>
@@ -450,6 +456,7 @@
 <translation id="4935975195727477204">ดอกทานตะวัน</translation>
 <translation id="4943368462779413526">ฟุตบอล</translation>
 <translation id="4961158930123534723">แชร์กับ Parallels Desktop แล้ว 1 โฟลเดอร์</translation>
+<translation id="496656650103537022">กู้คืน <ph name="FILE_NAME" /> แล้ว</translation>
 <translation id="4969785127455456148">อัลบั้ม</translation>
 <translation id="4973523518332075481">ใช้ชื่อที่มีอักขระไม่เกิน <ph name="MAX_LENGTH" /> อักขระ</translation>
 <translation id="4973970068702235170">การซิปล้มเหลว ข้อผิดพลาดที่ไม่คาดคิด: <ph name="ERROR_MESSAGE" /></translation>
@@ -552,6 +559,7 @@
 <translation id="5691596662111998220">อ๊ะ ไม่มี <ph name="FILE_NAME" /> แล้ว</translation>
 <translation id="5698411045597658393"><ph name="NETWORK_NAME" />, ปลดล็อก</translation>
 <translation id="5700087501958648444">ข้อมูลเสียง</translation>
+<translation id="5720028165859493293">ย้าย <ph name="FILE_NAME" /> ไปที่ถังขยะแล้ว</translation>
 <translation id="5724172041621205163">ไทยด้วยแป้นพิมพ์ปัตตะโชติ</translation>
 <translation id="5756666464756035725">QWERTY ภาษาฮังการี</translation>
 <translation id="5763377084591234761">เยอรมัน (สวิตเซอร์แลนด์)</translation>
@@ -622,6 +630,7 @@
 <translation id="6320212353742551423">ที่เก็บ <ph name="ARCHIVE_TYPE" /> ถาวร</translation>
 <translation id="6321303798550928047">โบกมือ</translation>
 <translation id="6327785803543103246">การค้นหาเว็บพร็อกซีอัตโนมัติ</translation>
+<translation id="6337014272874260727">เลิกปักหมุดในไฟล์ด่วน</translation>
 <translation id="6339145975392024142">สหรัฐอเมริกาสากล (พีซี)</translation>
 <translation id="6346310558342052870">จำกัดสิทธิ์เข้าถึง</translation>
 <translation id="6356685157277930264">หน้าต่างความคิดเห็นของไฟล์</translation>
@@ -662,6 +671,7 @@
 <translation id="6751256176799620176">เลือกไว้ 1 โฟลเดอร์</translation>
 <translation id="6755827872271341378">อุปกรณ์ Chrome OS Flex</translation>
 <translation id="6790428901817661496">เล่น</translation>
+<translation id="6794539005637808366">กู้คืนรายการหรือลากไปที่โฟลเดอร์ใหม่นอกถังขยะ</translation>
 <translation id="6795884519221689054">แพนด้า</translation>
 <translation id="6806699711453372963">จัดการการแชร์ของ Linux</translation>
 <translation id="6806796368146926706">ตัวอักษรและตัวเลขด้วยแป้นพิมพ์ญี่ปุ่น</translation>
@@ -698,6 +708,7 @@
 <translation id="6979158407327259162">Google ไดรฟ์</translation>
 <translation id="6989942356279143254">สวีเดน</translation>
 <translation id="6990081529015358884">คุณไม่มีพื้นที่เหลือแล้ว</translation>
+<translation id="6993826899923627728">รายการเหล่านี้อยู่ในถังขยะ</translation>
 <translation id="6998711733709403587">เลือก <ph name="SELCTED_FOLDERS_COUNT" /> โฟลเดอร์</translation>
 <translation id="7008426324576352165">องค์กรต้องมีพื้นที่เก็บข้อมูลมากกว่านี้เพื่ออัปโหลดให้เสร็จสิ้น</translation>
 <translation id="7012943028104619157"><ph name="ROOT_TITLE" /> (<ph name="ROOT_SUMMARY" />)</translation>
@@ -743,6 +754,7 @@
 <translation id="7408870451288633753">เช็ก</translation>
 <translation id="7417453074306512035">แป้นพิมพ์ภาษาเอธิโอเปีย</translation>
 <translation id="7417705661718309329">แผนที่ Google</translation>
+<translation id="7419668828140929293">กำลังกู้คืน "<ph name="FILENAME" />"</translation>
 <translation id="7458955835361612701">ไม่มีรูปภาพล่าสุด</translation>
 <translation id="7460898608667578234">ยูเครน</translation>
 <translation id="7469894403370665791">เชื่อมต่อกับเครือข่ายนี้อัตโนมัติ</translation>
@@ -771,6 +783,7 @@
 <translation id="7655441028674523381">เข้าถึง Google Photos ได้ง่ายๆ</translation>
 <translation id="7658239707568436148">ยกเลิก</translation>
 <translation id="7663224033570512922">ฮินดี</translation>
+<translation id="7689532716264131859">ย้าย <ph name="NUMBER_OF_ITEMS" /> รายการไปที่ถังขยะแล้ว</translation>
 <translation id="7693909743393669729">การฟอร์แมตไดรฟ์จะลบข้อมูลทั้งหมดที่เก็บไว้ในไดรฟ์และลบพาร์ติชันที่มีอยู่ทั้งหมด รวมถึงพาร์ติชันที่อาจมองไม่เห็น การดำเนินการนี้เลิกทำไม่ได้</translation>
 <translation id="7695430100978772476">จัดรูปแบบ <ph name="DRIVE_NAME" /> ไม่ได้</translation>
 <translation id="76959938259365003">ล้างข้อมูลในถังขยะไม่สำเร็จ</translation>
@@ -785,6 +798,7 @@
 <translation id="7760449188139285140">จีน (Wubi)</translation>
 <translation id="7765158879357617694">ย้าย</translation>
 <translation id="7774365994322694683">นก</translation>
+<translation id="7780322752056734036">กู้คืน <ph name="NUMBER_OF_ITEMS" /> รายการแล้ว</translation>
 <translation id="7781829728241885113">เมื่อวานนี้</translation>
 <translation id="7788080748068240085">หากต้องการบันทึก "<ph name="FILE_NAME" />" เป็นแบบออฟไลน์ คุณจะต้องเพิ่มพื้นที่ว่างอีก <ph name="TOTAL_FILE_SIZE" /> โดยทำดังนี้:<ph name="MARKUP_1" />
     <ph name="MARKUP_2" />เลิกปักหมุดไฟล์ที่คุณไม่ต้องการเข้าถึงแบบออฟไลน์อีกต่อไป<ph name="MARKUP_3" />
@@ -965,6 +979,7 @@
 <translation id="947144732524271678">เลือกรายการทั้งหมด <ph name="ENTRY_COUNT" /> รายการตั้งแต่ <ph name="FROM_ENTRY_NAME" /> จนถึง <ph name="TO_ENTRY_NAME" /></translation>
 <translation id="954194396377670556">นโยบายของผู้ดูแลระบบจะป้องกันสิ่งต่อไปนี้</translation>
 <translation id="965477715979482472">อังกฤษ (แอฟริกาใต้)</translation>
+<translation id="976666271385981812">กำลังย้าย <ph name="NUMBER_OF_ITEMS" /> รายการไปที่ถังขยะ</translation>
 <translation id="981121421437150478">ออฟไลน์</translation>
 <translation id="988685240266037636">มีไฟล์ชื่อ "<ph name="FILE_NAME" />" อยู่แล้ว คุณต้องการแทนที่ไฟล์ดังกล่าวไหม</translation>
 <translation id="992401651319295351">ลองได้อีก <ph name="RETRIES" /> ครั้ง คุณจะใช้เครือข่ายนี้ไม่ได้จนกว่าจะตั้งค่า PIN ใหม่</translation>