diff --git a/DEPS b/DEPS index c0444a97..3aa9f17 100644 --- a/DEPS +++ b/DEPS
@@ -315,7 +315,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': 'b354aa4d2540f79a0b1e276f3aeb2c8b9d846036', + 'angle_revision': '17844bd46186e851e100bb6138f684dd3533b203', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -334,7 +334,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:10.20221017.1.1', + 'fuchsia_version': 'version:10.20221017.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. @@ -386,7 +386,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': 'be45b3f944601508509e6a84694683ad5f967e28', + 'devtools_frontend_revision': 'eba023f7da110e15eaabd622b7ab2b3abf92c222', # 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. @@ -422,7 +422,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': 'df3a0462ad69db351d84ab24ce23279f566f6e78', + 'dawn_revision': '29fb8f8eef24ea3c80d3c2545a07e798e7f8e199', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -842,7 +842,7 @@ }, 'src/ios/third_party/material_components_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'b09e2076adb89f84e4066f95dd5550765668b018', + 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'd8c1e9ac5c6308679079458b1c3ac799761d59ab', 'condition': 'checkout_ios', }, @@ -1002,7 +1002,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'iMCJS_4q6z9bSKJVJVw5ZR9qdI_5iZilsQytJhVNWz8C', + 'version': 'ZwzuDdR1SOsOlDfzEXAOd5iZO93YIoOD9Xyvmszyb00C', }, ], 'condition': 'checkout_android', @@ -1251,7 +1251,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' + '@' + '9214ab997f24cd9540c6391f82c878567b12c587', + 'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '9bc1eda7e810110b2330f19e1a0bc8d8e10b61c4', 'condition': 'checkout_src_internal', }, @@ -1666,7 +1666,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '96db79eeca95ba3068331ab1642e757b5879828e', + Var('android_git') + '/platform/external/perfetto.git' + '@' + 'a77a3622d28b8ae7df746b6591de7b390c3b342a', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1848,7 +1848,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'd1b65aa5a88f6efd900604dfcda840154e9f16e2', 'src/third_party/webgpu-cts/src': - Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'afb5c81b795ba43b16fbaf5f0cb2c480eb21dfb3', + Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '874525f8b8efd7256affd396fb93c2f141cb7793', 'src/third_party/webrtc': Var('webrtc_git') + '/src.git' + '@' + 'f0e65bab0e6cce9cb2453f703f7561c080fbcfd0', @@ -1921,7 +1921,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@98d1fc4260efd43215fa709b42c2eacbccd1473e', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@c23db719ee0ad2ed982edf499859de27a606b3d7', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java index 8c65f86..a2ed1bae 100644 --- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java +++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -378,6 +378,10 @@ Flag.baseFeature(BlinkFeatures.WEB_RTC_METRONOME, "Inject a metronome into webrtc to allow task coalescing, " + " including synchronized decoding."), + Flag.baseFeature(BlinkFeatures.FAST_PATH_PAINT_PROPERTY_UPDATES, + "If enabled, some paint property updates (e.g., transform " + + "changes) will be applied directly instead of " + + "using the property tree builder."), Flag.baseFeature(BlinkFeatures.THREADED_BODY_LOADER, "If enabled, reads and decodes navigation body data off the main thread."), Flag.baseFeature("PreconnectOnRedirect"),
diff --git a/android_webview/java/src/org/chromium/android_webview/common/services/copybaraTest.txt b/android_webview/java/src/org/chromium/android_webview/common/services/copybaraTest.txt deleted file mode 100644 index 6ecbc29..0000000 --- a/android_webview/java/src/org/chromium/android_webview/common/services/copybaraTest.txt +++ /dev/null
@@ -1,12 +0,0 @@ -THIS IS A TEST FILE TO TEST COPYBARA END TO END SETUP. - -Editing this file allows us to synthetically create -changes to verify that the copybara workflow picks it -up and works correctly. - -This file should be deleted once we ensure copybara works -seamlessly. - -Increment the following counter for simulating a change: - -CHANGE_COUNTER: 0000
diff --git a/android_webview/tools/run_cts.py b/android_webview/tools/run_cts.py index bb6ca55..fc9692b 100755 --- a/android_webview/tools/run_cts.py +++ b/android_webview/tools/run_cts.py
@@ -119,7 +119,7 @@ test_app_mode = test_app_mode or _APP_MODE_FULL # Convert cmdline filters to test-filter style - filter_string = test_filter.InitializeFilterFromArgs(args) + filter_strings = test_filter.InitializeFiltersFromArgs(args) # Get all the filters for either include or exclude patterns # and filter where an architecture is provided and does not match @@ -132,20 +132,25 @@ if 'mode' not in filter_ or filter_['mode'] == test_app_mode ] - # Only add inclusion filters if there's not already one specified, since - # they would conflict, see test_filter.ConflictingPositiveFiltersException. - if not test_filter.HasPositivePatterns(filter_string): + if not filter_strings or not any( + test_filter.HasPositivePatterns(filt) for filt in filter_strings): patterns = getTestRunFilters("includes") - filter_string = test_filter.AppendPatternsToFilter( - filter_string, positive_patterns=patterns) + positive_string = test_filter.AppendPatternsToFilter( + '', positive_patterns=patterns) + if positive_string: + filter_strings.append(positive_string) if args.skip_expected_failures: patterns = getTestRunFilters("excludes") - filter_string = test_filter.AppendPatternsToFilter( - filter_string, negative_patterns=patterns) + negative_string = test_filter.AppendPatternsToFilter( + '', negative_patterns=patterns) + filter_strings.append(negative_string) - if filter_string: - return [TEST_FILTER_OPT + '=' + filter_string] + if filter_strings: + return [ + TEST_FILTER_OPT + '=' + filter_string + for filter_string in filter_strings + ] return [] @@ -507,8 +512,8 @@ arch = args.arch or DetermineArch(device) cts_release = args.cts_release or DetermineCtsRelease(device) - if (args.test_filter_files or args.test_filter - or args.isolated_script_test_filter): + if (args.test_filter_files or args.test_filters + or args.isolated_script_test_filters): # TODO(aluo): auto-determine the module based on the test filter and the # available tests in each module if not args.module_apk:
diff --git a/android_webview/tools/run_cts_test.py b/android_webview/tools/run_cts_test.py index bda6d3b0..fcafea77 100755 --- a/android_webview/tools/run_cts_test.py +++ b/android_webview/tools/run_cts_test.py
@@ -34,8 +34,8 @@ def _getArgsMock(**kwargs): args = { 'test_filter_files': None, - 'test_filter': None, - 'isolated_script_test_filter': None, + 'test_filters': None, + 'isolated_script_test_filters': None, 'skip_expected_failures': False } args.update(kwargs) @@ -103,24 +103,28 @@ run_cts.GetTestRunFilterArg(mock_args, self._CTS_RUN)) def testFilter_CombinesExcludedMatches(self): - mock_args = self._getArgsMock(test_filter='good#test', + mock_args = self._getArgsMock(test_filters=['good#test'], skip_expected_failures=False) self.assertEqual([run_cts.TEST_FILTER_OPT + '=good.test'], run_cts.GetTestRunFilterArg(mock_args, self._CTS_RUN)) def testFilter_CombinesAll(self): - mock_args = self._getArgsMock(test_filter='good#test', + mock_args = self._getArgsMock(test_filters=['good#test'], skip_expected_failures=True) skip = self._getSkipString() - self.assertEqual([run_cts.TEST_FILTER_OPT + '=good.test-' + skip], - run_cts.GetTestRunFilterArg(mock_args, self._CTS_RUN)) + self.assertEqual([ + run_cts.TEST_FILTER_OPT + '=good.test', + run_cts.TEST_FILTER_OPT + '=-' + skip + ], run_cts.GetTestRunFilterArg(mock_args, self._CTS_RUN)) def testFilter_ForMultipleTests(self): - mock_args = self._getArgsMock(test_filter='good#t1:good#t2', + mock_args = self._getArgsMock(test_filters=['good#t1:good#t2'], skip_expected_failures=True) skip = self._getSkipString() - self.assertEqual([run_cts.TEST_FILTER_OPT + '=good.t1:good.t2-' + skip], - run_cts.GetTestRunFilterArg(mock_args, self._CTS_RUN)) + self.assertEqual([ + run_cts.TEST_FILTER_OPT + '=good.t1:good.t2', + run_cts.TEST_FILTER_OPT + '=-' + skip + ], run_cts.GetTestRunFilterArg(mock_args, self._CTS_RUN)) def testFilter_IncludesForArchitecture(self): mock_args = self._getArgsMock() @@ -209,26 +213,30 @@ test_app_mode='instant')) def testIsolatedFilter_CombinesExcludedMatches(self): - mock_args = self._getArgsMock(isolated_script_test_filter='good#test', + mock_args = self._getArgsMock(isolated_script_test_filters=['good#test'], skip_expected_failures=False) self.assertEqual([run_cts.TEST_FILTER_OPT + '=good.test'], run_cts.GetTestRunFilterArg(mock_args, self._CTS_RUN)) def testIsolatedFilter_CombinesAll(self): - mock_args = self._getArgsMock(isolated_script_test_filter='good#test', + mock_args = self._getArgsMock(isolated_script_test_filters=['good#test'], skip_expected_failures=True) skip = self._getSkipString() - self.assertEqual([run_cts.TEST_FILTER_OPT + '=good.test-' + skip], - run_cts.GetTestRunFilterArg(mock_args, self._CTS_RUN)) + self.assertEqual([ + run_cts.TEST_FILTER_OPT + '=good.test', + run_cts.TEST_FILTER_OPT + '=-' + skip + ], run_cts.GetTestRunFilterArg(mock_args, self._CTS_RUN)) def testIsolatedFilter_ForMultipleTests(self): # Isolated test filters use :: to separate matches mock_args = self._getArgsMock( - isolated_script_test_filter='good#t1::good#t2', + isolated_script_test_filters=['good#t1::good#t2'], skip_expected_failures=True) skip = self._getSkipString() - self.assertEqual([run_cts.TEST_FILTER_OPT + '=good.t1:good.t2-' + skip], - run_cts.GetTestRunFilterArg(mock_args, self._CTS_RUN)) + self.assertEqual([ + run_cts.TEST_FILTER_OPT + '=good.t1:good.t2', + run_cts.TEST_FILTER_OPT + '=-' + skip + ], run_cts.GetTestRunFilterArg(mock_args, self._CTS_RUN)) @unittest.skipIf(os.name == "nt", "Opening NamedTemporaryFile by name " "doesn't work in Windows.") @@ -243,6 +251,27 @@ @unittest.skipIf(os.name == "nt", "Opening NamedTemporaryFile by name " "doesn't work in Windows.") + def testFilterFile_MultipleFilters(self): + with tempfile.NamedTemporaryFile(prefix='cts_run_test') as filter_file: + filter_file.write( + 'suite.goodtest1\nsuite.goodtest2\n-suite.badtest1'.encode()) + filter_file.seek(0) + with tempfile.NamedTemporaryFile(prefix='cts_run_test2') as filter_file2: + filter_file2.write( + 'suite.goodtest2\nsuite.goodtest3\n-suite.badtest2'.encode()) + filter_file2.seek(0) + mock_args = self._getArgsMock( + test_filter_files=[filter_file.name, filter_file2.name], + skip_expected_failures=False) + self.assertEqual([ + run_cts.TEST_FILTER_OPT + + '=suite.goodtest1:suite.goodtest2-suite.badtest1', + run_cts.TEST_FILTER_OPT + + '=suite.goodtest2:suite.goodtest3-suite.badtest2' + ], run_cts.GetTestRunFilterArg(mock_args, self._CTS_RUN)) + + @unittest.skipIf(os.name == "nt", "Opening NamedTemporaryFile by name " + "doesn't work in Windows.") def testFilterFile_CombinesAll(self): with tempfile.NamedTemporaryFile(prefix='cts_run_test') as filter_file: filter_file.write('suite.goodtest'.encode()) @@ -250,26 +279,32 @@ mock_args = self._getArgsMock(test_filter_files=[filter_file.name], skip_expected_failures=True) skip = self._getSkipString() - self.assertEqual([run_cts.TEST_FILTER_OPT + '=suite.goodtest-' + skip], - run_cts.GetTestRunFilterArg(mock_args, self._CTS_RUN)) + self.assertEqual([ + run_cts.TEST_FILTER_OPT + '=suite.goodtest', + run_cts.TEST_FILTER_OPT + '=-' + skip + ], run_cts.GetTestRunFilterArg(mock_args, self._CTS_RUN)) def testNegative_Filter(self): - mock_args = self._getArgsMock(test_filter='-good#t1:good#t2', + mock_args = self._getArgsMock(test_filters=['-good#t1:good#t2'], skip_expected_failures=True) skip = self._getSkipString() - self.assertEqual([run_cts.TEST_FILTER_OPT + '=-good.t1:good.t2:' + skip], - run_cts.GetTestRunFilterArg(mock_args, self._CTS_RUN)) + self.assertEqual([ + run_cts.TEST_FILTER_OPT + '=-good.t1:good.t2', + run_cts.TEST_FILTER_OPT + '=-' + skip + ], run_cts.GetTestRunFilterArg(mock_args, self._CTS_RUN)) def testNegative_IsolatedFilter(self): mock_args = self._getArgsMock( - isolated_script_test_filter='-good#t1::good#t2', + isolated_script_test_filters=['-good#t1::good#t2'], skip_expected_failures=True) skip = self._getSkipString() - self.assertEqual([run_cts.TEST_FILTER_OPT + '=-good.t1:good.t2:' + skip], - run_cts.GetTestRunFilterArg(mock_args, self._CTS_RUN)) + self.assertEqual([ + run_cts.TEST_FILTER_OPT + '=-good.t1:good.t2', + run_cts.TEST_FILTER_OPT + '=-' + skip + ], run_cts.GetTestRunFilterArg(mock_args, self._CTS_RUN)) def testFilter_OverridesInclusion(self): - mock_args = self._getArgsMock(test_filter='good#test1', + mock_args = self._getArgsMock(test_filters=['good#test1'], skip_expected_failures=False) cts_run = {'apk': 'module.apk', 'includes': [{'match': 'good#test2'}]} self.assertEqual([run_cts.TEST_FILTER_OPT + '=good.test1'],
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 7a9efbd4..0f70079 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -195,6 +195,8 @@ "ambient/ui/ambient_animation_attribution_transformer.h", "ambient/ui/ambient_animation_background_color.cc", "ambient/ui/ambient_animation_background_color.h", + "ambient/ui/ambient_animation_frame_rate_controller.cc", + "ambient/ui/ambient_animation_frame_rate_controller.h", "ambient/ui/ambient_animation_frame_rate_schedule.cc", "ambient/ui/ambient_animation_frame_rate_schedule.h", "ambient/ui/ambient_animation_player.cc", @@ -2612,6 +2614,7 @@ "ambient/model/ambient_topic_queue_unittest.cc", "ambient/ui/ambient_animation_attribution_transformer_unittest.cc", "ambient/ui/ambient_animation_background_color_unittest.cc", + "ambient/ui/ambient_animation_frame_rate_controller_unittest.cc", "ambient/ui/ambient_animation_frame_rate_schedule_unittest.cc", "ambient/ui/ambient_animation_progress_tracker_unittest.cc", "ambient/ui/ambient_animation_resizer_unittest.cc",
diff --git a/ash/accessibility/magnifier/fullscreen_magnifier_controller.cc b/ash/accessibility/magnifier/fullscreen_magnifier_controller.cc index 92207ad..15b6dbb 100644 --- a/ash/accessibility/magnifier/fullscreen_magnifier_controller.cc +++ b/ash/accessibility/magnifier/fullscreen_magnifier_controller.cc
@@ -648,7 +648,6 @@ int margin = kCursorPanningMargin / scale_; // No need to consider DPI. // Edge mouse following mode. - // TODO(https://crbug.com/1178027): Add continuous mouse following mode. int x_margin = margin; int y_margin = margin;
diff --git a/ash/accessibility/magnifier/fullscreen_magnifier_controller.h b/ash/accessibility/magnifier/fullscreen_magnifier_controller.h index 379826cb..2a3b2701 100644 --- a/ash/accessibility/magnifier/fullscreen_magnifier_controller.h +++ b/ash/accessibility/magnifier/fullscreen_magnifier_controller.h
@@ -140,11 +140,6 @@ // Returns true if magnifier is still on animation for moving viewport. bool IsOnAnimationForTesting() const { return is_on_animation_; } - // Disables the delay for moving magnifier window. - void DisableMoveMagnifierDelayForTesting() { - disable_move_magnifier_delay_ = true; - } - private: class GestureProviderClient; @@ -314,10 +309,6 @@ // Most recent caret position in |root_window_| coordinates. gfx::Point caret_point_; - // Flag for disabling moving magnifier delay. It can only be true in testing - // mode. - bool disable_move_magnifier_delay_ = false; - // Flag to draw a preview box around magnifier viewport area instead of // magnifying the screen for debugging. bool magnifier_debug_draw_rect_ = false;
diff --git a/ash/accessibility/magnifier/fullscreen_magnifier_controller_unittest.cc b/ash/accessibility/magnifier/fullscreen_magnifier_controller_unittest.cc index 44b321f..e3cd31e 100644 --- a/ash/accessibility/magnifier/fullscreen_magnifier_controller_unittest.cc +++ b/ash/accessibility/magnifier/fullscreen_magnifier_controller_unittest.cc
@@ -62,8 +62,6 @@ AshTestBase::SetUp(); UpdateDisplay(base::StringPrintf("%dx%d", kRootWidth, kRootHeight)); - GetFullscreenMagnifierController()->DisableMoveMagnifierDelayForTesting(); - touch_event_watcher_ = std::make_unique<TouchEventWatcher>(); GetRootWindow()->AddPreTargetHandler(touch_event_watcher_.get(), ui::EventTarget::Priority::kSystem);
diff --git a/ash/ambient/ui/ambient_animation_frame_rate_controller.cc b/ash/ambient/ui/ambient_animation_frame_rate_controller.cc new file mode 100644 index 0000000..6a4407d --- /dev/null +++ b/ash/ambient/ui/ambient_animation_frame_rate_controller.cc
@@ -0,0 +1,161 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/ambient/ui/ambient_animation_frame_rate_controller.h" + +#include "ash/frame_throttler/frame_throttling_controller.h" +#include "base/check.h" +#include "base/containers/contains.h" +#include "base/containers/cxx20_erase_vector.h" +#include "base/logging.h" +#include "base/notreached.h" +#include "base/time/time.h" +#include "cc/paint/skottie_wrapper.h" +#include "components/viz/common/surfaces/frame_sink_id.h" +#include "ui/aura/window.h" + +namespace ash { +namespace { + +AmbientAnimationFrameRateSchedule BuildSchedule(lottie::Animation* animation) { + DCHECK(animation); + AmbientAnimationFrameRateSchedule schedule = + BuildAmbientAnimationFrameRateSchedule( + animation->skottie()->GetAllMarkers()); + if (schedule.empty()) { + // This means the animation file needs to be fixed. This should never happen + // in the field in theory, but just in case, resort to the default frame + // rate schedule (no throttling). + LOG(DFATAL) << "Ambient animation has invalid frame rate markers."; + schedule = BuildDefaultFrameRateSchedule(); + } + return schedule; +} + +} // namespace + +AmbientAnimationFrameRateController::AmbientAnimationFrameRateController( + FrameThrottlingController* frame_throttling_controller, + lottie::Animation* animation) + : frame_throttling_controller_(frame_throttling_controller), + animation_(animation), + schedule_(BuildSchedule(animation)), + current_section_(schedule_.end()) { + DCHECK(frame_throttling_controller_); + DCHECK(animation_); + current_section_ = FindCurrentSection(); + animation_observation_.Observe(animation); +} + +AmbientAnimationFrameRateController::~AmbientAnimationFrameRateController() { + ThrottleFrameRate(kDefaultFrameInterval); +} + +void AmbientAnimationFrameRateController::AnimationFramePainted( + const lottie::Animation* animation, + float) { + auto new_current_section = FindCurrentSection(); + if (new_current_section == current_section_) + return; + + DVLOG(1) << "Found new frame rate section: " << *new_current_section; + current_section_ = new_current_section; + ThrottleFrameRateForCurrentSection(); +} + +void AmbientAnimationFrameRateController::AnimationIsDeleting( + const lottie::Animation* animation) { + animation_observation_.Reset(); + ThrottleFrameRate(kDefaultFrameInterval); +} + +void AmbientAnimationFrameRateController::OnWindowDestroying( + aura::Window* window) { + if (base::Erase(windows_to_throttle_, window) == 0) { + NOTREACHED() << "Received OnWindowDestroying() for unknown window " + << window->GetId(); + } + window_observations_.RemoveObservation(window); + // Update throttling with the trimmed list of |windows_to_throttle_|. + ThrottleFrameRateForCurrentSection(); +} + +void AmbientAnimationFrameRateController::AddWindowToThrottle( + aura::Window* window) { + DCHECK(window); + DCHECK(window->GetFrameSinkId().is_valid()); + if (base::Contains(windows_to_throttle_, window)) + return; + + windows_to_throttle_.push_back(window); + window_observations_.AddObservation(window); + // Update throttling with the expanded list of |windows_to_throttle_|. + ThrottleFrameRateForCurrentSection(); +} + +AmbientAnimationFrameRateScheduleIterator +AmbientAnimationFrameRateController::FindCurrentSection() const { + absl::optional<float> current_progress = animation_->GetCurrentProgress(); + if (!current_progress) { + DVLOG(1) << "Animation is not playing currently. Cannot map timestamp to " + "scheduled frame rate."; + return schedule_.end(); + } + + // Always start searching from the last section the animation was on. Since + // animations progress linearly in small increments, most of the time, the + // |current_section_| will not change. + AmbientAnimationFrameRateScheduleIterator new_current_section = + current_section_ == schedule_.end() ? schedule_.begin() + : current_section_; + AmbientAnimationFrameRateScheduleIterator orig_current_section = + new_current_section; + while (!new_current_section->Contains(*current_progress)) { + ++new_current_section; + // Note the AmbientAnimationFrameRateSchedule by design is contiguous. Every + // possible timestamp falls within a section of the schedule, so it's + // impossible to infinite loop here. + DCHECK(new_current_section != orig_current_section) + << "Infinite loop detected. AmbientAnimationFrameRateSchedule has gap " + "and is malformed."; + // The schedule is cyclic. Loop back to the beginning. + if (new_current_section == schedule_.end()) + new_current_section = schedule_.begin(); + } + return new_current_section; +} + +void AmbientAnimationFrameRateController::ThrottleFrameRateForCurrentSection() { + // TODO(esum): There is a corner case not accounted for yet. Say the frame + // interval is large (1 second). And say we throttle to 1 fps at time 10 sec, + // and we need to restore the default 60 fps at 19.1 sec. We will get: + // AnimationFramePainted(10 sec) + // AnimationFramePainted(11 sec) + // ... + // AnimationFramePainted(19 sec) - Still not past the 19.1 second mark + // AnimationFramePainted(20 sec) - Switch back to 60 fps here. + // + // This is bad because we switch back .9 seconds too late, which is a lot. + // To fix this, we could start a timer that fires when the current section is + // over and we need to switch to the new frame rate. It currently is not a + // problem because in practice, the frame rates never get small enough to + // notice this issue. But it will be a problem with the slideshow lottie + // animation. + if (current_section_ != schedule_.end()) + ThrottleFrameRate(current_section_->frame_interval); +} + +void AmbientAnimationFrameRateController::ThrottleFrameRate( + base::TimeDelta frame_interval) { + if (frame_interval == kDefaultFrameInterval) { + DVLOG(1) << "Resetting frame rate to default"; + frame_throttling_controller_->EndThrottling(); + } else { + DVLOG(1) << "Throttling frame rate to " << frame_interval.ToHz() << "hz"; + frame_throttling_controller_->StartThrottling(windows_to_throttle_, + frame_interval); + } +} + +} // namespace ash
diff --git a/ash/ambient/ui/ambient_animation_frame_rate_controller.h b/ash/ambient/ui/ambient_animation_frame_rate_controller.h new file mode 100644 index 0000000..813dfbde --- /dev/null +++ b/ash/ambient/ui/ambient_animation_frame_rate_controller.h
@@ -0,0 +1,96 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_AMBIENT_UI_AMBIENT_ANIMATION_FRAME_RATE_CONTROLLER_H_ +#define ASH_AMBIENT_UI_AMBIENT_ANIMATION_FRAME_RATE_CONTROLLER_H_ + +#include <vector> + +#include "ash/ambient/ui/ambient_animation_frame_rate_schedule.h" +#include "ash/ash_export.h" +#include "base/memory/raw_ptr.h" +#include "base/scoped_multi_source_observation.h" +#include "base/scoped_observation.h" +#include "base/time/time.h" +#include "components/viz/common/surfaces/frame_sink_id.h" +#include "ui/aura/window.h" +#include "ui/aura/window_observer.h" +#include "ui/lottie/animation.h" +#include "ui/lottie/animation_observer.h" + +namespace ash { + +class FrameThrottlingController; + +// Throttles (lowers) the BeginFrame rate of the //viz service so that the +// lottie::Animation is ultimately rendered at a lower frame rate. This is +// done to reduce power consumption, thus increasing battery life. The time at +// which to throttle and the amount to throttle by is embedded within the +// lottie::Animation itself and chosen by the motion designer. Generally +// speaking, the less motion there is, the more opportunity there is to +// throttle. +// +// Once this class is destroyed or the lottie::Animation ends, the BeginFrame +// rate in //viz is restored to the default. +class ASH_EXPORT AmbientAnimationFrameRateController + : public lottie::AnimationObserver, + public aura::WindowObserver { + public: + // AmbientAnimationFrameRateController gracefully handles |animation| being + // destroyed first (the controller just goes idle). + AmbientAnimationFrameRateController( + FrameThrottlingController* frame_throttling_controller, + lottie::Animation* animation); + AmbientAnimationFrameRateController( + const AmbientAnimationFrameRateController&) = delete; + AmbientAnimationFrameRateController& operator=( + const AmbientAnimationFrameRateController&) = delete; + ~AmbientAnimationFrameRateController() override; + + // Adds a |window| (playing an ambient mode animation) to throttle. The + // |window| must have a valid viz::FrameSinkId assigned to it. Note the caller + // may add multiple windows for throttling, even though the controller + // only accepts one lottie::Animation in the constructor. This means that + // all of the added windows will be throttled at the same frame rate even + // though each window may have a separate lottie::Animation instance playing + // in it. This is done for simplicity purposes. The underlying assumption is + // that the lottie::Animations' timestamps are all closely synchronized; this + // is ensured within AmbientAnimationPlayer. + // + // If the |window| has already been added in the past, this call is a no-op. + // The controller gracefully handles the |window| being destroyed; it gets + // removed from the throttling schedule internally. + void AddWindowToThrottle(aura::Window* window); + + private: + // lottie::AnimationObserver implementation: + void AnimationFramePainted(const lottie::Animation* animation, + float) override; + void AnimationIsDeleting(const lottie::Animation* animation) override; + + // aura::WindowObserver implementation: + void OnWindowDestroying(aura::Window* window) override; + + AmbientAnimationFrameRateScheduleIterator FindCurrentSection() const; + AmbientAnimationFrameRateScheduleIterator GetNextScheduledSection( + AmbientAnimationFrameRateScheduleIterator section_in) const; + void ThrottleFrameRateForCurrentSection(); + void ThrottleFrameRate(base::TimeDelta frame_interval); + + const base::raw_ptr<FrameThrottlingController> frame_throttling_controller_; + const base::raw_ptr<lottie::Animation> animation_; + const AmbientAnimationFrameRateSchedule schedule_; + // Points to the current section in the |schedule_| that's being played. + // Set to |schedule_.end()| if the animation is not playing currently. + AmbientAnimationFrameRateScheduleIterator current_section_; + std::vector<aura::Window*> windows_to_throttle_; + base::ScopedObservation<lottie::Animation, lottie::AnimationObserver> + animation_observation_{this}; + base::ScopedMultiSourceObservation<aura::Window, aura::WindowObserver> + window_observations_{this}; +}; + +} // namespace ash + +#endif // ASH_AMBIENT_UI_AMBIENT_ANIMATION_FRAME_RATE_CONTROLLER_H_
diff --git a/ash/ambient/ui/ambient_animation_frame_rate_controller_unittest.cc b/ash/ambient/ui/ambient_animation_frame_rate_controller_unittest.cc new file mode 100644 index 0000000..166e3b4 --- /dev/null +++ b/ash/ambient/ui/ambient_animation_frame_rate_controller_unittest.cc
@@ -0,0 +1,434 @@ +// 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 "ash/ambient/ui/ambient_animation_frame_rate_controller.h" + +#include <cstdint> +#include <memory> +#include <utility> +#include <vector> + +#include "ash/frame_throttler/frame_throttling_controller.h" +#include "ash/shell.h" +#include "ash/test/ash_test_base.h" +#include "base/check.h" +#include "base/containers/flat_set.h" +#include "base/containers/span.h" +#include "base/memory/scoped_refptr.h" +#include "base/time/time.h" +#include "cc/paint/skottie_marker.h" +#include "cc/paint/skottie_resource_metadata.h" +#include "cc/paint/skottie_wrapper.h" +#include "components/viz/common/surfaces/frame_sink_id.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/skia/include/core/SkSize.h" +#include "ui/gfx/canvas.h" +#include "ui/gfx/geometry/size.h" +#include "ui/gfx/geometry/size_f.h" +#include "ui/gfx/geometry/skia_conversions.h" +#include "ui/lottie/animation.h" + +namespace ash { +namespace { + +using ::testing::Eq; +using ::testing::IsEmpty; +using ::testing::UnorderedElementsAre; + +constexpr gfx::Size kTestAnimationSize = gfx::Size(100, 100); + +// Tailor-made for creating an animation with custom markers without having to +// create full-blown valid lottie JSON data with markers embedded in it. +class TestSkottieWrapper : public cc::SkottieWrapper { + public: + TestSkottieWrapper(base::TimeDelta duration, + std::vector<cc::SkottieMarker> markers) + : duration_(duration), markers_(std::move(markers)) {} + TestSkottieWrapper(const TestSkottieWrapper&) = delete; + TestSkottieWrapper& operator=(const TestSkottieWrapper&) = delete; + + // cc::SkottieWrapper implementation: + bool is_valid() const override { return true; } + const cc::SkottieResourceMetadataMap& GetImageAssetMetadata() const override { + return image_asset_map_; + } + const base::flat_set<std::string>& GetTextNodeNames() const override { + return text_node_names_; + } + cc::SkottieTextPropertyValueMap GetCurrentTextPropertyValues() + const override { + return cc::SkottieTextPropertyValueMap(); + } + cc::SkottieTransformPropertyValueMap GetCurrentTransformPropertyValues() + const override { + return cc::SkottieTransformPropertyValueMap(); + } + cc::SkottieColorMap GetCurrentColorPropertyValues() const override { + return cc::SkottieColorMap(); + } + const std::vector<cc::SkottieMarker>& GetAllMarkers() const override { + return markers_; + } + void Seek(float t, FrameDataCallback frame_data_cb) override {} + void Seek(float t); + void Draw(SkCanvas* canvas, + float t, + const SkRect& rect, + FrameDataCallback frame_data_cb, + const cc::SkottieColorMap& color_map, + const cc::SkottieTextPropertyValueMap& text_map) override {} + float duration() const override { return duration_.InSecondsF(); } + SkSize size() const override { + return gfx::SizeFToSkSize(gfx::SizeF(kTestAnimationSize)); + } + base::span<const uint8_t> raw_data() const override { + return base::span<const uint8_t>(); + } + uint32_t id() const override { return 0; } + + private: + ~TestSkottieWrapper() override = default; + + const base::TimeDelta duration_; + const base::flat_set<std::string> text_node_names_; + const cc::SkottieResourceMetadataMap image_asset_map_; + const std::vector<cc::SkottieMarker> markers_; +}; + +class AmbientAnimationFrameRateControllerTest : public AshTestBase { + protected: + AmbientAnimationFrameRateControllerTest() + : clock_(base::TimeTicks::Now()), + canvas_(kTestAnimationSize, /*image_scale=*/1.f, /*is_opaque=*/false) {} + + void AdvanceTimeAndPaint(lottie::Animation& animation, + float normalized_amount) { + CHECK_GE(normalized_amount, 0.f); + CHECK_LE(normalized_amount, 1.f); + clock_ += (normalized_amount * animation.GetAnimationDuration()); + animation.Paint(&canvas_, clock_, kTestAnimationSize); + } + + base::TimeTicks clock_; + gfx::Canvas canvas_; +}; + +TEST_F(AmbientAnimationFrameRateControllerTest, BasicThrottling) { + constexpr viz::FrameSinkId kTestFrameSinkId = {99, 99}; + std::unique_ptr<aura::Window> window = CreateTestWindow(); + window->SetEmbedFrameSinkId(kTestFrameSinkId); + + std::vector<cc::SkottieMarker> markers = { + {"_CrOS_Marker_Throttled_20fps", 0.2f, 0.4f}, + {"_CrOS_Marker_Throttled_30fps", 0.8f, 0.9f}, + }; + lottie::Animation animation( + base::MakeRefCounted<TestSkottieWrapper>(base::Seconds(1), markers)); + AmbientAnimationFrameRateController ambient_frame_rate_controller( + Shell::Get()->frame_throttling_controller(), &animation); + ambient_frame_rate_controller.AddWindowToThrottle(window.get()); + animation.Start(lottie::Animation::PlaybackConfig::CreateDefault(animation)); + + // T: 0 + AdvanceTimeAndPaint(animation, .0f); + + // T: .1 + AdvanceTimeAndPaint(animation, .1f); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + IsEmpty()); + + // T: .21 + AdvanceTimeAndPaint(animation, .21f - .1f); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + UnorderedElementsAre(kTestFrameSinkId)); + EXPECT_THAT(Shell::Get() + ->frame_throttling_controller() + ->GetCurrentThrottledFrameRate(), + Eq(20)); + + // T: .39 + AdvanceTimeAndPaint(animation, .39f - .21f); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + UnorderedElementsAre(kTestFrameSinkId)); + EXPECT_THAT(Shell::Get() + ->frame_throttling_controller() + ->GetCurrentThrottledFrameRate(), + Eq(20)); + + // T: .41 + AdvanceTimeAndPaint(animation, .41f - .39f); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + IsEmpty()); + + // T: .79 + AdvanceTimeAndPaint(animation, .79f - .41f); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + IsEmpty()); + + // T: .81 + AdvanceTimeAndPaint(animation, .81f - .79f); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + UnorderedElementsAre(kTestFrameSinkId)); + EXPECT_THAT(Shell::Get() + ->frame_throttling_controller() + ->GetCurrentThrottledFrameRate(), + Eq(30)); + + // T: .89 + AdvanceTimeAndPaint(animation, .89f - .81f); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + UnorderedElementsAre(kTestFrameSinkId)); + EXPECT_THAT(Shell::Get() + ->frame_throttling_controller() + ->GetCurrentThrottledFrameRate(), + Eq(30)); + + // T: .91 + AdvanceTimeAndPaint(animation, .91f - .89f); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + IsEmpty()); + + // T: .1 + AdvanceTimeAndPaint(animation, 1.1f - .9f); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + IsEmpty()); + + // T: .21 + AdvanceTimeAndPaint(animation, .21f - .1f); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + UnorderedElementsAre(kTestFrameSinkId)); + EXPECT_THAT(Shell::Get() + ->frame_throttling_controller() + ->GetCurrentThrottledFrameRate(), + Eq(20)); +} + +TEST_F(AmbientAnimationFrameRateControllerTest, + MarkersAtBordersOfAnimationCycle) { + constexpr viz::FrameSinkId kTestFrameSinkId = {99, 99}; + std::unique_ptr<aura::Window> window = CreateTestWindow(); + window->SetEmbedFrameSinkId(kTestFrameSinkId); + + std::vector<cc::SkottieMarker> markers = { + {"_CrOS_Marker_Throttled_20fps", 0.f, 0.1f}, + {"_CrOS_Marker_Throttled_30fps", 0.9f, 1.f}, + }; + lottie::Animation animation( + base::MakeRefCounted<TestSkottieWrapper>(base::Seconds(1), markers)); + AmbientAnimationFrameRateController ambient_frame_rate_controller( + Shell::Get()->frame_throttling_controller(), &animation); + ambient_frame_rate_controller.AddWindowToThrottle(window.get()); + animation.Start(lottie::Animation::PlaybackConfig::CreateDefault(animation)); + + // T: 0 + AdvanceTimeAndPaint(animation, .0f); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + UnorderedElementsAre(kTestFrameSinkId)); + EXPECT_THAT(Shell::Get() + ->frame_throttling_controller() + ->GetCurrentThrottledFrameRate(), + Eq(20)); + + // T: .91 + AdvanceTimeAndPaint(animation, .91f); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + UnorderedElementsAre(kTestFrameSinkId)); + EXPECT_THAT(Shell::Get() + ->frame_throttling_controller() + ->GetCurrentThrottledFrameRate(), + Eq(30)); + + // T: .01 + AdvanceTimeAndPaint(animation, 1.01 - .91f); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + UnorderedElementsAre(kTestFrameSinkId)); + EXPECT_THAT(Shell::Get() + ->frame_throttling_controller() + ->GetCurrentThrottledFrameRate(), + Eq(20)); +} + +TEST_F(AmbientAnimationFrameRateControllerTest, NoMarkers) { + constexpr viz::FrameSinkId kTestFrameSinkId = {99, 99}; + std::unique_ptr<aura::Window> window = CreateTestWindow(); + window->SetEmbedFrameSinkId(kTestFrameSinkId); + + lottie::Animation animation(base::MakeRefCounted<TestSkottieWrapper>( + base::Seconds(1), std::vector<cc::SkottieMarker>())); + AmbientAnimationFrameRateController ambient_frame_rate_controller( + Shell::Get()->frame_throttling_controller(), &animation); + ambient_frame_rate_controller.AddWindowToThrottle(window.get()); + animation.Start(lottie::Animation::PlaybackConfig::CreateDefault(animation)); + + constexpr int kNumTimeStepsToTest = 30; + constexpr float kTimeStepSize = .1f; + for (int i = 0; i < kNumTimeStepsToTest; ++i) { + AdvanceTimeAndPaint(animation, kTimeStepSize); + EXPECT_THAT(Shell::Get() + ->frame_throttling_controller() + ->GetFrameSinkIdsToThrottle(), + IsEmpty()); + } +} + +// The time steps in this test skip multiple markers at a time. +TEST_F(AmbientAnimationFrameRateControllerTest, LargeTimesteps) { + constexpr viz::FrameSinkId kTestFrameSinkId = {99, 99}; + std::unique_ptr<aura::Window> window = CreateTestWindow(); + window->SetEmbedFrameSinkId(kTestFrameSinkId); + + std::vector<cc::SkottieMarker> markers = { + {"_CrOS_Marker_Throttled_10fps", 0.f, 0.1f}, + {"_CrOS_Marker_Throttled_20fps", 0.1f, 0.2f}, + {"_CrOS_Marker_Throttled_30fps", 0.2f, 0.3f}, + {"_CrOS_Marker_Throttled_40fps", 0.3f, 0.4f}, + {"_CrOS_Marker_Throttled_50fps", 0.4f, 0.5f}, + }; + lottie::Animation animation( + base::MakeRefCounted<TestSkottieWrapper>(base::Seconds(1), markers)); + AmbientAnimationFrameRateController ambient_frame_rate_controller( + Shell::Get()->frame_throttling_controller(), &animation); + ambient_frame_rate_controller.AddWindowToThrottle(window.get()); + animation.Start(lottie::Animation::PlaybackConfig::CreateDefault(animation)); + + // T: 0 + AdvanceTimeAndPaint(animation, .0f); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + UnorderedElementsAre(kTestFrameSinkId)); + EXPECT_THAT(Shell::Get() + ->frame_throttling_controller() + ->GetCurrentThrottledFrameRate(), + Eq(10)); + + // T: .25 + AdvanceTimeAndPaint(animation, .25f); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + UnorderedElementsAre(kTestFrameSinkId)); + EXPECT_THAT(Shell::Get() + ->frame_throttling_controller() + ->GetCurrentThrottledFrameRate(), + Eq(30)); + + // T: .45 + AdvanceTimeAndPaint(animation, .45f - .25f); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + UnorderedElementsAre(kTestFrameSinkId)); + EXPECT_THAT(Shell::Get() + ->frame_throttling_controller() + ->GetCurrentThrottledFrameRate(), + Eq(50)); +} + +TEST_F(AmbientAnimationFrameRateControllerTest, MultipleWindows) { + constexpr viz::FrameSinkId kTestFrameSinkId1 = {99, 99}; + std::unique_ptr<aura::Window> window_1 = CreateTestWindow(); + window_1->SetEmbedFrameSinkId(kTestFrameSinkId1); + + constexpr viz::FrameSinkId kTestFrameSinkId2 = {999, 999}; + std::unique_ptr<aura::Window> window_2 = CreateTestWindow(); + window_2->SetEmbedFrameSinkId(kTestFrameSinkId2); + + std::vector<cc::SkottieMarker> markers = { + {"_CrOS_Marker_Throttled_10fps", 0.4f, 0.6f}, + }; + lottie::Animation animation( + base::MakeRefCounted<TestSkottieWrapper>(base::Seconds(1), markers)); + AmbientAnimationFrameRateController ambient_frame_rate_controller( + Shell::Get()->frame_throttling_controller(), &animation); + animation.Start(lottie::Animation::PlaybackConfig::CreateDefault(animation)); + + // T: 0 + AdvanceTimeAndPaint(animation, .0f); + // T: .41 + AdvanceTimeAndPaint(animation, .41f); + + ambient_frame_rate_controller.AddWindowToThrottle(window_1.get()); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + UnorderedElementsAre(kTestFrameSinkId1)); + EXPECT_THAT(Shell::Get() + ->frame_throttling_controller() + ->GetCurrentThrottledFrameRate(), + Eq(10)); + + // T: .59 + AdvanceTimeAndPaint(animation, .59f - .41f); + ambient_frame_rate_controller.AddWindowToThrottle(window_2.get()); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + UnorderedElementsAre(kTestFrameSinkId1, kTestFrameSinkId2)); + EXPECT_THAT(Shell::Get() + ->frame_throttling_controller() + ->GetCurrentThrottledFrameRate(), + Eq(10)); + + // T: .7 + AdvanceTimeAndPaint(animation, .7f - .59f); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + IsEmpty()); +} + +TEST_F(AmbientAnimationFrameRateControllerTest, + HandlesWindowAndAnimationDestroyedFirst) { + constexpr viz::FrameSinkId kTestFrameSinkId1 = {99, 99}; + std::unique_ptr<aura::Window> window_1 = CreateTestWindow(); + window_1->SetEmbedFrameSinkId(kTestFrameSinkId1); + + constexpr viz::FrameSinkId kTestFrameSinkId2 = {999, 999}; + std::unique_ptr<aura::Window> window_2 = CreateTestWindow(); + window_2->SetEmbedFrameSinkId(kTestFrameSinkId2); + + std::vector<cc::SkottieMarker> markers = { + {"_CrOS_Marker_Throttled_10fps", 0.f, 0.2f}, + }; + auto animation = std::make_unique<lottie::Animation>( + base::MakeRefCounted<TestSkottieWrapper>(base::Seconds(1), markers)); + AmbientAnimationFrameRateController ambient_frame_rate_controller( + Shell::Get()->frame_throttling_controller(), animation.get()); + animation->Start( + lottie::Animation::PlaybackConfig::CreateDefault(*animation)); + ambient_frame_rate_controller.AddWindowToThrottle(window_1.get()); + ambient_frame_rate_controller.AddWindowToThrottle(window_2.get()); + + // T: 0 + AdvanceTimeAndPaint(*animation, .0f); + ASSERT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + UnorderedElementsAre(kTestFrameSinkId1, kTestFrameSinkId2)); + + window_1.reset(); + // T: 0.05f + AdvanceTimeAndPaint(*animation, .05f); + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + UnorderedElementsAre(kTestFrameSinkId2)); + + animation.reset(); + // The frame rate should be restored to default when the animation is + // over. + EXPECT_THAT( + Shell::Get()->frame_throttling_controller()->GetFrameSinkIdsToThrottle(), + IsEmpty()); +} + +} // namespace +} // namespace ash
diff --git a/ash/ambient/ui/ambient_animation_frame_rate_schedule.h b/ash/ambient/ui/ambient_animation_frame_rate_schedule.h index a140640..c3369c5 100644 --- a/ash/ambient/ui/ambient_animation_frame_rate_schedule.h +++ b/ash/ambient/ui/ambient_animation_frame_rate_schedule.h
@@ -78,6 +78,8 @@ using AmbientAnimationFrameRateSchedule = std::list<AmbientAnimationFrameRateSection>; +using AmbientAnimationFrameRateScheduleIterator = + AmbientAnimationFrameRateSchedule::const_iterator; // Returns a schedule that plays the entire animation at the default frame // rate.
diff --git a/ash/app_list/views/apps_grid_view_unittest.cc b/ash/app_list/views/apps_grid_view_unittest.cc index a28c63a..27cbdaf 100644 --- a/ash/app_list/views/apps_grid_view_unittest.cc +++ b/ash/app_list/views/apps_grid_view_unittest.cc
@@ -87,7 +87,6 @@ namespace { -constexpr int kNumOfSuggestedApps = 3; constexpr size_t kMaxItemsInFolder = 48; class ShelfItemFactoryFake : public ShelfModel::ShelfItemFactory { @@ -213,20 +212,6 @@ base::OnceClosure task_; }; -class TestSuggestedSearchResult : public TestSearchResult { - public: - TestSuggestedSearchResult() { - set_display_type(SearchResultDisplayType::kChip); - set_is_recommendation(true); - } - - TestSuggestedSearchResult(const TestSuggestedSearchResult&) = delete; - TestSuggestedSearchResult& operator=(const TestSuggestedSearchResult&) = - delete; - - ~TestSuggestedSearchResult() override = default; -}; - // Counts when the observed view's bounds change. class BoundsChangeCounter : public views::ViewObserver { public: @@ -276,14 +261,6 @@ // Populate some suggested apps. search_model_ = std::make_unique<SearchModel>(); - for (size_t i = 0; i < kNumOfSuggestedApps; ++i) { - auto search_result = std::make_unique<TestSuggestedSearchResult>(); - // Give each item a name so that the accessibility paint checks pass. - // (Focusable items should have accessible names.) - search_result->SetAccessibleName( - base::UTF8ToUTF16(base::StringPrintf("item %zu", i))); - search_model_->results()->Add(std::move(search_result)); - } // Replace the model before the app list views are created, because some // views cache pointers to the model. @@ -5314,7 +5291,9 @@ } } -TEST_P(AppsGridViewClamshellAndTabletTest, ReorderDragAnimationMetrics) { +// TODO(crbug.com/1371184): Fix flaky test. +TEST_P(AppsGridViewClamshellAndTabletTest, + DISABLED_ReorderDragAnimationMetrics) { ui::ScopedAnimationDurationScaleMode non_zero_duration_mode( ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); base::HistogramTester histogram_tester;
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index 267caff..7a2dc50 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -1005,6 +1005,12 @@ <message name="IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK" desc="The label used in the accessibility menu of the system tray to toggle on/off the select-to-speak feature."> Select-to-speak </message> + <message name="IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK_INSTRUCTIONS" desc="The tooltip text used while hovering the Select-to-speak action button in the system tray, when Select-to-speak is activated, and ready for the user to select text."> + Click and drag to select text + </message> + <message name="IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK_STOP_INSTRUCTIONS" desc="The tooltip text used while hovering the Select-to-speak action button in the system tray, when Select-to-speak is speaking text, and can be stopped by clicking the button."> + Stop speaking + </message> <message name="IDS_ASH_STATUS_TRAY_ACCESSIBILITY_DICTATION" desc="The label used in the accessibility menu of the system tray to toggle on/off the speak to type feature."> Dictation </message>
diff --git a/ash/ash_strings_grd/IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK_INSTRUCTIONS.png.sha1 b/ash/ash_strings_grd/IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK_INSTRUCTIONS.png.sha1 new file mode 100644 index 0000000..1838e9de --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK_INSTRUCTIONS.png.sha1
@@ -0,0 +1 @@ +f4d6082829b3be861fc39feae9c173ac04ab3a6b \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK_STOP_INSTRUCTIONS.png.sha1 b/ash/ash_strings_grd/IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK_STOP_INSTRUCTIONS.png.sha1 new file mode 100644 index 0000000..321e0c4 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK_STOP_INSTRUCTIONS.png.sha1
@@ -0,0 +1 @@ +d5cb049b7707d79ebe0fdda155fc5bf3d0c3971d \ No newline at end of file
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 666cb715..98cb0f5 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -518,7 +518,7 @@ // notifications, network details page, quick settings, and portal signin UI. BASE_FEATURE(kCaptivePortalUI2022, "CaptivePortalUI2022", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); // Controls whether Active Directory management on ChromeOS (Chromad) is // supported or not. When this feature is enabled, Chromad continues working
diff --git a/ash/system/accessibility/select_to_speak/select_to_speak_tray.cc b/ash/system/accessibility/select_to_speak/select_to_speak_tray.cc index 4ef5eab..057048f 100644 --- a/ash/system/accessibility/select_to_speak/select_to_speak_tray.cc +++ b/ash/system/accessibility/select_to_speak/select_to_speak_tray.cc
@@ -13,6 +13,7 @@ #include "ash/system/tray/tray_constants.h" #include "ash/system/tray/tray_container.h" #include "ash/system/tray/tray_utils.h" +#include "ui/accessibility/accessibility_features.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/metadata/metadata_impl_macros.h" #include "ui/gfx/paint_vector_icon.h" @@ -27,12 +28,11 @@ namespace { -gfx::ImageSkia GetImageOnCurrentSelectToSpeakStatus() { +gfx::ImageSkia GetImageOnCurrentSelectToSpeakStatus( + const SelectToSpeakState& select_to_speak_state) { auto* shell = Shell::Get(); const SkColor color = TrayIconColor(shell->session_controller()->GetSessionState()); - const auto select_to_speak_state = - shell->accessibility_controller()->GetSelectToSpeakState(); switch (select_to_speak_state) { case SelectToSpeakState::kSelectToSpeakStateInactive: @@ -45,6 +45,26 @@ } } +std::u16string GetTooltipTextOnCurrentSelectToSpeakStatus( + const SelectToSpeakState& select_to_speak_state) { + if (!::features::IsAccessibilitySelectToSpeakHoverTextImprovementsEnabled()) { + return l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK); + } + + switch (select_to_speak_state) { + case SelectToSpeakState::kSelectToSpeakStateInactive: + return l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK); + case SelectToSpeakState::kSelectToSpeakStateSelecting: + return l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK_INSTRUCTIONS); + case SelectToSpeakState::kSelectToSpeakStateSpeaking: + return l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK_STOP_INSTRUCTIONS); + } +} + } // namespace SelectToSpeakTray::SelectToSpeakTray(Shelf* shelf, @@ -78,7 +98,7 @@ void SelectToSpeakTray::Initialize() { TrayBackgroundView::Initialize(); - UpdateIconOnCurrentStatus(); + UpdateUXOnCurrentStatus(); } std::u16string SelectToSpeakTray::GetAccessibleNameForTray() { @@ -87,8 +107,10 @@ } void SelectToSpeakTray::HandleLocaleChange() { - icon_->SetTooltipText(l10n_util::GetStringUTF16( - IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK)); + const auto select_to_speak_state = + Shell::Get()->accessibility_controller()->GetSelectToSpeakState(); + icon_->SetTooltipText( + GetTooltipTextOnCurrentSelectToSpeakStatus(select_to_speak_state)); } void SelectToSpeakTray::OnThemeChanged() { @@ -97,7 +119,7 @@ } void SelectToSpeakTray::OnAccessibilityStatusChanged() { - UpdateIconOnCurrentStatus(); + UpdateUXOnCurrentStatus(); } void SelectToSpeakTray::OnSessionStateChanged( @@ -105,24 +127,31 @@ UpdateIconOnColorChanges(); } -void SelectToSpeakTray::UpdateIconOnCurrentStatus() { +void SelectToSpeakTray::UpdateUXOnCurrentStatus() { auto* accessibility_controller = Shell::Get()->accessibility_controller(); if (!accessibility_controller->select_to_speak().enabled()) { SetVisiblePreferred(false); return; } - icon_->SetImage(GetImageOnCurrentSelectToSpeakStatus()); + const auto select_to_speak_state = + accessibility_controller->GetSelectToSpeakState(); + icon_->SetImage(GetImageOnCurrentSelectToSpeakStatus(select_to_speak_state)); + icon_->SetTooltipText( + GetTooltipTextOnCurrentSelectToSpeakStatus(select_to_speak_state)); SetIsActive(accessibility_controller->GetSelectToSpeakState() != SelectToSpeakState::kSelectToSpeakStateInactive); SetVisiblePreferred(true); } void SelectToSpeakTray::UpdateIconOnColorChanges() { + auto* accessibility_controller = Shell::Get()->accessibility_controller(); if (!visible_preferred() || - !Shell::Get()->accessibility_controller()->select_to_speak().enabled()) { + !accessibility_controller->select_to_speak().enabled()) { return; } - icon_->SetImage(GetImageOnCurrentSelectToSpeakStatus()); + const auto select_to_speak_state = + accessibility_controller->GetSelectToSpeakState(); + icon_->SetImage(GetImageOnCurrentSelectToSpeakStatus(select_to_speak_state)); } BEGIN_METADATA(SelectToSpeakTray, TrayBackgroundView);
diff --git a/ash/system/accessibility/select_to_speak/select_to_speak_tray.h b/ash/system/accessibility/select_to_speak/select_to_speak_tray.h index 2f04cfe..2f5cd40 100644 --- a/ash/system/accessibility/select_to_speak/select_to_speak_tray.h +++ b/ash/system/accessibility/select_to_speak/select_to_speak_tray.h
@@ -51,10 +51,10 @@ private: friend class SelectToSpeakTrayTest; - // Updates icon depending on the current status of select-to-speak. And - // updates the visibility of the tray depending on whether select-to-speak is - // enabled or disabled. - void UpdateIconOnCurrentStatus(); + // Updates icon and hovertext depending on the current status of + // select-to-speak. And updates the visibility of the tray depending on + // whether select-to-speak is enabled or disabled. + void UpdateUXOnCurrentStatus(); // Updates icon if the color of the icon changes. void UpdateIconOnColorChanges();
diff --git a/ash/system/accessibility/select_to_speak/select_to_speak_tray_unittest.cc b/ash/system/accessibility/select_to_speak/select_to_speak_tray_unittest.cc index 8537635..22f551b 100644 --- a/ash/system/accessibility/select_to_speak/select_to_speak_tray_unittest.cc +++ b/ash/system/accessibility/select_to_speak/select_to_speak_tray_unittest.cc
@@ -16,9 +16,12 @@ #include "base/command_line.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/scoped_feature_list.h" +#include "ui/accessibility/accessibility_features.h" #include "ui/accessibility/ax_node_data.h" #include "ui/base/ime/ash/ime_bridge.h" #include "ui/base/ime/text_input_flags.h" +#include "ui/base/l10n/l10n_util.h" #include "ui/events/event.h" #include "ui/gfx/image/image_unittest_util.h" #include "ui/gfx/paint_vector_icon.h" @@ -142,6 +145,72 @@ *actual_icon_image.bitmap())); } +// Test that changing the SelectToSpeakState in the AccessibilityController +// results in a change of tooltip text in the tray, when hover text improvements +// are enabled. +TEST_F(SelectToSpeakTrayTest, SelectToSpeakStateImpactsTooltipText) { + // Enable AccessibilitySelectToSpeakHoverTextImprovements feature. + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature( + ::features::kAccessibilitySelectToSpeakHoverTextImprovements); + + AccessibilityControllerImpl* controller = + Shell::Get()->accessibility_controller(); + controller->SetSelectToSpeakState( + SelectToSpeakState::kSelectToSpeakStateSelecting); + std::u16string expected_tooltip_text = l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK_INSTRUCTIONS); + std::u16string actual_tooltip_text = GetImageView()->GetTooltipText(); + EXPECT_TRUE(expected_tooltip_text == actual_tooltip_text); + + controller->SetSelectToSpeakState( + SelectToSpeakState::kSelectToSpeakStateSpeaking); + expected_tooltip_text = l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK_STOP_INSTRUCTIONS); + actual_tooltip_text = GetImageView()->GetTooltipText(); + EXPECT_TRUE(expected_tooltip_text == actual_tooltip_text); + + controller->SetSelectToSpeakState( + SelectToSpeakState::kSelectToSpeakStateInactive); + expected_tooltip_text = l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK); + actual_tooltip_text = GetImageView()->GetTooltipText(); + EXPECT_TRUE(expected_tooltip_text == actual_tooltip_text); +} +// Test that changing the SelectToSpeakState in the AccessibilityController +// results in a change of tooltip text in the tray, when hover text improvements +// are disabled. +TEST_F(SelectToSpeakTrayTest, + SelectToSpeakStateImpactsTooltipTextFeatureDisabled) { + // Disable AccessibilitySelectToSpeakHoverTextImprovements feature. + base::test::ScopedFeatureList feature_list; + feature_list.InitAndDisableFeature( + ::features::kAccessibilitySelectToSpeakHoverTextImprovements); + + AccessibilityControllerImpl* controller = + Shell::Get()->accessibility_controller(); + controller->SetSelectToSpeakState( + SelectToSpeakState::kSelectToSpeakStateSelecting); + std::u16string expected_tooltip_text = l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK); + std::u16string actual_tooltip_text = GetImageView()->GetTooltipText(); + EXPECT_TRUE(expected_tooltip_text == actual_tooltip_text); + + controller->SetSelectToSpeakState( + SelectToSpeakState::kSelectToSpeakStateSpeaking); + expected_tooltip_text = l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK); + actual_tooltip_text = GetImageView()->GetTooltipText(); + EXPECT_TRUE(expected_tooltip_text == actual_tooltip_text); + + controller->SetSelectToSpeakState( + SelectToSpeakState::kSelectToSpeakStateInactive); + expected_tooltip_text = l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SELECT_TO_SPEAK); + actual_tooltip_text = GetImageView()->GetTooltipText(); + EXPECT_TRUE(expected_tooltip_text == actual_tooltip_text); +} + // Trivial test to increase coverage of select_to_speak_tray.h. The // SelectToSpeakTray does not have a bubble, so these are empty functions. // Without this test, coverage of select_to_speak_tray.h is 0%.
diff --git a/ash/system/network/network_list_network_item_view_unittest.cc b/ash/system/network/network_list_network_item_view_unittest.cc index d8c56722..a2282999e 100644 --- a/ash/system/network/network_list_network_item_view_unittest.cc +++ b/ash/system/network/network_list_network_item_view_unittest.cc
@@ -68,7 +68,9 @@ void SetUp() override { AshTestBase::SetUp(); - feature_list_.InitAndEnableFeature(features::kQuickSettingsNetworkRevamp); + feature_list_.InitWithFeatures( + /*enabled_features=*/{features::kQuickSettingsNetworkRevamp}, + /*disabled_features=*/{features::kCaptivePortalUI2022}); SetUpDefaultNetworkDevices();
diff --git a/ash/webui/BUILD.gn b/ash/webui/BUILD.gn index 0e4ae77..8ce214a 100644 --- a/ash/webui/BUILD.gn +++ b/ash/webui/BUILD.gn
@@ -70,6 +70,7 @@ "//ash/webui/eche_app_ui:closure_compile", "//ash/webui/file_manager/resources:closure_compile", "//ash/webui/file_manager/untrusted_resources:closure_compile", + "//ash/webui/files_internals:closure_compile", "//ash/webui/firmware_update_ui:closure_compile", "//ash/webui/help_app_ui:closure_compile", "//ash/webui/media_app_ui:closure_compile",
diff --git a/ash/webui/common/resources/network/network_list_item.js b/ash/webui/common/resources/network/network_list_item.js index ce84276..8fa1ce1 100644 --- a/ash/webui/common/resources/network/network_list_item.js +++ b/ash/webui/common/resources/network/network_list_item.js
@@ -707,7 +707,7 @@ } // Warning is shown when there is restricted connectivity. - if (this.isCaptivePortalUI2022Enabled_ && + if (this.isCaptivePortalUI2022Enabled_ && this.networkState && OncMojo.isRestrictedConnectivity(this.networkState.portalState)) { return true; }
diff --git a/ash/webui/diagnostics_ui/resources/touchscreen_tester.ts b/ash/webui/diagnostics_ui/resources/touchscreen_tester.ts index 6a2e3ce..0aeb16c8 100644 --- a/ash/webui/diagnostics_ui/resources/touchscreen_tester.ts +++ b/ash/webui/diagnostics_ui/resources/touchscreen_tester.ts
@@ -143,6 +143,25 @@ this.drawingProvider.drawTrail( touchPt.x - 1, touchPt.y, touchPt.x, touchPt.y, pressure); } + + /** + * Handle when a 'touchmove' event is fired from Touch API, or an existing + * touch moves from evdev. + * @param touchId The identifier of a touch. + * @param touchPt The coordinates of a touch point. + * @param pressure The pressure of a touch. + */ + onDraw(touchId: number, touchPt: Point, pressure: number): void { + // Previous point of this touch. + const previousPt = this.touches.get(touchId); + if (previousPt) { + this.drawingProvider.drawTrail( + previousPt.x, previousPt.y, touchPt.x, touchPt.y, pressure); + } + + // Update the coordinates of this touch. + this.touches.set(touchId, touchPt); + } } declare global {
diff --git a/ash/webui/files_internals/BUILD.gn b/ash/webui/files_internals/BUILD.gn index 0e8fb659..e9480d3 100644 --- a/ash/webui/files_internals/BUILD.gn +++ b/ash/webui/files_internals/BUILD.gn
@@ -3,6 +3,8 @@ # found in the LICENSE file. import("//build/config/chromeos/ui_mode.gni") +import("//third_party/closure_compiler/compile_js.gni") +import("//ui/webui/resources/tools/generate_grd.gni") assert(is_chromeos_ash, "Files Internals is ash-chrome only") @@ -10,13 +12,59 @@ sources = [ "files_internals.cc", "files_internals.h", + "files_internals_page_handler.cc", + "files_internals_page_handler.h", "files_internals_ui_delegate.h", "url_constants.cc", "url_constants.h", ] deps = [ + "//ash/webui/files_internals/mojom", + "//ash/webui/resources:files_internals_resources", "//content/public/browser", "//ui/webui", ] } + +js_type_check("closure_compile") { + deps = [ ":js" ] + closure_flags = default_closure_args + mojom_js_args +} + +js_library("js") { + sources = [ "resources/index.js" ] + deps = [ "//ash/webui/files_internals/mojom:mojom_webui_js" ] +} + +grd_prefix = "ash_files_internals" + +mojo_grdp = "$target_gen_dir/files_internals_mojo_resources.grdp" + +generate_grd("build_mojo_grdp") { + grd_prefix = grd_prefix + out_grd = mojo_grdp + + deps = [ "//ash/webui/files_internals/mojom:mojom_webui_js" ] + + # Flatten out the dependency tree of your mojom and add generated bindings + # file here. + input_files = + [ "ash/webui/files_internals/mojom/files_internals.mojom-webui.js" ] + + input_files_base_dir = + rebase_path("$root_gen_dir/mojom-webui", "$root_build_dir") +} + +generate_grd("build_grd") { + input_files_base_dir = rebase_path("resources", "//") + input_files = [ + "index.html", + "index.js", + ] + + grd_prefix = grd_prefix + out_grd = "$target_gen_dir/${grd_prefix}_resources.grd" + deps = [ ":build_mojo_grdp" ] + grdp_files = [ mojo_grdp ] +}
diff --git a/ash/webui/files_internals/files_internals.cc b/ash/webui/files_internals/files_internals.cc index 79cdb0e..1751c338b 100644 --- a/ash/webui/files_internals/files_internals.cc +++ b/ash/webui/files_internals/files_internals.cc
@@ -5,6 +5,8 @@ #include "ash/webui/files_internals/files_internals.h" #include "ash/webui/files_internals/url_constants.h" +#include "ash/webui/grit/ash_files_internals_resources.h" +#include "ash/webui/grit/ash_files_internals_resources_map.h" #include "base/memory/ref_counted_memory.h" #include "content/public/browser/web_contents.h" @@ -18,36 +20,44 @@ content::WebUIDataSource::CreateAndAdd( web_ui->GetWebContents()->GetBrowserContext(), kChromeUIFilesInternalsHost); + data_source->AddResourcePath("", IDR_ASH_FILES_INTERNALS_INDEX_HTML); + data_source->AddResourcePaths(base::make_span( + kAshFilesInternalsResources, kAshFilesInternalsResourcesSize)); + SetRequestFilterDebugJson(data_source); +} - auto should_handle_request_callback = - base::BindRepeating([](const std::string&) -> bool { return true; }); +FilesInternalsUI::~FilesInternalsUI() = default; - auto handle_request_callback = base::BindRepeating( - &FilesInternalsUI::HandleRequest, weak_ptr_factory_.GetWeakPtr()); +void FilesInternalsUI::BindInterface( + mojo::PendingReceiver<mojom::files_internals::PageHandler> receiver) { + page_handler_ = + std::make_unique<FilesInternalsPageHandler>(this, std::move(receiver)); +} + +FilesInternalsUIDelegate* FilesInternalsUI::delegate() { + return delegate_.get(); +} + +void FilesInternalsUI::SetRequestFilterDebugJson( + content::WebUIDataSource* data_source) { + auto should_handle_request_callback = base::BindRepeating( + [](const std::string& url) -> bool { return url == "debug.json"; }); + + auto handle_request_callback = + base::BindRepeating(&FilesInternalsUI::HandleRequestDebugJson, + weak_ptr_factory_.GetWeakPtr()); data_source->SetRequestFilter(std::move(should_handle_request_callback), std::move(handle_request_callback)); } -FilesInternalsUI::~FilesInternalsUI() = default; - -WEB_UI_CONTROLLER_TYPE_IMPL(FilesInternalsUI) - -void FilesInternalsUI::HandleRequest( +void FilesInternalsUI::HandleRequestDebugJson( const std::string& url, content::WebUIDataSource::GotDataCallback callback) { - // The content type is derived from the string url, so redirect an empty url - // to "debug.json". - if (url.empty()) { - std::string s( - "<html><head><meta " - "http-equiv=refresh content=\"0; url='debug.json'\"/></head></html>"); - std::move(callback).Run(base::RefCountedString::TakeString(&s)); - return; - } - std::string s = delegate_->GetDebugJSON().DebugString(); std::move(callback).Run(base::RefCountedString::TakeString(&s)); } +WEB_UI_CONTROLLER_TYPE_IMPL(FilesInternalsUI) + } // namespace ash
diff --git a/ash/webui/files_internals/files_internals.h b/ash/webui/files_internals/files_internals.h index 4e88545..866e3022 100644 --- a/ash/webui/files_internals/files_internals.h +++ b/ash/webui/files_internals/files_internals.h
@@ -5,7 +5,9 @@ #ifndef ASH_WEBUI_FILES_INTERNALS_FILES_INTERNALS_H_ #define ASH_WEBUI_FILES_INTERNALS_FILES_INTERNALS_H_ +#include "ash/webui/files_internals/files_internals_page_handler.h" #include "ash/webui/files_internals/files_internals_ui_delegate.h" +#include "ash/webui/files_internals/mojom/files_internals.mojom.h" #include "base/memory/weak_ptr.h" #include "content/public/browser/web_ui_data_source.h" #include "ui/webui/mojo_web_ui_controller.h" @@ -21,13 +23,21 @@ FilesInternalsUI& operator=(const FilesInternalsUI&) = delete; ~FilesInternalsUI() override; + void BindInterface( + mojo::PendingReceiver<mojom::files_internals::PageHandler> receiver); + + FilesInternalsUIDelegate* delegate(); + private: - void HandleRequest(const std::string& url, - content::WebUIDataSource::GotDataCallback callback); + void SetRequestFilterDebugJson(content::WebUIDataSource* data_source); + void HandleRequestDebugJson( + const std::string& url, + content::WebUIDataSource::GotDataCallback callback); WEB_UI_CONTROLLER_TYPE_DECL(); std::unique_ptr<FilesInternalsUIDelegate> delegate_; + std::unique_ptr<FilesInternalsPageHandler> page_handler_; base::WeakPtrFactory<FilesInternalsUI> weak_ptr_factory_{this}; };
diff --git a/ash/webui/files_internals/files_internals_page_handler.cc b/ash/webui/files_internals/files_internals_page_handler.cc new file mode 100644 index 0000000..a74ec495 --- /dev/null +++ b/ash/webui/files_internals/files_internals_page_handler.cc
@@ -0,0 +1,29 @@ +// 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 "ash/webui/files_internals/files_internals_page_handler.h" + +#include "ash/webui/files_internals/files_internals.h" + +namespace ash { + +FilesInternalsPageHandler::FilesInternalsPageHandler( + FilesInternalsUI* files_internals_ui, + mojo::PendingReceiver<mojom::files_internals::PageHandler> receiver) + : files_internals_ui_(files_internals_ui), + receiver_(this, std::move(receiver)) {} + +FilesInternalsPageHandler::~FilesInternalsPageHandler() = default; + +void FilesInternalsPageHandler::GetSmbfsEnableVerboseLogging( + GetSmbfsEnableVerboseLoggingCallback callback) { + std::move(callback).Run( + files_internals_ui_->delegate()->GetSmbfsEnableVerboseLogging()); +} + +void FilesInternalsPageHandler::SetSmbfsEnableVerboseLogging(bool enabled) { + files_internals_ui_->delegate()->SetSmbfsEnableVerboseLogging(enabled); +} + +} // namespace ash
diff --git a/ash/webui/files_internals/files_internals_page_handler.h b/ash/webui/files_internals/files_internals_page_handler.h new file mode 100644 index 0000000..7727672 --- /dev/null +++ b/ash/webui/files_internals/files_internals_page_handler.h
@@ -0,0 +1,40 @@ +// 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 ASH_WEBUI_FILES_INTERNALS_FILES_INTERNALS_PAGE_HANDLER_H_ +#define ASH_WEBUI_FILES_INTERNALS_FILES_INTERNALS_PAGE_HANDLER_H_ + +#include "ash/webui/files_internals/mojom/files_internals.mojom.h" +#include "base/memory/raw_ptr.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver.h" + +namespace ash { + +class FilesInternalsUI; + +// Implements the mojom::files_internals::PageHandler interface. +class FilesInternalsPageHandler : public mojom::files_internals::PageHandler { + public: + FilesInternalsPageHandler( + FilesInternalsUI* files_internals_ui, + mojo::PendingReceiver<mojom::files_internals::PageHandler> receiver); + FilesInternalsPageHandler(const FilesInternalsPageHandler&) = delete; + FilesInternalsPageHandler& operator=(const FilesInternalsPageHandler&) = + delete; + ~FilesInternalsPageHandler() override; + + // mojom::files_internals::PageHandler overrides. + void GetSmbfsEnableVerboseLogging( + GetSmbfsEnableVerboseLoggingCallback callback) override; + void SetSmbfsEnableVerboseLogging(bool enabled) override; + + private: + raw_ptr<FilesInternalsUI> files_internals_ui_; // Owns |this|. + mojo::Receiver<mojom::files_internals::PageHandler> receiver_; +}; + +} // namespace ash + +#endif // ASH_WEBUI_FILES_INTERNALS_FILES_INTERNALS_PAGE_HANDLER_H_
diff --git a/ash/webui/files_internals/files_internals_ui_delegate.h b/ash/webui/files_internals/files_internals_ui_delegate.h index fe0e596..d4c76f2 100644 --- a/ash/webui/files_internals/files_internals_ui_delegate.h +++ b/ash/webui/files_internals/files_internals_ui_delegate.h
@@ -15,6 +15,9 @@ virtual ~FilesInternalsUIDelegate() = default; virtual base::Value GetDebugJSON() const = 0; + + virtual bool GetSmbfsEnableVerboseLogging() const = 0; + virtual void SetSmbfsEnableVerboseLogging(bool enabled) = 0; }; } // namespace ash
diff --git a/ash/webui/files_internals/mojom/BUILD.gn b/ash/webui/files_internals/mojom/BUILD.gn new file mode 100644 index 0000000..8c7a1d0 --- /dev/null +++ b/ash/webui/files_internals/mojom/BUILD.gn
@@ -0,0 +1,14 @@ +# Copyright 2022 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/chromeos/ui_mode.gni") +import("//mojo/public/tools/bindings/mojom.gni") + +assert(is_chromeos_ash, "Files Internals is ash-chrome only") + +mojom("mojom") { + sources = [ "files_internals.mojom" ] + + webui_module_path = "/ash/webui/files_internals/mojom/" +}
diff --git a/ash/webui/files_internals/mojom/OWNERS b/ash/webui/files_internals/mojom/OWNERS new file mode 100644 index 0000000..08850f4 --- /dev/null +++ b/ash/webui/files_internals/mojom/OWNERS
@@ -0,0 +1,2 @@ +per-file *.mojom=set noparent +per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/ash/webui/files_internals/mojom/files_internals.mojom b/ash/webui/files_internals/mojom/files_internals.mojom new file mode 100644 index 0000000..3140ee5 --- /dev/null +++ b/ash/webui/files_internals/mojom/files_internals.mojom
@@ -0,0 +1,13 @@ +// 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. + +module ash.mojom.files_internals; + +// Interface for getting file-system-related information. +interface PageHandler { + // Gets the smbfs.enable_verbose_logging pref. + GetSmbfsEnableVerboseLogging() => (bool enabled); + // Sets the smbfs.enable_verbose_logging pref. + SetSmbfsEnableVerboseLogging(bool enabled); +};
diff --git a/ash/webui/files_internals/resources/index.html b/ash/webui/files_internals/resources/index.html new file mode 100644 index 0000000..1b70d9e --- /dev/null +++ b/ash/webui/files_internals/resources/index.html
@@ -0,0 +1,27 @@ +<!-- 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. --> +<!DOCTYPE html> +<head> + <meta charset="utf-8"> + <title>Files Internals</title> + <script type="module" src="chrome://files-internals/index.js"></script> +</head> +<body> + +<h2>Links</h2> +<ul> +<li><a href="chrome://drive-internals/">chrome://drive-internals/</a> +<li><a href="debug.json">debug.json</a> +</ul> + +<h2>SMB</h2> +<div> +<label> +Verbose logging (restart after toggling) +<input type="checkbox" id="smb-verbose-logging-toggle"> +</label> +</div> + +</body> +</html>
diff --git a/ash/webui/files_internals/resources/index.js b/ash/webui/files_internals/resources/index.js new file mode 100644 index 0000000..77b5163 --- /dev/null +++ b/ash/webui/files_internals/resources/index.js
@@ -0,0 +1,16 @@ +// 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. + +import {PageHandler} from '/ash/webui/files_internals/mojom/files_internals.mojom-webui.js'; + +const pageHandler = PageHandler.getRemote(); + +document.addEventListener('DOMContentLoaded', async () => { + const verboseElem = document.getElementById('smb-verbose-logging-toggle'); + verboseElem.checked = + (await pageHandler.getSmbfsEnableVerboseLogging()).enabled; + verboseElem.addEventListener('change', (e) => { + pageHandler.setSmbfsEnableVerboseLogging(e.target.checked); + }); +});
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/local_images_element.html b/ash/webui/personalization_app/resources/js/wallpaper/local_images_element.html index 9a6a7ee..7ea39e2 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/local_images_element.html +++ b/ash/webui/personalization_app/resources/js/wallpaper/local_images_element.html
@@ -8,38 +8,26 @@ overflow-y: auto; width: 100%; } + </style> <main id="main" aria-label="$i18n{myImagesLabel}" tabindex="-1"> <iron-list items="[[imagesToDisplay_]]" grid role="listbox" aria-setsize$="[[imagesToDisplay_.length]]"> <template> - <div class="photo-container"> - <template is="dom-if" - if="[[isImageLoading_(item, imageDataLoading_)]]"> - <div tabindex$="[[tabIndex]]" role="option" - class="photo-inner-container placeholder" - style$="[[getLoadingPlaceholderAnimationDelay_(index)]]" - aria-posinset$="[[getAriaIndex_(index)]]" - aria-label="$i18n{ariaLabelLoading}" - aria-disabled="true"> - </div> - </template> - <template is="dom-if" if="[[isImageReady_(item, imageData_, imageDataLoading_)]]"> - <div class="photo-inner-container" role="option" - tabindex$="[[tabIndex]]" data-id$="[[getImageDataId_(item)]]" - on-click="onImageSelected_" on-keypress="onImageSelected_" - aria-posinset$="[[getAriaIndex_(index)]]" - aria-selected$="[[getAriaSelected_(item, currentSelected_, pendingSelected_)]]" - aria-label$="[[getAriaLabel_(item)]]"> - <div class="photo-images-container"> - <div class="photo-images-border"></div> - <img src="[[getImageData_(item, imageData_)]]" aria-hidden="true"> - <iron-icon icon="personalization:checkmark"></iron-icon> - </div> - </div> - </template> - </div> + <wallpaper-grid-item + aria-disabled$="[[isImageLoading_(item, imageDataLoading_)]]" + aria-label$="[[getAriaLabel_(item, imageDataLoading_)]]" + aria-posinset$="[[getAriaIndex_(index)]]" + data-id$="[[getImageDataId_(item)]]" + index="[[index]]" + on-click="onImageSelected_" + on-keypress="onImageSelected_" + role="option" + selected="[[isImageSelected_(item, currentSelected_, pendingSelected_)]]" + src="[[getImageData_(item, imageData_, imageDataLoading_)]]" + tabindex$="[[tabIndex]]"> + </wallpaper-grid-item> </template> </iron-list> </main>
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/local_images_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/local_images_element.ts index 0d9e30d..1462c104 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/local_images_element.ts +++ b/ash/webui/personalization_app/resources/js/wallpaper/local_images_element.ts
@@ -26,7 +26,7 @@ import {DefaultImageSymbol, DisplayableImage, kDefaultImageSymbol} from './constants.js'; import {getTemplate} from './local_images_element.html.js'; -import {getLoadingPlaceholderAnimationDelay, getPathOrSymbol, isDefaultImage, isFilePath} from './utils.js'; +import {getPathOrSymbol, isDefaultImage, isFilePath} from './utils.js'; import {fetchLocalData, getDefaultImageThumbnail, selectWallpaper} from './wallpaper_controller.js'; import {getWallpaperProvider} from './wallpaper_interface_provider.js'; @@ -161,29 +161,31 @@ } } - private getAriaSelected_( + private isImageSelected_( image: FilePath|DefaultImageSymbol|null, currentSelected: LocalImages['currentSelected_'], - pendingSelected: LocalImages['pendingSelected_']): 'true'|'false' { + pendingSelected: LocalImages['pendingSelected_']): boolean { if (!image || (!currentSelected && !pendingSelected)) { - return 'false'; + return false; } if (isDefaultImage(image)) { - return ((isDefaultImage(pendingSelected)) || - (!pendingSelected && !!currentSelected && - currentSelected.type === WallpaperType.kDefault)) - .toString() as 'true' | - 'false'; + return ( + (isDefaultImage(pendingSelected)) || + (!pendingSelected && !!currentSelected && + currentSelected.type === WallpaperType.kDefault)); } - return (isFilePath(pendingSelected) && - image.path === pendingSelected.path || - !!currentSelected && image.path === currentSelected.key && - !pendingSelected) - .toString() as 'true' | - 'false'; + return ( + isFilePath(pendingSelected) && image.path === pendingSelected.path || + !!currentSelected && image.path === currentSelected.key && + !pendingSelected); } - private getAriaLabel_(image: FilePath|DefaultImageSymbol|null): string { + private getAriaLabel_( + image: FilePath|DefaultImageSymbol|null, + imageDataLoading: LocalImages['imageDataLoading_']): string { + if (this.isImageLoading_(image, imageDataLoading)) { + return this.i18n('ariaLabelLoading'); + } if (isDefaultImage(image)) { return this.i18n('defaultWallpaper'); } @@ -207,32 +209,25 @@ imageDataLoading[key] === true; } - private getLoadingPlaceholderAnimationDelay_(index: number): string { - return getLoadingPlaceholderAnimationDelay(index); - } - - private isImageReady_( + private getImageData_( image: FilePath|DefaultImageSymbol|null, imageData: LocalImages['imageData_'], - imageDataLoading: LocalImages['imageDataLoading_']): boolean { - if (!image || !imageData || !imageDataLoading) { - return false; + imageDataLoading: LocalImages['imageDataLoading_']): Url|null { + if (!image || this.isImageLoading_(image, imageDataLoading)) { + return null; } - const key = getPathOrSymbol(image); - return isPngDataUrl(imageData[key]) && imageDataLoading[key] === false; + const data = imageData[getPathOrSymbol(image)]; + // Return a "fail" url that will not load. + if (!isPngDataUrl(data)) { + return {url: ''}; + } + return data; } - private getImageData_( - image: FilePath|DefaultImageSymbol, - imageData: LocalImages['imageData_']): string { - if (!isPngDataUrl(imageData[getPathOrSymbol(image)])) { - console.error('Requested image data of an image that failed to load'); + private getImageDataId_(image: FilePath|DefaultImageSymbol|null): string { + if (!image) { return ''; } - return imageData[getPathOrSymbol(image)].url; - } - - private getImageDataId_(image: FilePath|DefaultImageSymbol): string { return isFilePath(image) ? image.path : image.toString(); }
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_grid_item_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_grid_item_element.ts index 1a76064f..da6b087 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_grid_item_element.ts +++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_grid_item_element.ts
@@ -72,10 +72,12 @@ /** * The source for the image to render for the grid item. Will display a - * placeholder loading animation if src is undefined. - * If |src| is an array, will display the first two images side by side. + * placeholder loading animation if `src` is undefined or null. + * `src` will be undefined if the attribute is not set, but can also be + * explicitly set to null to force showing a placeholder animation. + * If `src` is an array, will display the first two images side by side. */ - src: Url|Url[]|undefined; + src: Url|Url[]|null|undefined; /** The index of the grid item within its parent grid. */ index: number;
diff --git a/ash/webui/resources/BUILD.gn b/ash/webui/resources/BUILD.gn index 6e3c213e..d8295dcf 100644 --- a/ash/webui/resources/BUILD.gn +++ b/ash/webui/resources/BUILD.gn
@@ -86,6 +86,11 @@ deps = [ "//ash/webui/personalization_app/resources:build_grd" ] } +ash_generated_grit("files_internals_resources") { + source = "$root_gen_dir/ash/webui/files_internals/ash_files_internals_resources.grd" + deps = [ "//ash/webui/files_internals:build_grd" ] +} + ash_generated_grit("firmware_update_app_resources") { firmware_update_app_gen_dir = "$root_gen_dir/ash/webui/firmware_update_ui/resources"
diff --git a/ash/wm/float/float_controller_unittest.cc b/ash/wm/float/float_controller_unittest.cc index abe7c0b..643594dd 100644 --- a/ash/wm/float/float_controller_unittest.cc +++ b/ash/wm/float/float_controller_unittest.cc
@@ -22,6 +22,7 @@ #include "ash/wm/desks/desks_bar_view.h" #include "ash/wm/desks/desks_test_api.h" #include "ash/wm/desks/desks_test_util.h" +#include "ash/wm/float/tablet_mode_float_window_resizer.h" #include "ash/wm/mru_window_tracker.h" #include "ash/wm/overview/overview_controller.h" #include "ash/wm/overview/overview_grid.h" @@ -48,6 +49,8 @@ #include "ui/compositor/scoped_animation_duration_scale_mode.h" #include "ui/display/display_switches.h" #include "ui/display/test/display_manager_test_api.h" +#include "ui/gfx/geometry/vector2d.h" +#include "ui/gfx/geometry/vector2d_f.h" #include "ui/views/controls/button/label_button.h" #include "ui/views/test/test_widget_observer.h" #include "ui/views/test/views_test_utils.h" @@ -55,8 +58,8 @@ namespace ash { -// Gets the frame for `window` and prepares it for dragging. -NonClientFrameViewAsh* SetUpAndGetFrame(aura::Window* window) { +// Gets the header view for `window` so it can be dragged. +HeaderView* GetHeaderView(aura::Window* window) { // Exiting immersive mode because of float does not seem to trigger a layout // like it does in production code. Here we force a layout, otherwise the // client view will remain the size of the widget, and dragging it will give @@ -64,7 +67,7 @@ auto* frame = NonClientFrameViewAsh::Get(window); DCHECK(frame); views::test::RunScheduledLayout(frame); - return frame; + return frame->GetHeaderView(); } // Checks if `window` is being visibly animating. That means windows that are @@ -129,8 +132,7 @@ std::unique_ptr<aura::Window> window = CreateFloatedWindow(); // Double click on the caption. The window should be maximized now. - auto* frame = NonClientFrameViewAsh::Get(window.get()); - HeaderView* header_view = frame->GetHeaderView(); + HeaderView* header_view = GetHeaderView(window.get()); auto* event_generator = GetEventGenerator(); event_generator->set_current_screen_location( header_view->GetBoundsInScreen().CenterPoint()); @@ -549,9 +551,8 @@ // right. Verify that it is underneath the docked magnifier region. Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); ASSERT_TRUE(WindowState::Get(window.get())->IsFloated()); - NonClientFrameViewAsh* frame = SetUpAndGetFrame(window.get()); GetEventGenerator()->GestureScrollSequence( - frame->GetHeaderView()->GetBoundsInScreen().CenterPoint(), + GetHeaderView(window.get())->GetBoundsInScreen().CenterPoint(), gfx::Point(1000, 300), base::Seconds(3), /*steps=*/10); EXPECT_GT(window->GetBoundsInScreen().y(), @@ -565,18 +566,67 @@ TabletWindowFloatTest& operator=(const TabletWindowFloatTest&) = delete; ~TabletWindowFloatTest() override = default; - // Flings a window to the top left or top right of the work area. - void FlingWindow(aura::Window* window, bool left) { - NonClientFrameViewAsh* frame = SetUpAndGetFrame(window); - const gfx::Point header_center = - frame->GetHeaderView()->GetBoundsInScreen().CenterPoint(); - const gfx::Rect work_area = - WorkAreaInsets::ForWindow(window->GetRootWindow()) - ->user_work_area_bounds(); + // Flings a window in the direction provided by `left` and `up`. + void FlingWindow(aura::Window* window, bool left, bool up) { + const gfx::Point start = + GetHeaderView(window)->GetBoundsInScreen().CenterPoint(); + const gfx::Vector2d offset(left ? -10 : 10, up ? -10 : 10); GetEventGenerator()->GestureScrollSequence( - header_center, - left ? header_center - gfx::Vector2d(10, 10) : work_area.top_right(), - base::Milliseconds(10), /*steps=*/2); + start, start + offset, base::Milliseconds(10), /*steps=*/1); + } + + // Drags `window` so that it magnetizes to `corner`. + void MagnetizeWindow(aura::Window* window, + FloatController::MagnetismCorner corner) { + // Drag to a point outside of `kScreenEdgeInsetForSnap` from the edge of the + // screen to avoid snapping. + gfx::Rect area = WorkAreaInsets::ForWindow(window)->user_work_area_bounds(); + area.Inset(kScreenEdgeInsetForSnap + 5); + + gfx::Point end; + switch (corner) { + case FloatController::MagnetismCorner::kTopLeft: + end = area.origin(); + break; + case FloatController::MagnetismCorner::kBottomLeft: + end = area.bottom_left(); + break; + case FloatController::MagnetismCorner::kTopRight: + end = area.top_right(); + break; + case FloatController::MagnetismCorner::kBottomRight: + end = area.bottom_right(); + break; + } + GetEventGenerator()->GestureScrollSequence( + GetHeaderView(window)->GetBoundsInScreen().CenterPoint(), end, + base::Milliseconds(100), /*steps=*/3); + } + + // Checks that `window` has been magnetized in `corner`. + void CheckMagnetized(aura::Window* window, + FloatController::MagnetismCorner corner) { + const gfx::Rect work_area = + WorkAreaInsets::ForWindow(window)->user_work_area_bounds(); + const int padding = chromeos::wm::kFloatedWindowPaddingDp; + switch (corner) { + case FloatController::MagnetismCorner::kTopLeft: + EXPECT_EQ(gfx::Point(padding, padding), window->bounds().origin()); + return; + case FloatController::MagnetismCorner::kBottomLeft: + EXPECT_EQ(gfx::Point(padding, work_area.bottom() - padding), + window->bounds().bottom_left()); + return; + case FloatController::MagnetismCorner::kTopRight: + EXPECT_EQ(gfx::Point(work_area.right() - padding, padding), + window->bounds().top_right()); + return; + case FloatController::MagnetismCorner::kBottomRight: + EXPECT_EQ(gfx::Point(work_area.right() - padding, + work_area.bottom() - padding), + window->bounds().bottom_right()); + return; + } } // WindowFloatTest: @@ -800,12 +850,11 @@ Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); std::unique_ptr<aura::Window> window = CreateFloatedWindow(); - NonClientFrameViewAsh* frame = SetUpAndGetFrame(window.get()); // Start dragging in the center of the header. When moving the touch, the // header should move with the touch such that the touch remains in the center // of the header. - HeaderView* header_view = frame->GetHeaderView(); + HeaderView* header_view = GetHeaderView(window.get()); auto* event_generator = GetEventGenerator(); event_generator->PressTouch(header_view->GetBoundsInScreen().CenterPoint()); @@ -827,7 +876,6 @@ Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); std::unique_ptr<aura::Window> window = CreateFloatedWindow(); - NonClientFrameViewAsh* frame = SetUpAndGetFrame(window.get()); const int padding = chromeos::wm::kFloatedWindowPaddingDp; const int shelf_size = ShelfConfig::Get()->shelf_size(); @@ -835,32 +883,28 @@ // The default location is in the bottom right. EXPECT_EQ(gfx::Point(1600 - padding, 1000 - padding - shelf_size), window->bounds().bottom_right()); + CheckMagnetized(window.get(), FloatController::MagnetismCorner::kBottomRight); + + // Test no change if we drag it in the bottom right. + MagnetizeWindow(window.get(), FloatController::MagnetismCorner::kBottomRight); + CheckMagnetized(window.get(), FloatController::MagnetismCorner::kBottomRight); // Move the mouse somewhere in the top right, but not too right that it falls - // into the snap region. Test that on release, it magnetizes to the top right. - HeaderView* header_view = frame->GetHeaderView(); - auto* event_generator = GetEventGenerator(); - event_generator->set_current_screen_location( - header_view->GetBoundsInScreen().CenterPoint()); - event_generator->DragMouseTo(1490, 10); - EXPECT_EQ(gfx::Point(1600 - padding, padding), window->bounds().top_right()); + // into the snap region. Test that on release, it magnetizes to the top right + MagnetizeWindow(window.get(), FloatController::MagnetismCorner::kTopRight); + CheckMagnetized(window.get(), FloatController::MagnetismCorner::kTopRight); // Move the mouse to somewhere in the top left, but not too left that it falls // into the snap region. Test that on release, it magnetizes to the top left. - event_generator->set_current_screen_location( - header_view->GetBoundsInScreen().CenterPoint()); - event_generator->DragMouseTo(110, 10); - EXPECT_EQ(gfx::Point(padding, padding), window->bounds().origin()); + MagnetizeWindow(window.get(), FloatController::MagnetismCorner::kTopLeft); + CheckMagnetized(window.get(), FloatController::MagnetismCorner::kTopLeft); // Switch to portrait orientation and move the mouse somewhere in the bottom // left, but not too bottom that it falls into the snap region. Test that on // release, it magentizes to the bottom left. UpdateDisplay("1000x1600"); - event_generator->set_current_screen_location( - header_view->GetBoundsInScreen().CenterPoint()); - event_generator->DragMouseTo(110, 1490); - EXPECT_EQ(gfx::Point(padding, 1600 - shelf_size - padding), - window->bounds().bottom_left()); + MagnetizeWindow(window.get(), FloatController::MagnetismCorner::kBottomLeft); + CheckMagnetized(window.get(), FloatController::MagnetismCorner::kBottomLeft); } // Tests that if a floating window is dragged to the edges, it will snap. @@ -871,7 +915,6 @@ Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); std::unique_ptr<aura::Window> window = CreateFloatedWindow(); - NonClientFrameViewAsh* frame = SetUpAndGetFrame(window.get()); auto* split_view_controller = SplitViewController::Get(Shell::GetPrimaryRootWindow()); @@ -880,7 +923,7 @@ // Move the mouse to towards the right edge. Test that on release, it snaps // right. - HeaderView* header_view = frame->GetHeaderView(); + HeaderView* header_view = GetHeaderView(window.get()); auto* event_generator = GetEventGenerator(); event_generator->set_current_screen_location( header_view->GetBoundsInScreen().CenterPoint()); @@ -900,27 +943,15 @@ EXPECT_EQ(split_view_controller->primary_window(), window.get()); } -// Tests the functionality of tucking a window in tablet mode. -TEST_F(TabletWindowFloatTest, TuckedWindowTopLeft) { +TEST_F(TabletWindowFloatTest, UntuckWindowOnExitTabletMode) { Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); - + // The window is magnetized to the bottom right by default. std::unique_ptr<aura::Window> window = CreateFloatedWindow(); - // Fling the window to the top left. Tests that the window is tucked. - FlingWindow(window.get(), /*left=*/true); - + // Fling to tuck the window in the bottom right. auto* float_controller = Shell::Get()->float_controller(); - EXPECT_TRUE(float_controller->IsFloatedWindowTuckedForTablet(window.get())); - EXPECT_EQ(0, window->bounds().right()); - - // Verify that the handle is aligned with the tucked window. - views::Widget* tuck_handle_widget = - float_controller->GetTuckHandleWidget(window.get()); - ASSERT_TRUE(tuck_handle_widget); - EXPECT_EQ(window->bounds().right(), - tuck_handle_widget->GetWindowBoundsInScreen().x()); - EXPECT_EQ(window->bounds().CenterPoint().y(), - tuck_handle_widget->GetWindowBoundsInScreen().CenterPoint().y()); + FlingWindow(window.get(), /*left=*/false, /*up=*/false); + ASSERT_TRUE(float_controller->IsFloatedWindowTuckedForTablet(window.get())); // Tests that after we exit tablet mode, the window is untucked and fully // visible, but is still floated. @@ -930,59 +961,92 @@ .Contains(window->bounds())); } -TEST_F(TabletWindowFloatTest, TuckedWindowTopRight) { - Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); +// Tests the functionality of tucking a window in tablet mode. +TEST_F(TabletWindowFloatTest, TuckWindowLeft) { + UpdateDisplay("1600x1000"); + Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); std::unique_ptr<aura::Window> window = CreateFloatedWindow(); - // Fling the window to the top right. Tests that the window is tucked. - FlingWindow(window.get(), /*left=*/false); + // Magnetize the window to the top left. + MagnetizeWindow(window.get(), FloatController::MagnetismCorner::kTopLeft); auto* float_controller = Shell::Get()->float_controller(); - EXPECT_TRUE(float_controller->IsFloatedWindowTuckedForTablet(window.get())); + + // Fling the window left and up. Test that it tucks in the top left. + FlingWindow(window.get(), /*left=*/true, /*up=*/true); + ASSERT_TRUE(float_controller->IsFloatedWindowTuckedForTablet(window.get())); + const int padding = chromeos::wm::kFloatedWindowPaddingDp; + EXPECT_EQ(gfx::Point(0, padding), window->bounds().top_right()); + + // Test that the tuck handle is aligned with the window. + views::Widget* tuck_handle_widget = + float_controller->GetTuckHandleWidget(window.get()); + ASSERT_TRUE(tuck_handle_widget); + EXPECT_EQ(window->bounds().right_center(), + tuck_handle_widget->GetWindowBoundsInScreen().left_center()); + + // Untuck the window. Test that it magnetizes to the top left. + GestureTapOn(tuck_handle_widget->GetContentsView()); + ASSERT_FALSE(float_controller->IsFloatedWindowTuckedForTablet(window.get())); + CheckMagnetized(window.get(), FloatController::MagnetismCorner::kTopLeft); + + // Fling the window left and down. Test that it tucks in the bottom left. + FlingWindow(window.get(), /*left=*/true, /*up=*/false); + ASSERT_TRUE(float_controller->IsFloatedWindowTuckedForTablet(window.get())); + const gfx::Rect work_area = WorkAreaInsets::ForWindow(window->GetRootWindow()) + ->user_work_area_bounds(); + EXPECT_EQ(gfx::Point(0, work_area.bottom() - padding), + window->bounds().bottom_right()); + + // Untuck the window. Test that it magnetizes to the bottom left. + tuck_handle_widget = float_controller->GetTuckHandleWidget(window.get()); + GestureTapOn(tuck_handle_widget->GetContentsView()); + ASSERT_FALSE(float_controller->IsFloatedWindowTuckedForTablet(window.get())); + CheckMagnetized(window.get(), FloatController::MagnetismCorner::kBottomLeft); +} + +// Tests the functionality of tucking a window in tablet mode. +TEST_F(TabletWindowFloatTest, TuckWindowRight) { + UpdateDisplay("1600x1000"); + + Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); + // The window is magnetized to the bottom right by default. + std::unique_ptr<aura::Window> window = CreateFloatedWindow(); + auto* float_controller = Shell::Get()->float_controller(); const gfx::Rect work_area = WorkAreaInsets::ForWindow(window->GetRootWindow()) ->user_work_area_bounds(); - EXPECT_EQ(work_area.right(), window->bounds().x()); - // Verify that the handle is aligned with the tucked window. - views::Widget* tuck_handle_widget = - float_controller->GetTuckHandleWidget(window.get()); - ASSERT_TRUE(tuck_handle_widget); - EXPECT_EQ(window->bounds().x(), - tuck_handle_widget->GetWindowBoundsInScreen().right()); - EXPECT_EQ(window->bounds().CenterPoint().y(), - tuck_handle_widget->GetWindowBoundsInScreen().CenterPoint().y()); -} - -// Tests the functionality of untucking a window in tablet mode. -TEST_F(TabletWindowFloatTest, UntuckWindow) { - Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); - - std::unique_ptr<aura::Window> window = CreateFloatedWindow(); - - FlingWindow(window.get(), /*left=*/true); - - // Tuck the window to the top left. - auto* float_controller = Shell::Get()->float_controller(); + // Fling the window right and up. Test that it tucks in the top right. + FlingWindow(window.get(), /*left=*/false, /*up=*/true); ASSERT_TRUE(float_controller->IsFloatedWindowTuckedForTablet(window.get())); + const int padding = chromeos::wm::kFloatedWindowPaddingDp; + EXPECT_EQ(gfx::Point(work_area.right(), padding), window->bounds().origin()); + + // Test that the tuck handle is aligned with the window. views::Widget* tuck_handle_widget = float_controller->GetTuckHandleWidget(window.get()); ASSERT_TRUE(tuck_handle_widget); + EXPECT_EQ(window->bounds().left_center(), + tuck_handle_widget->GetWindowBoundsInScreen().right_center()); - // Tap on the tuck handle. Verify that the window is untucked. + // Untuck the window. Test that it magnetizes to the top right. GestureTapOn(tuck_handle_widget->GetContentsView()); - EXPECT_FALSE(float_controller->IsFloatedWindowTuckedForTablet(window.get())); + ASSERT_FALSE(float_controller->IsFloatedWindowTuckedForTablet(window.get())); + CheckMagnetized(window.get(), FloatController::MagnetismCorner::kTopRight); - // Tuck the window to the top right. - FlingWindow(window.get(), /*left=*/false); + // Fling the window right and down. Test that it tucks in the bottom right. + FlingWindow(window.get(), /*left=*/false, /*up=*/false); ASSERT_TRUE(float_controller->IsFloatedWindowTuckedForTablet(window.get())); + EXPECT_EQ(gfx::Point(work_area.right(), work_area.bottom() - padding), + window->bounds().bottom_left()); + + // Untuck the window. Test that it magnetizes to the bottom right. tuck_handle_widget = float_controller->GetTuckHandleWidget(window.get()); - ASSERT_TRUE(tuck_handle_widget); - - // Tap on the tuck handle. Verify that the window is untucked. GestureTapOn(tuck_handle_widget->GetContentsView()); - EXPECT_FALSE(float_controller->IsFloatedWindowTuckedForTablet(window.get())); + ASSERT_FALSE(float_controller->IsFloatedWindowTuckedForTablet(window.get())); + CheckMagnetized(window.get(), FloatController::MagnetismCorner::kBottomRight); } using TabletWindowFloatSplitviewTest = TabletWindowFloatTest;
diff --git a/ash/wm/float/tablet_mode_float_window_resizer.cc b/ash/wm/float/tablet_mode_float_window_resizer.cc index c82cc64b..a1c2191 100644 --- a/ash/wm/float/tablet_mode_float_window_resizer.cc +++ b/ash/wm/float/tablet_mode_float_window_resizer.cc
@@ -27,13 +27,6 @@ // window has been dragged. constexpr int kDistanceFromEdge = 8; -// A window has to be dragged toward the direction of the edge of the screen for -// a minimum of `kMinDragDistance` to a point within `kScreenEdgeInsetForSnap` -// of the edge of the screen, or dragged inside `kDistanceEdge` from edge to be -// snapped. -constexpr int kMinDragDistance = 96; -constexpr int kScreenEdgeInsetForSnap = 48; - // The minimum distance that will be considered as a drag event. constexpr float kMinimumDragDistance = 5.f;
diff --git a/ash/wm/float/tablet_mode_float_window_resizer.h b/ash/wm/float/tablet_mode_float_window_resizer.h index 563c2d89..e85099a0 100644 --- a/ash/wm/float/tablet_mode_float_window_resizer.h +++ b/ash/wm/float/tablet_mode_float_window_resizer.h
@@ -13,6 +13,17 @@ class SplitViewDragIndicators; class WindowState; +// TODO(crbug.com/1351562): The following constants are the same the drag window +// from shelf feature. They need to be changed for this feature, or moved to a +// shared location. + +// A window has to be dragged toward the direction of the edge of the screen for +// a minimum of `kMinDragDistance` to a point within `kScreenEdgeInsetForSnap` +// of the edge of the screen, or dragged inside `kDistanceEdge` from edge to be +// snapped. +constexpr int kMinDragDistance = 96; +constexpr int kScreenEdgeInsetForSnap = 48; + // WindowResizer implementation for floated windows in tablet mode. // TODO(crbug.com/1338715): This resizer adds the most basic dragging. It needs // to stick to edges and magnetize to corners on release.
diff --git a/base/task/thread_pool/pooled_single_thread_task_runner_manager.cc b/base/task/thread_pool/pooled_single_thread_task_runner_manager.cc index 0963b3a..76a2b6a 100644 --- a/base/task/thread_pool/pooled_single_thread_task_runner_manager.cc +++ b/base/task/thread_pool/pooled_single_thread_task_runner_manager.cc
@@ -17,6 +17,7 @@ #include "base/synchronization/atomic_flag.h" #include "base/task/default_delayed_task_handle_delegate.h" #include "base/task/single_thread_task_runner.h" +#include "base/task/task_features.h" #include "base/task/task_traits.h" #include "base/task/thread_pool/delayed_task_manager.h" #include "base/task/thread_pool/priority_queue.h" @@ -415,7 +416,8 @@ if (!g_manager_is_alive) return false; - Task task(from_here, std::move(closure), TimeTicks::Now(), delay); + Task task(from_here, std::move(closure), TimeTicks::Now(), delay, + base::GetTaskLeeway()); return PostTask(std::move(task)); } @@ -427,8 +429,8 @@ if (!g_manager_is_alive) return false; - Task task(from_here, std::move(closure), TimeTicks::Now(), - delayed_run_time); + Task task(from_here, std::move(closure), TimeTicks::Now(), delayed_run_time, + base::GetTaskLeeway(), delay_policy); return PostTask(std::move(task)); }
diff --git a/build/android/pylib/gtest/gtest_test_instance.py b/build/android/pylib/gtest/gtest_test_instance.py index d3bcb59..1ddad2b 100644 --- a/build/android/pylib/gtest/gtest_test_instance.py +++ b/build/android/pylib/gtest/gtest_test_instance.py
@@ -385,7 +385,7 @@ error_func('Could not find apk or executable for %s' % self._suite) self._data_deps = [] - self._gtest_filter = test_filter.InitializeFilterFromArgs(args) + self._gtest_filters = test_filter.InitializeFiltersFromArgs(args) self._run_disabled = args.run_disabled self._data_deps_delegate = data_deps_delegate @@ -474,8 +474,8 @@ return self._gs_test_artifacts_bucket @property - def gtest_filter(self): - return self._gtest_filter + def gtest_filters(self): + return self._gtest_filters @property def isolated_script_test_output(self): @@ -574,8 +574,8 @@ """ gtest_filter_strings = [ self._GenerateDisabledFilterString(disabled_prefixes)] - if self._gtest_filter: - gtest_filter_strings.append(self._gtest_filter) + if self._gtest_filters: + gtest_filter_strings.extend(self._gtest_filters) filtered_test_list = test_list # This lock is required because on older versions of Python @@ -586,12 +586,16 @@ filtered_test_list = unittest_util.FilterTestNames( filtered_test_list, gtest_filter_string) - if self._run_disabled and self._gtest_filter: + if self._run_disabled and self._gtest_filters: out_filtered_test_list = list(set(test_list)-set(filtered_test_list)) for test in out_filtered_test_list: test_name_no_disabled = TestNameWithoutDisabledPrefix(test) - if test_name_no_disabled != test and unittest_util.FilterTestNames( - [test_name_no_disabled], self._gtest_filter): + if test_name_no_disabled == test: + continue + if all( + unittest_util.FilterTestNames([test_name_no_disabled], + gtest_filter) + for gtest_filter in self._gtest_filters): filtered_test_list.append(test) return filtered_test_list
diff --git a/build/android/pylib/instrumentation/instrumentation_test_instance.py b/build/android/pylib/instrumentation/instrumentation_test_instance.py index 6e5c6dcc..6acb8cc 100644 --- a/build/android/pylib/instrumentation/instrumentation_test_instance.py +++ b/build/android/pylib/instrumentation/instrumentation_test_instance.py
@@ -231,7 +231,9 @@ return stack -def FilterTests(tests, filter_str=None, annotations=None, +def FilterTests(tests, + filter_strs=None, + annotations=None, excluded_annotations=None): """Filter a list of tests @@ -239,7 +241,7 @@ tests: a list of tests. e.g. [ {'annotations": {}, 'class': 'com.example.TestA', 'method':'test1'}, {'annotations": {}, 'class': 'com.example.TestB', 'method':'test2'}] - filter_str: googletest-style filter string. + filter_strs: list of googletest-style filter string. annotations: a dict of wanted annotations for test methods. excluded_annotations: a dict of annotations to exclude. @@ -341,21 +343,21 @@ filtered_tests.append(t) return filtered_tests - def gtests_filter(tests, combined_filter): - ''' Returns the tests after the filter_str has been applied + def gtests_filter(tests, combined_filters): + ''' Returns the tests after the combined_filters have been applied Args: tests: a list of tests. e.g. [ {'annotations": {}, 'class': 'com.example.TestA', 'method':'test1'}, {'annotations": {}, 'class': 'com.example.TestB', 'method':'test2'}] - combined_filter: the filter string representing tests to exclude + combined_filters: the filter string representing tests to exclude Return: - A list of tests that should still be included after the filter_str is - applied to their names + A list of tests that should still be included after the combined_filters + are applied to their names ''' - if not combined_filter: + if not combined_filters: return tests # Collect all test names @@ -366,20 +368,20 @@ for name in tests_to_names[id(t)]: all_test_names.add(name) - pattern_groups = filter_str.split('-') - negative_pattern = pattern_groups[1] if len(pattern_groups) > 1 else None - positive_pattern = pattern_groups[0] + for combined_filter in combined_filters: + pattern_groups = combined_filter.split('-') + negative_pattern = pattern_groups[1] if len(pattern_groups) > 1 else None + positive_pattern = pattern_groups[0] + if positive_pattern: + # Only use the test names that match the positive pattern + positive_test_names = test_names_from_pattern(positive_pattern, + all_test_names) + tests = get_tests_from_names(tests, positive_test_names, tests_to_names) - if positive_pattern: - # Only use the test names that match the positive pattern - positive_test_names = test_names_from_pattern(positive_pattern, - all_test_names) - tests = get_tests_from_names(tests, positive_test_names, tests_to_names) - - if negative_pattern: - # Remove any test the negative filter matches - remove_names = test_names_from_pattern(negative_pattern, all_test_names) - tests = remove_tests_from_names(tests, remove_names, tests_to_names) + if negative_pattern: + # Remove any test the negative filter matches + remove_names = test_names_from_pattern(negative_pattern, all_test_names) + tests = remove_tests_from_names(tests, remove_names, tests_to_names) return tests @@ -415,7 +417,7 @@ return filter_av == av return_tests = [] - for t in gtests_filter(tests, filter_str): + for t in gtests_filter(tests, filter_strs): # Enforce that all tests declare their size. if not any(a in _VALID_ANNOTATIONS for a in t['annotations']): raise MissingSizeAnnotationError(GetTestName(t)) @@ -611,7 +613,7 @@ self._annotations = None self._excluded_annotations = None - self._test_filter = None + self._test_filters = None self._initializeTestFilterAttributes(args) self._flags = None @@ -788,7 +790,7 @@ logging.warning('No data dependencies will be pushed.') def _initializeTestFilterAttributes(self, args): - self._test_filter = test_filter.InitializeFilterFromArgs(args) + self._test_filters = test_filter.InitializeFiltersFromArgs(args) def annotation_element(a): a = a.split('=', 1) @@ -797,7 +799,7 @@ if args.annotation_str: self._annotations = [ annotation_element(a) for a in args.annotation_str.split(',')] - elif not self._test_filter: + elif not self._test_filters: self._annotations = [ annotation_element(a) for a in _DEFAULT_ANNOTATIONS] else: @@ -1035,8 +1037,8 @@ return self._test_apk_incremental_install_json @property - def test_filter(self): - return self._test_filter + def test_filters(self): + return self._test_filters @property def test_launcher_batch_limit(self): @@ -1121,13 +1123,12 @@ if self._junit4_runner_class is None and any( t['is_junit4'] for t in inflated_tests): raise MissingJUnit4RunnerException() - filtered_tests = FilterTests( - inflated_tests, self._test_filter, self._annotations, - self._excluded_annotations) - if self._test_filter and not filtered_tests: + filtered_tests = FilterTests(inflated_tests, self._test_filters, + self._annotations, self._excluded_annotations) + if self._test_filters and not filtered_tests: for t in inflated_tests: logging.debug(' %s', GetUniqueTestName(t)) - logging.warning('Unmatched Filter: %s', self._test_filter) + logging.warning('Unmatched Filters: %s', self._test_filters) return filtered_tests def IsApkForceQueryable(self, apk):
diff --git a/build/android/pylib/instrumentation/instrumentation_test_instance_test.py b/build/android/pylib/instrumentation/instrumentation_test_instance_test.py index 0012c87..945c404 100755 --- a/build/android/pylib/instrumentation/instrumentation_test_instance_test.py +++ b/build/android/pylib/instrumentation/instrumentation_test_instance_test.py
@@ -190,7 +190,7 @@ }, ] - o._test_filter = 'org.chromium.test.SampleTest.testMethod1' + o._test_filters = ['org.chromium.test.SampleTest.testMethod1'] o._junit4_runner_class = 'J4Runner' actual_tests = o.ProcessRawTests(raw_tests) @@ -254,8 +254,78 @@ }, ] - o._test_filter = \ - 'org.chromium.test.SampleTest.*-org.chromium.test.SampleTest.testMethod2' + o._test_filters = [ + 'org.chromium.test.SampleTest.*'\ + '-org.chromium.test.SampleTest.testMethod2' + ] + o._junit4_runner_class = 'J4Runner' + actual_tests = o.ProcessRawTests(raw_tests) + + self.assertEqual(actual_tests, expected_tests) + + def testGetTests_multipleGtestPositiveAndNegativeFilter(self): + o = self.createTestInstance() + raw_tests = [{ + 'annotations': { + 'Feature': { + 'value': ['Foo'] + } + }, + 'class': + 'org.chromium.test.SampleTest', + 'superclass': + 'java.lang.Object', + 'methods': [ + { + 'annotations': { + 'SmallTest': None + }, + 'method': 'testMethod1', + }, + { + 'annotations': { + 'MediumTest': None + }, + 'method': 'testMethod2', + }, + ], + }, { + 'annotations': { + 'Feature': { + 'value': ['Foo'] + } + }, + 'class': + 'org.chromium.test.SampleTest2', + 'superclass': + 'java.lang.Object', + 'methods': [{ + 'annotations': { + 'SmallTest': None + }, + 'method': 'testMethod1', + }], + }] + + expected_tests = [ + { + 'annotations': { + 'Feature': { + 'value': ['Foo'] + }, + 'SmallTest': None, + }, + 'class': 'org.chromium.test.SampleTest', + 'is_junit4': True, + 'method': 'testMethod1', + }, + ] + + o._test_filters = [ + 'org.chromium.test.SampleTest*testMethod1', + 'org.chromium.test.SampleTest.*'\ + '-org.chromium.test.SampleTest.testMethod2' + ] o._junit4_runner_class = 'J4Runner' actual_tests = o.ProcessRawTests(raw_tests) @@ -293,7 +363,7 @@ }, ] - o._test_filter = 'SampleTest.testMethod1' + o._test_filters = ['SampleTest.testMethod1'] o._junit4_runner_class = 'J4Runner' actual_tests = o.ProcessRawTests(raw_tests) @@ -352,7 +422,7 @@ ] o._junit4_runner_class = 'J4Runner' - o._test_filter = 'org.chromium.test.SampleTest.testMethod1' + o._test_filters = ['org.chromium.test.SampleTest.testMethod1'] actual_tests = o.ProcessRawTests(raw_tests) self.assertEqual(actual_tests, expected_tests) @@ -400,7 +470,7 @@ }, ] - o._test_filter = 'org.chromium.test.SampleTest2.*' + o._test_filters = ['org.chromium.test.SampleTest2.*'] o._junit4_runner_class = 'J4Runner' actual_tests = o.ProcessRawTests(raw_tests) @@ -458,7 +528,7 @@ }, ] - o._test_filter = '*-org.chromium.test.SampleTest.testMethod1' + o._test_filters = ['*-org.chromium.test.SampleTest.testMethod1'] o._junit4_runner_class = 'J4Runner' actual_tests = o.ProcessRawTests(raw_tests)
diff --git a/build/android/pylib/junit/junit_test_instance.py b/build/android/pylib/junit/junit_test_instance.py index a64ae532..b33da1a6 100644 --- a/build/android/pylib/junit/junit_test_instance.py +++ b/build/android/pylib/junit/junit_test_instance.py
@@ -20,7 +20,7 @@ self._robolectric_runtime_deps_dir = args.robolectric_runtime_deps_dir self._runner_filter = args.runner_filter self._shards = args.shards - self._test_filter = test_filter.InitializeFilterFromArgs(args) + self._test_filters = test_filter.InitializeFiltersFromArgs(args) self._test_suite = args.test_suite #override @@ -64,8 +64,8 @@ return self._runner_filter @property - def test_filter(self): - return self._test_filter + def test_filters(self): + return self._test_filters @property def shards(self):
diff --git a/build/android/pylib/local/device/local_device_gtest_run.py b/build/android/pylib/local/device/local_device_gtest_run.py index 1ba510bb..190d17ee 100644 --- a/build/android/pylib/local/device/local_device_gtest_run.py +++ b/build/android/pylib/local/device/local_device_gtest_run.py
@@ -95,29 +95,39 @@ yield '%s_%d%s' % (base, i, ext) -def _ExtractTestsFromFilter(gtest_filter): - """Returns the list of tests specified by the given filter. +def _ExtractTestsFromFilters(gtest_filters): + """Returns the list of tests specified by the given filters. Returns: None if the device should be queried for the test list instead. """ - # Empty means all tests, - means exclude filter. - if not gtest_filter or '-' in gtest_filter: + # - means exclude filter. + for gtest_filter in gtest_filters: + if '-' in gtest_filter: + return None + # Empty means all tests + if not any(gtest_filters): return None - patterns = gtest_filter.split(':') - # For a single pattern, allow it even if it has a wildcard so long as the - # wildcard comes at the end and there is at least one . to prove the scope is - # not too large. - # This heuristic is not necessarily faster, but normally is. - if len(patterns) == 1 and patterns[0].endswith('*'): - no_suffix = patterns[0].rstrip('*') - if '*' not in no_suffix and '.' in no_suffix: - return patterns + if len(gtest_filters) == 1: + patterns = gtest_filters[0].split(':') + # For a single pattern, allow it even if it has a wildcard so long as the + # wildcard comes at the end and there is at least one . to prove the scope + # is not too large. + # This heuristic is not necessarily faster, but normally is. + if len(patterns) == 1 and patterns[0].endswith('*'): + no_suffix = patterns[0].rstrip('*') + if '*' not in no_suffix and '.' in no_suffix: + return patterns - if '*' in gtest_filter: - return None - return patterns + all_patterns = set(gtest_filters[0].split(':')) + for gtest_filter in gtest_filters: + patterns = gtest_filter.split(':') + for pattern in patterns: + if '*' in pattern: + return None + all_patterns = all_patterns.intersection(set(patterns)) + return list(all_patterns) def _GetDeviceTimeoutMultiplier(): @@ -593,7 +603,7 @@ # When the exact list of tests to run is given via command-line (e.g. when # locally iterating on a specific test), skip querying the device (which # takes ~3 seconds). - tests = _ExtractTestsFromFilter(self._test_instance.gtest_filter) + tests = _ExtractTestsFromFilters(self._test_instance.gtest_filters) if tests: return tests
diff --git a/build/android/pylib/local/device/local_device_gtest_run_test.py b/build/android/pylib/local/device/local_device_gtest_run_test.py index d56d48e..5a485c6b 100755 --- a/build/android/pylib/local/device/local_device_gtest_run_test.py +++ b/build/android/pylib/local/device/local_device_gtest_run_test.py
@@ -32,21 +32,27 @@ def testExtractTestsFromFilter(self): # Checks splitting by colons. - self.assertEqual([ - 'b17', - 'm4e3', - 'p51', - ], local_device_gtest_run._ExtractTestsFromFilter('b17:m4e3:p51')) + self.assertEqual( + set([ + 'm4e3', + 'p51', + 'b17', + ]), + set(local_device_gtest_run._ExtractTestsFromFilters(['b17:m4e3:p51']))) # Checks the '-' sign. - self.assertIsNone(local_device_gtest_run._ExtractTestsFromFilter('-mk2')) + self.assertIsNone(local_device_gtest_run._ExtractTestsFromFilters(['-mk2'])) # Checks the more than one asterick. self.assertIsNone( - local_device_gtest_run._ExtractTestsFromFilter('.mk2*:.M67*')) + local_device_gtest_run._ExtractTestsFromFilters(['.mk2*:.M67*'])) # Checks just an asterick without a period - self.assertIsNone(local_device_gtest_run._ExtractTestsFromFilter('M67*')) + self.assertIsNone(local_device_gtest_run._ExtractTestsFromFilters(['M67*'])) # Checks an asterick at the end with a period. self.assertEqual(['.M67*'], - local_device_gtest_run._ExtractTestsFromFilter('.M67*')) + local_device_gtest_run._ExtractTestsFromFilters(['.M67*'])) + # Checks multiple filters intersect + self.assertEqual(['m4e3'], + local_device_gtest_run._ExtractTestsFromFilters( + ['b17:m4e3:p51', 'b17:m4e3', 'm4e3:p51'])) def testGetLLVMProfilePath(self): path = local_device_gtest_run._GetLLVMProfilePath('test_dir', 'sr71', '5')
diff --git a/build/android/pylib/local/machine/local_machine_junit_test_run.py b/build/android/pylib/local/machine/local_machine_junit_test_run.py index a19b11d..8405033 100644 --- a/build/android/pylib/local/machine/local_machine_junit_test_run.py +++ b/build/android/pylib/local/machine/local_machine_junit_test_run.py
@@ -65,8 +65,9 @@ ret = [] if test_filter_override: ret += ['-gtest-filter', ':'.join(test_filter_override)] - elif self._test_instance.test_filter: - ret += ['-gtest-filter', self._test_instance.test_filter] + elif self._test_instance.test_filters: + for test_filter in self._test_instance.test_filters: + ret += ['-gtest-filter', test_filter] if self._test_instance.package_filter: ret += ['-package-filter', self._test_instance.package_filter] @@ -150,7 +151,7 @@ # which takes about 1-2 seconds. # Do not shard when a test filter is present since we do not know at this # point which tests will be filtered out. - if (self._test_instance.shards == 1 or self._test_instance.test_filter + if (self._test_instance.shards == 1 or self._test_instance.test_filters or self._test_instance.suite in _EXCLUDED_SUITES): test_classes = [] shards = 1
diff --git a/build/android/pylib/utils/test_filter.py b/build/android/pylib/utils/test_filter.py index 7909179..c532f32 100644 --- a/build/android/pylib/utils/test_filter.py +++ b/build/android/pylib/utils/test_filter.py
@@ -9,9 +9,6 @@ _CMDLINE_NAME_SEGMENT_RE = re.compile( r' with(?:out)? \{[^\}]*\}') -class ConflictingPositiveFiltersException(Exception): - """Raised when both filter file and filter argument have positive filters.""" - def ParseFilterFile(input_lines): """Converts test filter file contents to positive and negative pattern lists. @@ -56,15 +53,20 @@ 'See also //testing/buildbot/filters/README.md.') filter_group = parser.add_mutually_exclusive_group() - filter_group.add_argument( - '-f', '--test-filter', '--gtest_filter', '--gtest-filter', - dest='test_filter', - help='googletest-style filter string.', - default=os.environ.get('GTEST_FILTER')) + filter_group.add_argument('-f', + '--test-filter', + '--gtest_filter', + '--gtest-filter', + dest='test_filters', + action='append', + help='googletest-style filter string.', + default=os.environ.get('GTEST_FILTER')) filter_group.add_argument( '--isolated-script-test-filter', + action='append', + dest='isolated_script_test_filters', help='isolated script filter string. ' - 'Like gtest filter strings, but with :: separators instead of :') + 'Like gtest filter strings, but with :: separators instead of :') def AppendPatternsToFilter(test_filter, positive_patterns=None, @@ -108,26 +110,26 @@ return bool(len(test_filter) > 0 and test_filter[0] != '-') -def InitializeFilterFromArgs(args): +def InitializeFiltersFromArgs(args): """Returns a filter string from the command-line option values. Args: args: an argparse.Namespace instance resulting from a using parser to which the filter options above were added. - - Raises: - ConflictingPositiveFiltersException if both filter file and command line - specify positive filters. """ - test_filter = '' - if args.isolated_script_test_filter: - args.test_filter = args.isolated_script_test_filter.replace('::', ':') - if args.test_filter: - test_filter = _CMDLINE_NAME_SEGMENT_RE.sub( - '', args.test_filter.replace('#', '.')) + test_filters = [] + if args.isolated_script_test_filters: + args.test_filters = [ + isolated_script_test_filter.replace('::', ':') + for isolated_script_test_filter in args.isolated_script_test_filters + ] + if args.test_filters: + for filt in args.test_filters: + test_filters.append( + _CMDLINE_NAME_SEGMENT_RE.sub('', filt.replace('#', '.'))) if not args.test_filter_files: - return test_filter + return test_filters # At this point it's potentially several files, in a list and ; separated for test_filter_files in args.test_filter_files: @@ -135,14 +137,9 @@ for test_filter_file in test_filter_files.split(';'): # At this point it's individual files with open(test_filter_file, 'r') as f: - positive_file_patterns, negative_file_patterns = ParseFilterFile(f) - if positive_file_patterns and HasPositivePatterns(test_filter): - raise ConflictingPositiveFiltersException( - 'Cannot specify positive pattern in both filter file and ' + - 'filter command line argument') - test_filter = AppendPatternsToFilter( - test_filter, - positive_patterns=positive_file_patterns, - negative_patterns=negative_file_patterns) + positive_patterns, negative_patterns = ParseFilterFile(f) + filter_string = AppendPatternsToFilter('', positive_patterns, + negative_patterns) + test_filters.append(filter_string) - return test_filter + return test_filters
diff --git a/build/android/pylib/utils/test_filter_test.py b/build/android/pylib/utils/test_filter_test.py index 4b90f30..fa071825 100755 --- a/build/android/pylib/utils/test_filter_test.py +++ b/build/android/pylib/utils/test_filter_test.py
@@ -63,8 +63,8 @@ args = parser.parse_args([ '--test-filter', 'FooTest.testFoo:BarTest.testBar']) - expected = 'FooTest.testFoo:BarTest.testBar' - actual = test_filter.InitializeFilterFromArgs(args) + expected = ['FooTest.testFoo:BarTest.testBar'] + actual = test_filter.InitializeFiltersFromArgs(args) self.assertEqual(actual, expected) def testInitializeJavaStyleFilter(self): @@ -73,8 +73,8 @@ args = parser.parse_args([ '--test-filter', 'FooTest#testFoo:BarTest#testBar']) - expected = 'FooTest.testFoo:BarTest.testBar' - actual = test_filter.InitializeFilterFromArgs(args) + expected = ['FooTest.testFoo:BarTest.testBar'] + actual = test_filter.InitializeFiltersFromArgs(args) self.assertEqual(actual, expected) def testInitializeBasicIsolatedScript(self): @@ -83,8 +83,8 @@ args = parser.parse_args([ '--isolated-script-test-filter', 'FooTest.testFoo::BarTest.testBar']) - expected = 'FooTest.testFoo:BarTest.testBar' - actual = test_filter.InitializeFilterFromArgs(args) + expected = ['FooTest.testFoo:BarTest.testBar'] + actual = test_filter.InitializeFiltersFromArgs(args) self.assertEqual(actual, expected) @unittest.skipIf(os.name == "nt", "Opening NamedTemporaryFile by name " @@ -99,8 +99,8 @@ '--test-filter=-negative1', '--test-launcher-filter-file', tmp_file.name]) - expected = 'positive1:positive2-negative1:negative2:negative3' - actual = test_filter.InitializeFilterFromArgs(args) + expected = ['-negative1', 'positive1:positive2-negative2:negative3'] + actual = test_filter.InitializeFiltersFromArgs(args) self.assertEqual(actual, expected) @unittest.skipIf(os.name == "nt", "Opening NamedTemporaryFile by name " @@ -116,8 +116,8 @@ 'positive1:positive2-negative1', '--test-launcher-filter-file', tmp_file.name]) - expected = 'positive1:positive2-negative1:negative2:negative3' - actual = test_filter.InitializeFilterFromArgs(args) + expected = ['positive1:positive2-negative1', '-negative2:negative3'] + actual = test_filter.InitializeFiltersFromArgs(args) self.assertEqual(actual, expected) @unittest.skipIf(os.name == "nt", "Opening NamedTemporaryFile by name " @@ -126,15 +126,15 @@ parser = argparse.ArgumentParser() test_filter.AddFilterOptions(parser) with tempfile.NamedTemporaryFile(mode='w') as tmp_file: - tmp_file.write('positive1\n') + tmp_file.write('positive2-negative2\n') tmp_file.seek(0) args = parser.parse_args([ - '--test-filter', - 'positive2', - '--test-launcher-filter-file', - tmp_file.name]) - with self.assertRaises(test_filter.ConflictingPositiveFiltersException): - test_filter.InitializeFilterFromArgs(args) + '--test-filter', 'positive1-negative1', '--test-launcher-filter-file', + tmp_file.name + ]) + expected = ['positive1-negative1', 'positive2-negative2'] + actual = test_filter.InitializeFiltersFromArgs(args) + self.assertEqual(actual, expected) @unittest.skipIf(os.name == "nt", "Opening NamedTemporaryFile by name " "doesn't work in Windows.") @@ -148,8 +148,8 @@ '--test-filter=-negative1:negative2', '--test-launcher-filter-file', tmp_file.name]) - expected = '-negative1:negative2:negative3:negative4' - actual = test_filter.InitializeFilterFromArgs(args) + expected = ['-negative1:negative2', '-negative3:negative4'] + actual = test_filter.InitializeFiltersFromArgs(args) self.assertEqual(actual, expected)
diff --git a/cc/base/math_util_unittest.cc b/cc/base/math_util_unittest.cc index 8006369..7c3c743 100644 --- a/cc/base/math_util_unittest.cc +++ b/cc/base/math_util_unittest.cc
@@ -47,11 +47,11 @@ // +16331238407143424.0000 +0.0000 -0.0000 +51346917453137000267776.0000 // +0.0000 +0.0000 +0.0000 +1.0000 ] transform.MakeIdentity(); - transform.set_rc(0, 2, static_cast<SkScalar>(-1)); - transform.set_rc(0, 3, static_cast<SkScalar>(3144132.0)); - transform.set_rc(2, 0, static_cast<SkScalar>(16331238407143424.0)); - transform.set_rc(2, 2, static_cast<SkScalar>(-1e-33)); - transform.set_rc(2, 3, static_cast<SkScalar>(51346917453137000267776.0)); + transform.set_rc(0, 2, -1); + transform.set_rc(0, 3, 3144132.0); + transform.set_rc(2, 0, 16331238407143424.0); + transform.set_rc(2, 2, -1e-33); + transform.set_rc(2, 3, 51346917453137000267776.0); gfx::RectF rect = gfx::RectF(0, 0, 1, 1); gfx::RectF projected_rect = MathUtil::ProjectClippedRect(transform, rect); @@ -329,14 +329,12 @@ gfx::Rect input(1, 2, 100, 200); gfx::Rect output; - gfx::Transform large_x_scale; - large_x_scale.Scale(SkDoubleToScalar(1e37), 1.0); + gfx::Transform large_x_scale = gfx::Transform::MakeScale(1e37, 1.0); gfx::Transform infinite_x_scale; infinite_x_scale = large_x_scale * large_x_scale; - gfx::Transform large_y_scale; - large_y_scale.Scale(1.0, SkDoubleToScalar(1e37)); + gfx::Transform large_y_scale = gfx::Transform::MakeScale(1.0, 1e37); gfx::Transform infinite_y_scale; infinite_y_scale = large_y_scale * large_y_scale; @@ -378,8 +376,7 @@ gfx::Rect input(0, 0, 1000, 500); gfx::Rect output; - gfx::Transform transform; - transform.Scale(SkDoubleToScalar(scale), SkDoubleToScalar(scale)); + gfx::Transform transform = gfx::Transform::MakeScale(scale); output = MathUtil::MapEnclosingClippedRectIgnoringError(transform, input, 0.f); EXPECT_EQ(gfx::Rect(0, 0, 2001, 1001), output); @@ -397,14 +394,12 @@ gfx::Rect input(1, 2, 100, 200); gfx::Rect output; - gfx::Transform large_x_scale; - large_x_scale.Scale(SkDoubleToScalar(1e37), 1.0); + gfx::Transform large_x_scale = gfx::Transform::MakeScale(1e37, 1.0); gfx::Transform infinite_x_scale; infinite_x_scale = large_x_scale * large_x_scale; - gfx::Transform large_y_scale; - large_y_scale.Scale(1.0, SkDoubleToScalar(1e37)); + gfx::Transform large_y_scale = gfx::Transform::MakeScale(1.0, 1e37); gfx::Transform infinite_y_scale; infinite_y_scale = large_y_scale * large_y_scale; @@ -930,14 +925,14 @@ EXPECT_EQ(clipped_quad[0].x(), 0.0f); EXPECT_EQ(clipped_quad[0].y(), 0.0f); - EXPECT_EQ(clipped_quad[0].z(), 750000.0f); + EXPECT_LE_LE(750000.0f, clipped_quad[0].z(), 750001.0f); EXPECT_EQ(clipped_quad[1].x(), 0.0f); - EXPECT_EQ(clipped_quad[1].y(), 1000000.0f); + EXPECT_LE_LE(999999.0f, clipped_quad[1].y(), 1000000.0f); EXPECT_LE_LE(-250001.0f, clipped_quad[1].z(), -249999.0f); EXPECT_LE_LE(14100.0f, clipped_quad[2].x(), 14200.0f); - EXPECT_EQ(clipped_quad[2].y(), 1000000.0f); + EXPECT_LE_LE(999999.0f, clipped_quad[2].y(), 1000000.0f); EXPECT_LE_LE(-250001.0f, clipped_quad[2].z(), -249999.0f); EXPECT_LE_LE(3500.0f, clipped_quad[3].x(), 3600.0f);
diff --git a/cc/layers/video_layer_impl.cc b/cc/layers/video_layer_impl.cc index a6ced88..a5593d3 100644 --- a/cc/layers/video_layer_impl.cc +++ b/cc/layers/video_layer_impl.cc
@@ -141,16 +141,16 @@ switch (media_transform.rotation) { case media::VIDEO_ROTATION_90: rotated_size = gfx::Size(rotated_size.height(), rotated_size.width()); - transform.RotateAboutZAxis(90.0); + transform *= gfx::Transform::Make90degRotation(); transform.Translate(0.0, -rotated_size.height()); break; case media::VIDEO_ROTATION_180: - transform.RotateAboutZAxis(180.0); + transform *= gfx::Transform::Make180degRotation(); transform.Translate(-rotated_size.width(), -rotated_size.height()); break; case media::VIDEO_ROTATION_270: rotated_size = gfx::Size(rotated_size.height(), rotated_size.width()); - transform.RotateAboutZAxis(270.0); + transform *= gfx::Transform::Make270degRotation(); transform.Translate(-rotated_size.width(), 0); break; case media::VIDEO_ROTATION_0:
diff --git a/cc/trees/draw_properties_unittest.cc b/cc/trees/draw_properties_unittest.cc index 6317fba..ca658f68 100644 --- a/cc/trees/draw_properties_unittest.cc +++ b/cc/trees/draw_properties_unittest.cc
@@ -2416,11 +2416,9 @@ LayerImpl* child = AddLayer<LayerImpl>(); LayerImpl* grand_child = AddLayer<LayerImpl>(); - gfx::Transform perspective; - perspective.ApplyPerspectiveDepth(SkDoubleToScalar(1e-12)); - - gfx::Transform rotation; - rotation.RotateAboutYAxis(45.0); + gfx::Transform scale = gfx::Transform::MakeScale(1e-15); + EXPECT_TRUE(scale.IsInvertible()); + EXPECT_FALSE((scale * scale).IsInvertible()); root->SetBounds(gfx::Size(100, 100)); child->SetBounds(gfx::Size(100, 100)); @@ -2433,12 +2431,12 @@ child_transform_node.flattens_inherited_transform = false; child_transform_node.post_translation = gfx::Vector2dF(10.f, 10.f); child_transform_node.sorting_context_id = 1; - child_transform_node.local = perspective; + child_transform_node.local = scale; CopyProperties(child, grand_child); auto& grand_child_transform_node = CreateTransformNode(grand_child); grand_child_transform_node.flattens_inherited_transform = false; grand_child_transform_node.sorting_context_id = 1; - grand_child_transform_node.local = rotation; + grand_child_transform_node.local = scale; UpdateActiveTreeDrawProperties(); @@ -2544,11 +2542,9 @@ LayerImpl* grand_child = AddLayer<LayerImpl>(); LayerImpl* occluding_child = AddLayer<LayerImpl>(); - gfx::Transform perspective; - perspective.ApplyPerspectiveDepth(SkDoubleToScalar(1e-12)); - - gfx::Transform rotation; - rotation.RotateAboutYAxis(45.0); + gfx::Transform scale = gfx::Transform::MakeScale(1e-15); + EXPECT_TRUE(scale.IsInvertible()); + EXPECT_FALSE((scale * scale).IsInvertible()); root->SetBounds(gfx::Size(1000, 1000)); child->SetBounds(gfx::Size(300, 300)); @@ -2565,12 +2561,12 @@ child_transform_node.flattens_inherited_transform = false; child_transform_node.post_translation = gfx::Vector2dF(10.f, 10.f); child_transform_node.sorting_context_id = 1; - child_transform_node.local = perspective; + child_transform_node.local = scale; CopyProperties(child, grand_child); auto& grand_child_transform_node = CreateTransformNode(grand_child); grand_child_transform_node.flattens_inherited_transform = false; grand_child_transform_node.sorting_context_id = 1; - grand_child_transform_node.local = rotation; + grand_child_transform_node.local = scale; CopyProperties(root, occluding_child); CreateTransformNode(occluding_child).flattens_inherited_transform = false; @@ -3357,14 +3353,16 @@ float expected_ideal_scale = device_scale_factor * page_scale_factor * initial_parent_scale; EXPECT_LT(expected_ideal_scale, 1.f); - EXPECT_EQ(gfx::Vector2dF(expected_ideal_scale, expected_ideal_scale), - parent->GetIdealContentsScale()); + EXPECT_VECTOR2DF_EQ( + gfx::Vector2dF(expected_ideal_scale, expected_ideal_scale), + parent->GetIdealContentsScale()); expected_ideal_scale = device_scale_factor * page_scale_factor * initial_parent_scale * initial_child_scale; EXPECT_LT(expected_ideal_scale, 1.f); - EXPECT_EQ(gfx::Vector2dF(expected_ideal_scale, expected_ideal_scale), - child_scale->GetIdealContentsScale()); + EXPECT_VECTOR2DF_EQ( + gfx::Vector2dF(expected_ideal_scale, expected_ideal_scale), + child_scale->GetIdealContentsScale()); } TEST_F(DrawPropertiesScalingTest, IdealScaleForAnimatingLayer) {
diff --git a/cc/trees/latency_info_swap_promise.cc b/cc/trees/latency_info_swap_promise.cc index 6f0a408..33e64fc 100644 --- a/cc/trees/latency_info_swap_promise.cc +++ b/cc/trees/latency_info_swap_promise.cc
@@ -43,7 +43,7 @@ using perfetto::protos::pbzero::ChromeLatencyInfo; using perfetto::protos::pbzero::TrackEvent; - TRACE_EVENT("input,benchmark", "LatencyInfo.Flow", + TRACE_EVENT("input,benchmark,latencyInfo", "LatencyInfo.Flow", [this](perfetto::EventContext ctx) { ChromeLatencyInfo* latency_info = ctx.event()->set_chrome_latency_info();
diff --git a/cc/trees/layer_tree_impl_unittest.cc b/cc/trees/layer_tree_impl_unittest.cc index 37382cf..4eede23 100644 --- a/cc/trees/layer_tree_impl_unittest.cc +++ b/cc/trees/layer_tree_impl_unittest.cc
@@ -2133,8 +2133,7 @@ LayerImpl* root = root_layer(); root->SetBounds(gfx::Size(100, 100)); - gfx::Transform large_transform; - large_transform.Scale(SkDoubleToScalar(1e37), SkDoubleToScalar(1e37)); + gfx::Transform large_transform = gfx::Transform::MakeScale(1e37); large_transform.RotateAboutYAxis(30); LayerImpl* child = AddLayer<LayerImpl>();
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java index ee98567..f5fd84f 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
@@ -883,6 +883,15 @@ boolean isUngroupingLastTabInGroup = groupTab.getId() == movedTab.getId(); if (mActionsOnAllRelatedTabs) { if (isUngroupingLastTabInGroup) { + // TODO(crbug/1374935): Find out why this is required and remove if + // possible. + if (TabUiFeatureUtilities.isTabSelectionEditorV2Enabled(mContext)) { + boolean isSelected = mTabModelSelector.getCurrentTabId() + == filter.getTabAt(prevFilterIndex).getId(); + updateTab(mModel.indexOfNthTabCard(prevFilterIndex), + PseudoTab.fromTab(filter.getTabAt(prevFilterIndex)), + isSelected, false, false); + } return; } Tab currentSelectedTab = mTabModelSelector.getCurrentTab();
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupAction.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupAction.java index 7e52fbe..6fe6030 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupAction.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupAction.java
@@ -16,6 +16,8 @@ import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter; import org.chromium.chrome.tab_ui.R; +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; /** @@ -62,9 +64,27 @@ .getTabModelFilterProvider() .getCurrentTabModelFilter(); + // Remove the related tabs to prevent "re-grouping". + HashSet<Tab> selectedTabs = new HashSet<>(tabs); Tab destinationTab = getDestinationTab(tabs, getTabModelSelector().getCurrentModel(), tabGroupModelFilter, editorSupportsActionOnRelatedTabs()); - tabGroupModelFilter.mergeListOfTabsToGroup(tabs, destinationTab, false, true); + List<Tab> relatedTabs = tabGroupModelFilter.getRelatedTabList(destinationTab.getId()); + for (Tab tab : relatedTabs) { + selectedTabs.remove(tab); + } + + // Sort tabs by index prevent visual bugs when undoing. + // TODO(crbug/1374935): See if this can be removed. + List<Tab> sortedTabs = new ArrayList<>(tabs.size() + 1); + TabModel model = getTabModelSelector().getCurrentModel(); + for (int i = 0; i < model.getCount(); i++) { + Tab tab = model.getTabAt(i); + if (!selectedTabs.contains(tab)) continue; + + sortedTabs.add(tab); + } + + tabGroupModelFilter.mergeListOfTabsToGroup(sortedTabs, destinationTab, false, true); RecordUserAction.record("TabMultiSelectV2.GroupTabs"); RecordUserAction.record("TabGroup.Created.TabMultiSelect");
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java index 94e650d..ef13589 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java
@@ -513,6 +513,45 @@ assertEquals(3, getTabsInCurrentTabModel().size()); } + // Regression test for https://crbug.com/1374935 + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.TAB_SELECTION_EDITOR_V2}) + public void testToolbarMenuItem_GroupActionView_WithGroups() { + prepareBlankTab(2, false); // Index: 0, 1 + prepareBlankTabGroup(3, false); // Index: 2 + prepareBlankTabGroup(1, false); // Index: 3 + prepareBlankTabGroup(2, false); // Index: 4 + List<Tab> tabs = getTabsInCurrentTabModelFilter(); + + TestThreadUtils.runOnUiThreadBlocking(() -> { + List<TabSelectionEditorAction> actions = new ArrayList<>(); + actions.add(TabSelectionEditorGroupAction.createAction(sActivityTestRule.getActivity(), + ShowMode.IF_ROOM, ButtonType.TEXT, IconPosition.START)); + + mTabSelectionEditorController.configureToolbarWithMenuItems(actions, null); + mTabSelectionEditorController.show(tabs); + }); + + final int groupId = R.id.tab_selection_editor_group_menu_item; + mRobot.resultRobot.verifyToolbarActionViewDisabled(groupId); + + mRobot.actionRobot.clickItemAtAdapterPosition(4) + .clickItemAtAdapterPosition(3) + .clickItemAtAdapterPosition(1) + .clickItemAtAdapterPosition(0); + + mRobot.resultRobot.verifyToolbarActionViewEnabled(groupId).verifyToolbarSelectionText( + "5 tabs"); + + View close = mTabSelectionEditorLayout.getToolbar().findViewById(groupId); + assertEquals("Group 5 selected tabs", close.getContentDescription()); + + mRobot.actionRobot.clickToolbarActionView(groupId); + + assertEquals(2, getTabsInCurrentTabModelFilter().size()); + } + @Test @MediumTest @Feature({"RenderTest"})
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionUnitTestHelper.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionUnitTestHelper.java index d2e2bc64..f64734ce 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionUnitTestHelper.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionUnitTestHelper.java
@@ -12,6 +12,7 @@ import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate; import java.util.ArrayList; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -89,12 +90,15 @@ * @param filter a mocked {@link TabGroupModelFilter}. * @param selectionDelegate a mocked {@link SelectionDelegate}. * @param tabIdGroups defining the tab structure. + * @param deterministicSetOrder allow arbitrary selection order. */ public static TabListHolder configureTabs(MockTabModel tabModel, TabGroupModelFilter filter, - SelectionDelegate<Integer> selectionDelegate, List<TabIdGroup> tabIdGroups) { + SelectionDelegate<Integer> selectionDelegate, List<TabIdGroup> tabIdGroups, + boolean deterministicSetOrder) { List<Tab> selectedTabs = new ArrayList<>(); List<Tab> selectedAndRelatedTabs = new ArrayList<>(); - Set<Integer> selectedTabIds = new LinkedHashSet<>(); + Set<Integer> selectedTabIds = + deterministicSetOrder ? new LinkedHashSet<Integer>() : new HashSet<Integer>(); for (TabIdGroup group : tabIdGroups) { List<Tab> groupTabs = new ArrayList<Tab>(); for (int tabId : group.getTabIds()) {
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseActionUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseActionUnitTest.java index fac8245..b700ec53 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseActionUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseActionUnitTest.java
@@ -188,7 +188,7 @@ tabIdGroups.add(new TabIdGroup(new int[] {8, 7, 6}, true)); tabIdGroups.add(new TabIdGroup(new int[] {1}, true)); TabListHolder holder = TabSelectionEditorActionUnitTestHelper.configureTabs( - mTabModel, mGroupFilter, mSelectionDelegate, tabIdGroups); + mTabModel, mGroupFilter, mSelectionDelegate, tabIdGroups, true); Assert.assertEquals(3, holder.getSelectedTabs().size()); Assert.assertEquals(5, holder.getSelectedTabs().get(0).getId()); @@ -224,7 +224,7 @@ tabIdGroups.add(new TabIdGroup(new int[] {8, 7, 6}, true)); tabIdGroups.add(new TabIdGroup(new int[] {1}, true)); TabListHolder holder = TabSelectionEditorActionUnitTestHelper.configureTabs( - mTabModel, mGroupFilter, mSelectionDelegate, tabIdGroups); + mTabModel, mGroupFilter, mSelectionDelegate, tabIdGroups, true); Assert.assertEquals(3, holder.getSelectedTabs().size()); Assert.assertEquals(5, holder.getSelectedTabs().get(0).getId());
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupActionUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupActionUnitTest.java index f14c768..5c4dd77 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupActionUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupActionUnitTest.java
@@ -168,7 +168,7 @@ tabIdGroups.add(new TabIdGroup(new int[] {8, 7}, true)); tabIdGroups.add(new TabIdGroup(new int[] {10, 11, 12}, false)); TabListHolder holder = TabSelectionEditorActionUnitTestHelper.configureTabs( - mTabModel, mGroupFilter, mSelectionDelegate, tabIdGroups); + mTabModel, mGroupFilter, mSelectionDelegate, tabIdGroups, false); Assert.assertEquals(3, holder.getSelectedTabs().size()); Assert.assertEquals(5, holder.getSelectedTabs().get(0).getId()); @@ -186,9 +186,12 @@ Assert.assertEquals(8, holder.getSelectedAndRelatedTabs().get(2).getId()); Assert.assertEquals(7, holder.getSelectedAndRelatedTabs().get(3).getId()); Assert.assertTrue(mAction.perform()); + List<Tab> expectedTabs = holder.getSelectedAndRelatedTabs(); + // Remove existing group. + expectedTabs.remove(3); + expectedTabs.remove(2); verify(mGroupFilter) - .mergeListOfTabsToGroup(holder.getSelectedAndRelatedTabs(), - holder.getSelectedTabs().get(2), false, true); + .mergeListOfTabsToGroup(expectedTabs, holder.getSelectedTabs().get(2), false, true); verify(mDelegate).hide(); } @@ -204,7 +207,7 @@ tabIdGroups.add(new TabIdGroup(new int[] {8, 7, 6}, true)); tabIdGroups.add(new TabIdGroup(new int[] {10, 11, 12}, false)); TabListHolder holder = TabSelectionEditorActionUnitTestHelper.configureTabs( - mTabModel, mGroupFilter, mSelectionDelegate, tabIdGroups); + mTabModel, mGroupFilter, mSelectionDelegate, tabIdGroups, false); Assert.assertEquals(2, holder.getSelectedTabs().size()); Assert.assertEquals(5, holder.getSelectedTabs().get(0).getId()); @@ -222,9 +225,11 @@ Assert.assertEquals(7, holder.getSelectedAndRelatedTabs().get(3).getId()); Assert.assertEquals(6, holder.getSelectedAndRelatedTabs().get(4).getId()); Assert.assertTrue(mAction.perform()); + List<Tab> expectedTabs = holder.getSelectedAndRelatedTabs(); + expectedTabs.remove(1); + expectedTabs.remove(0); verify(mGroupFilter) - .mergeListOfTabsToGroup(holder.getSelectedAndRelatedTabs(), - holder.getSelectedTabs().get(0), false, true); + .mergeListOfTabsToGroup(expectedTabs, holder.getSelectedTabs().get(0), false, true); verify(mDelegate).hide(); } @@ -241,7 +246,7 @@ tabIdGroups.add(new TabIdGroup(new int[] {10, 11, 12}, true)); tabIdGroups.add(new TabIdGroup(new int[] {1}, true)); TabListHolder holder = TabSelectionEditorActionUnitTestHelper.configureTabs( - mTabModel, mGroupFilter, mSelectionDelegate, tabIdGroups); + mTabModel, mGroupFilter, mSelectionDelegate, tabIdGroups, false); Assert.assertEquals(4, holder.getSelectedTabs().size()); Assert.assertEquals(5, holder.getSelectedTabs().get(0).getId()); @@ -265,9 +270,11 @@ Assert.assertEquals(12, holder.getSelectedAndRelatedTabs().get(7).getId()); Assert.assertEquals(1, holder.getSelectedAndRelatedTabs().get(8).getId()); Assert.assertTrue(mAction.perform()); + List<Tab> expectedTabs = holder.getSelectedAndRelatedTabs(); + expectedTabs.remove(1); + expectedTabs.remove(0); verify(mGroupFilter) - .mergeListOfTabsToGroup(holder.getSelectedAndRelatedTabs(), - holder.getSelectedTabs().get(0), false, true); + .mergeListOfTabsToGroup(expectedTabs, holder.getSelectedTabs().get(0), false, true); verify(mDelegate).hide(); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeToolbarButtonController.java b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeToolbarButtonController.java index 2ab2e666..25172cd 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeToolbarButtonController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeToolbarButtonController.java
@@ -31,7 +31,7 @@ public ReaderModeToolbarButtonController(Supplier<Tab> activeTabSupplier, ModalDialogManager modalDialogManager, Drawable buttonDrawable) { super(activeTabSupplier, modalDialogManager, buttonDrawable, R.string.reader_view_text_alt, - /* contentDescriptionResId= */ R.string.reader_mode_message_title, + /* actionChipLabelResId= */ R.string.reader_mode_action_chip_label_simplify_page, /* supportsTinting= */ true, /* iphCommandBuilder= */ null, AdaptiveToolbarButtonVariant.READER_MODE); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareButtonControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareButtonControllerTest.java index e4f23de4..a1415846 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareButtonControllerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareButtonControllerTest.java
@@ -52,7 +52,7 @@ @RunWith(ChromeJUnit4ClassRunner.class) @Batch(Batch.PER_CLASS) @EnableFeatures( - {ChromeFeatureList.SHARE_BUTTON_IN_TOP_TOOLBAR, ChromeFeatureList.START_SURFACE_ANDROID}) + {ChromeFeatureList.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR, ChromeFeatureList.START_SURFACE_ANDROID}) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-features=" + ChromeFeatureList.START_SURFACE_ANDROID + "<Study", "force-fieldtrials=Study/Group"})
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index 49f5319..aeb96bfa 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -372,6 +372,9 @@ <message name="IDS_SETTINGS_ADDRESS_REMOVE_CONFIRMATION_TITLE" desc="Address remove dialog confirmation title."> Remove address </message> + <message name="IDS_SETTINGS_ADDRESS_REMOVED_MESSAGE" desc="Hidden text that is read to screen readers to confirm that an address was removed."> + Address removed + </message> <message name="IDS_SETTINGS_CREDIT_CARD_REMOVE" desc="Label for a context menu item that removes the selected credit card." meaning="Remove selected credit card."> Remove </message>
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_ADDRESS_REMOVED_MESSAGE.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_ADDRESS_REMOVED_MESSAGE.png.sha1 new file mode 100644 index 0000000..58d8386 --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_ADDRESS_REMOVED_MESSAGE.png.sha1
@@ -0,0 +1 @@ +ac67134e368bd8aa220fd41e7aa4d54154114498 \ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 9326ff0..4bfc8e90 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -3739,6 +3739,8 @@ "download/download_dir_util.h", "download/download_open_prompt.cc", "download/download_open_prompt.h", + "download/download_session_durations_metrics_recorder.cc", + "download/download_session_durations_metrics_recorder.h", "download/download_shelf.cc", "download/download_shelf.h", "download/download_shelf_context_menu.cc", @@ -5185,6 +5187,7 @@ "//ash/webui/file_manager:file_manager_ui", "//ash/webui/file_manager/mojom", "//ash/webui/files_internals", + "//ash/webui/files_internals/mojom", "//ash/webui/firmware_update_ui", "//ash/webui/firmware_update_ui/mojom", "//ash/webui/guest_os_installer",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 0238503..548f9a518 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -3623,7 +3623,7 @@ {"enable-webrtc-allow-input-volume-adjustment", flag_descriptions::kWebRtcAllowInputVolumeAdjustmentName, flag_descriptions::kWebRtcAllowInputVolumeAdjustmentDescription, - kOsDesktop, + kOsWin | kOsMac | kOsLinux, FEATURE_VALUE_TYPE(features::kWebRtcAllowInputVolumeAdjustment)}, {"enable-webrtc-hide-local-ips-with-mdns", flag_descriptions::kWebrtcHideLocalIpsWithMdnsName, @@ -4419,10 +4419,6 @@ flag_descriptions::kAssistantIntentTranslateInfoName, flag_descriptions::kAssistantIntentTranslateInfoDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kAssistantIntentTranslateInfo)}, - {"share-button-in-top-toolbar", - flag_descriptions::kShareButtonInTopToolbarName, - flag_descriptions::kShareButtonInTopToolbarDescription, kOsAndroid, - FEATURE_VALUE_TYPE(chrome::android::kShareButtonInTopToolbar)}, {"chrome-share-long-screenshot", flag_descriptions::kChromeShareLongScreenshotName, flag_descriptions::kChromeShareLongScreenshotDescription, kOsAndroid, @@ -4645,11 +4641,6 @@ flag_descriptions::kDesktopPWAsSubAppsDescription, kOsWin | kOsLinux | kOsLacros | kOsMac | kOsCrOS | kOsFuchsia, FEATURE_VALUE_TYPE(blink::features::kDesktopPWAsSubApps)}, - {"enable-desktop-pwas-window-controls-overlay", - flag_descriptions::kDesktopPWAsWindowControlsOverlayName, - flag_descriptions::kDesktopPWAsWindowControlsOverlayDescription, - kOsWin | kOsLinux | kOsLacros | kOsMac | kOsCrOS | kOsFuchsia, - FEATURE_VALUE_TYPE(features::kWebAppWindowControlsOverlay)}, {"enable-desktop-pwas-borderless", flag_descriptions::kDesktopPWAsBorderlessName, flag_descriptions::kDesktopPWAsBorderlessDescription,
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn index bb42c2bfc..03458b1 100644 --- a/chrome/browser/ash/BUILD.gn +++ b/chrome/browser/ash/BUILD.gn
@@ -989,6 +989,8 @@ "file_manager/file_manager_copy_or_move_hook_delegate.h", "file_manager/file_manager_copy_or_move_hook_file_check_delegate.cc", "file_manager/file_manager_copy_or_move_hook_file_check_delegate.h", + "file_manager/file_manager_pref_names.cc", + "file_manager/file_manager_pref_names.h", "file_manager/file_manager_string_util.cc", "file_manager/file_manager_string_util.h", "file_manager/file_tasks.cc",
diff --git a/chrome/browser/ash/arc/input_overlay/actions/action.cc b/chrome/browser/ash/arc/input_overlay/actions/action.cc index 411366a..86469da 100644 --- a/chrome/browser/ash/arc/input_overlay/actions/action.cc +++ b/chrome/browser/ash/arc/input_overlay/actions/action.cc
@@ -346,15 +346,9 @@ void Action::RestoreToDefault() { bool restored = false; - if (beta_) { + if (beta_ && GetCurrentDisplayedPosition() != original_positions_[0]) { pending_position_.reset(); - if (!original_positions_.empty()) { - pending_position_ = std::make_unique<Position>(original_positions_[0]); - } else { - // TODO(cuicuiruan): ActionMove by mouse may have empty position. - // Implement this once UX/UI confirmed. - NOTREACHED(); - } + pending_position_ = std::make_unique<Position>(original_positions_[0]); restored = true; } if (GetCurrentDisplayedInput() != *original_input_) { @@ -387,6 +381,9 @@ } const Position& Action::GetCurrentDisplayedPosition() { + // TODO(b/229912890): When mouse overlay is involved, |original_positions_| + // may be empty. Add the situation for empty |original_positions_| when + // supporting mouse. DCHECK(!original_positions_.empty()); return pending_position_
diff --git a/chrome/browser/ash/arc/input_overlay/actions/action.h b/chrome/browser/ash/arc/input_overlay/actions/action.h index e062361f..072920b6 100644 --- a/chrome/browser/ash/arc/input_overlay/actions/action.h +++ b/chrome/browser/ash/arc/input_overlay/actions/action.h
@@ -207,7 +207,8 @@ raw_ptr<ActionView> action_view_ = nullptr; private: - // TODO(cuicuiruan): This can be removed when removing the flag. + // TODO(cuicuiruan): This can be removed when removing the flag. If |beta_| is + // true, then we care about the position change. bool beta_; };
diff --git a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc index 5816f48b..cb6cdf6 100644 --- a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc +++ b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc
@@ -351,6 +351,11 @@ auto* parent_view = overlay_widget->GetContentsView(); DCHECK(parent_view); add_action_tap_ = parent_view->AddChildView(std::move(add_action_tap)); + add_action_tap_->SetButtonTextColor(cros_styles::ResolveColor( + cros_styles::ColorName::kButtonLabelColorPrimary, IsDarkModeEnabled())); + add_action_tap_->SetBackgroundColor(cros_styles::ResolveColor( + cros_styles::ColorName::kButtonBackgroundColorPrimary, + IsDarkModeEnabled())); add_action_tap_->SetPosition( gfx::Point(parent_view->width() - add_action_tap_->width(), 0)); } @@ -380,6 +385,11 @@ auto* parent_view = overlay_widget->GetContentsView(); DCHECK(parent_view); add_action_move_ = parent_view->AddChildView(std::move(add_action_move)); + add_action_move_->SetButtonTextColor(cros_styles::ResolveColor( + cros_styles::ColorName::kButtonLabelColorPrimary, IsDarkModeEnabled())); + add_action_move_->SetBackgroundColor(cros_styles::ResolveColor( + cros_styles::ColorName::kButtonBackgroundColorPrimary, + IsDarkModeEnabled())); add_action_move_->SetPosition( gfx::Point(parent_view->width() - add_action_move_->width(), add_action_tap_->height()));
diff --git a/chrome/browser/ash/arc/input_overlay/touch_injector.cc b/chrome/browser/ash/arc/input_overlay/touch_injector.cc index 06cf864..1bdf818 100644 --- a/chrome/browser/ash/arc/input_overlay/touch_injector.cc +++ b/chrome/browser/ash/arc/input_overlay/touch_injector.cc
@@ -95,6 +95,21 @@ return actions; } +// Return an Action which is not |target_action| and has input overlapped with +// |input_element| in |actions|. +Action* FindActionWithOverlapInputElement( + std::vector<std::unique_ptr<Action>>& actions, + Action* target_action, + const InputElement& input_element) { + for (auto& action : actions) { + if (action.get() == target_action) + continue; + if (action->IsOverlapped(input_element)) + return action.get(); + } + return nullptr; +} + } // namespace // Calculate the window content bounds (excluding caption if it exists) in the @@ -195,14 +210,13 @@ std::unique_ptr<InputElement> input_element) { if (display_overlay_controller_) display_overlay_controller_->RemoveEditMessage(); - Action* overlapped_action = nullptr; - for (auto& action : actions_) { - if (action.get() == target_action) - continue; - if (action->IsOverlapped(*input_element)) { - overlapped_action = action.get(); - break; - } + auto* overlapped_action = FindActionWithOverlapInputElement( + actions_, target_action, *input_element); + + // Check if there is conflict in pending list. + if (beta_ && !pending_add_actions_.empty() && !overlapped_action) { + overlapped_action = FindActionWithOverlapInputElement( + pending_add_actions_, target_action, *input_element); } // Partially unbind or completely unbind the |overlapped_action| if it
diff --git a/chrome/browser/ash/crosapi/browser_action.cc b/chrome/browser/ash/crosapi/browser_action.cc index 94604c91..56e4f2e 100644 --- a/chrome/browser/ash/crosapi/browser_action.cc +++ b/chrome/browser/ash/crosapi/browser_action.cc
@@ -79,16 +79,11 @@ class NewTabAction final : public BrowserAction { public: - explicit NewTabAction(bool should_trigger_session_restore) - : BrowserAction(true), - should_trigger_session_restore_(should_trigger_session_restore) {} + NewTabAction() : BrowserAction(true) {} void Perform(const VersionedBrowserService& service) override { - service.service->NewTab(should_trigger_session_restore_, base::DoNothing()); + service.service->NewTabWithoutParameter(base::DoNothing()); } - - private: - const bool should_trigger_session_restore_; }; class LaunchAction final : public BrowserAction { @@ -100,8 +95,7 @@ if (service.interface_version < mojom::BrowserService::kLaunchMinVersion) { LOG(WARNING) << "Lacros too old for Launch action - falling back to NewTab"; - service.service->NewTab(/*should_trigger_session_restore=*/true, - base::DoNothing()); + service.service->NewTabWithoutParameter(base::DoNothing()); return; } service.service->Launch(target_display_id_, base::DoNothing()); @@ -310,9 +304,8 @@ } // static -std::unique_ptr<BrowserAction> BrowserAction::NewTab( - bool should_trigger_session_restore) { - return std::make_unique<NewTabAction>(should_trigger_session_restore); +std::unique_ptr<BrowserAction> BrowserAction::NewTab() { + return std::make_unique<NewTabAction>(); } // static
diff --git a/chrome/browser/ash/crosapi/browser_action.h b/chrome/browser/ash/crosapi/browser_action.h index 4bd02cb..41428df 100644 --- a/chrome/browser/ash/crosapi/browser_action.h +++ b/chrome/browser/ash/crosapi/browser_action.h
@@ -36,8 +36,7 @@ bool incognito, bool should_trigger_session_restore, int64_t target_display_id); - static std::unique_ptr<BrowserAction> NewTab( - bool should_trigger_session_restore); + static std::unique_ptr<BrowserAction> NewTab(); static std::unique_ptr<BrowserAction> Launch(int64_t target_display_id); static std::unique_ptr<BrowserAction> NewWindowForDetachingTab( base::StringPiece16 tab_id_str,
diff --git a/chrome/browser/ash/crosapi/browser_manager.cc b/chrome/browser/ash/crosapi/browser_manager.cc index efbf6d23..8a1d2a5 100644 --- a/chrome/browser/ash/crosapi/browser_manager.cc +++ b/chrome/browser/ash/crosapi/browser_manager.cc
@@ -487,8 +487,8 @@ PerformOrEnqueue(BrowserAction::NewGuestWindow(target_display_id)); } -void BrowserManager::NewTab(bool should_trigger_session_restore) { - PerformOrEnqueue(BrowserAction::NewTab(should_trigger_session_restore)); +void BrowserManager::NewTab() { + PerformOrEnqueue(BrowserAction::NewTab()); } void BrowserManager::Launch() {
diff --git a/chrome/browser/ash/crosapi/browser_manager.h b/chrome/browser/ash/crosapi/browser_manager.h index 0c5a246..88c3c05 100644 --- a/chrome/browser/ash/crosapi/browser_manager.h +++ b/chrome/browser/ash/crosapi/browser_manager.h
@@ -171,7 +171,7 @@ // Similar to NewWindow(), but opens a tab instead if there already is a // window. See crosapi::mojom::BrowserService::NewTab for more details. - void NewTab(bool should_trigger_session_restore); + void NewTab(); // Similar to NewWindow and NewTab. If a suitable window exists, a new tab is // added. Otherwise a new window is created with session restore (no new tab
diff --git a/chrome/browser/ash/file_manager/file_manager_pref_names.cc b/chrome/browser/ash/file_manager/file_manager_pref_names.cc new file mode 100644 index 0000000..c64888f02 --- /dev/null +++ b/chrome/browser/ash/file_manager/file_manager_pref_names.cc
@@ -0,0 +1,18 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ash/file_manager/file_manager_pref_names.h" + +#include "components/prefs/pref_registry_simple.h" + +namespace file_manager::prefs { + +// A boolean pref to enable or disable /usr/sbin/smbfs verbose logging. +const char kSmbfsEnableVerboseLogging[] = "smbfs.enable_verbose_logging"; + +void RegisterProfilePrefs(PrefRegistrySimple* registry) { + registry->RegisterBooleanPref(kSmbfsEnableVerboseLogging, false); +} + +} // namespace file_manager::prefs
diff --git a/chrome/browser/ash/file_manager/file_manager_pref_names.h b/chrome/browser/ash/file_manager/file_manager_pref_names.h new file mode 100644 index 0000000..0c784d5 --- /dev/null +++ b/chrome/browser/ash/file_manager/file_manager_pref_names.h
@@ -0,0 +1,18 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ASH_FILE_MANAGER_FILE_MANAGER_PREF_NAMES_H_ +#define CHROME_BROWSER_ASH_FILE_MANAGER_FILE_MANAGER_PREF_NAMES_H_ + +class PrefRegistrySimple; + +namespace file_manager::prefs { + +extern const char kSmbfsEnableVerboseLogging[]; + +void RegisterProfilePrefs(PrefRegistrySimple* registry); + +} // namespace file_manager::prefs + +#endif // CHROME_BROWSER_ASH_FILE_MANAGER_FILE_MANAGER_PREF_NAMES_H_
diff --git a/chrome/browser/ash/net/network_portal_detector_impl_browsertest.cc b/chrome/browser/ash/net/network_portal_detector_impl_browsertest.cc index 46a6cd6c..53e26f2c 100644 --- a/chrome/browser/ash/net/network_portal_detector_impl_browsertest.cc +++ b/chrome/browser/ash/net/network_portal_detector_impl_browsertest.cc
@@ -101,7 +101,9 @@ : LoginManagerTest(), test_account_id_( AccountId::FromUserEmailGaiaId(kTestUser, kTestUserGaiaId)), - network_portal_detector_(nullptr) {} + network_portal_detector_(nullptr) { + feature_list_.InitAndDisableFeature({features::kCaptivePortalUI2022}); + } NetworkPortalDetectorImplBrowserTest( const NetworkPortalDetectorImplBrowserTest&) = delete; @@ -217,6 +219,7 @@ NetworkPortalDetectorImpl* network_portal_detector_; std::unique_ptr<NetworkPortalNotificationController> network_portal_notification_controller_; + base::test::ScopedFeatureList feature_list_; }; IN_PROC_BROWSER_TEST_F(NetworkPortalDetectorImplBrowserTest, @@ -300,11 +303,9 @@ : public NetworkPortalDetectorImplBrowserTest { public: NetworkPortalDetectorImplBrowserTestUI2022Update() { + feature_list_.Reset(); feature_list_.InitAndEnableFeature(features::kCaptivePortalUI2022); } - - protected: - base::test::ScopedFeatureList feature_list_; }; IN_PROC_BROWSER_TEST_F(NetworkPortalDetectorImplBrowserTestUI2022Update,
diff --git a/chrome/browser/ash/plugin_vm/plugin_vm_installer.cc b/chrome/browser/ash/plugin_vm/plugin_vm_installer.cc index a845cae5..11f0771 100644 --- a/chrome/browser/ash/plugin_vm/plugin_vm_installer.cc +++ b/chrome/browser/ash/plugin_vm/plugin_vm_installer.cc
@@ -13,7 +13,6 @@ #include "base/files/scoped_file.h" #include "base/guid.h" #include "base/strings/string_util.h" -#include "base/system/sys_info.h" #include "base/task/task_traits.h" #include "base/task/thread_pool.h" #include "chrome/browser/ash/plugin_vm/plugin_vm_drive_image_download_service.h" @@ -30,6 +29,7 @@ #include "chrome/browser/profiles/profile_key.h" #include "chromeos/ash/components/dbus/debug_daemon/debug_daemon_client.h" #include "chromeos/ash/components/dbus/dlcservice/dlcservice.pb.h" +#include "chromeos/ash/components/dbus/spaced/spaced_client.h" #include "components/download/public/background_service/background_download_service.h" #include "components/download/public/background_service/download_metadata.h" #include "components/prefs/pref_service.h" @@ -55,7 +55,7 @@ constexpr char kFailureReasonHistogram[] = "PluginVm.SetupFailureReason"; constexpr char kSetupTimeHistogram[] = "PluginVm.SetupTime"; -constexpr char kHomeDirectory[] = "/home"; +constexpr char kHomeDirectory[] = "/home/chronos/user"; ash::ConciergeClient* GetConciergeClient() { return ash::ConciergeClient::Get(); @@ -433,24 +433,21 @@ DCHECK_EQ(installing_state_, InstallingState::kCheckingForExistingVm); UpdateInstallingState(InstallingState::kCheckingDiskSpace); - base::ThreadPool::PostTaskAndReplyWithResult( - FROM_HERE, {base::MayBlock()}, - base::BindOnce(&base::SysInfo::AmountOfFreeDiskSpace, - base::FilePath(kHomeDirectory)), - base::BindOnce(&PluginVmInstaller::OnAvailableDiskSpace, - weak_ptr_factory_.GetWeakPtr())); + ash::SpacedClient::Get()->GetFreeDiskSpace( + kHomeDirectory, base::BindOnce(&PluginVmInstaller::OnAvailableDiskSpace, + weak_ptr_factory_.GetWeakPtr())); } -void PluginVmInstaller::OnAvailableDiskSpace(int64_t bytes) { +void PluginVmInstaller::OnAvailableDiskSpace(absl::optional<int64_t> bytes) { if (state_ == State::kCancelling) { CancelFinished(); return; } if (free_disk_space_for_testing_ != -1) - bytes = free_disk_space_for_testing_; + bytes = absl::optional<int64_t>(free_disk_space_for_testing_); - if (bytes < RequiredFreeDiskSpace()) { + if (!bytes.has_value() || bytes.value() < RequiredFreeDiskSpace()) { InstallFailed(FailureReason::INSUFFICIENT_DISK_SPACE); return; }
diff --git a/chrome/browser/ash/plugin_vm/plugin_vm_installer.h b/chrome/browser/ash/plugin_vm/plugin_vm_installer.h index a900296..cad41d5a 100644 --- a/chrome/browser/ash/plugin_vm/plugin_vm_installer.h +++ b/chrome/browser/ash/plugin_vm/plugin_vm_installer.h
@@ -194,7 +194,7 @@ absl::optional<vm_tools::concierge::ListVmDisksResponse> response); void CheckDiskSpace(); - void OnAvailableDiskSpace(int64_t bytes); + void OnAvailableDiskSpace(absl::optional<int64_t> bytes); void StartDlcDownload(); // Called repeatedly.
diff --git a/chrome/browser/ash/plugin_vm/plugin_vm_installer_unittest.cc b/chrome/browser/ash/plugin_vm/plugin_vm_installer_unittest.cc index a4320705..b2008c5 100644 --- a/chrome/browser/ash/plugin_vm/plugin_vm_installer_unittest.cc +++ b/chrome/browser/ash/plugin_vm/plugin_vm_installer_unittest.cc
@@ -30,6 +30,7 @@ #include "chromeos/ash/components/dbus/concierge/fake_concierge_client.h" #include "chromeos/ash/components/dbus/debug_daemon/debug_daemon_client.h" #include "chromeos/ash/components/dbus/dlcservice/fake_dlcservice_client.h" +#include "chromeos/ash/components/dbus/spaced/fake_spaced_client.h" #include "chromeos/ash/components/dbus/vm_plugin_dispatcher/vm_plugin_dispatcher_client.h" #include "components/account_id/account_id.h" #include "components/download/public/background_service/test/test_download_service.h" @@ -191,6 +192,7 @@ ash::DlcserviceClient::InitializeFake(); fake_dlcservice_client_ = static_cast<ash::FakeDlcserviceClient*>(ash::DlcserviceClient::Get()); + ash::FakeSpacedClient::InitializeFake(); } void TearDown() override { @@ -203,6 +205,7 @@ ash::DebugDaemonClient::Shutdown(); ash::ConciergeClient::Shutdown(); ash::DlcserviceClient::Shutdown(); + ash::FakeSpacedClient::Shutdown(); } void SetPluginVmImagePref(std::string url, std::string hash) {
diff --git a/chrome/browser/ash/smb_client/smb_service.cc b/chrome/browser/ash/smb_client/smb_service.cc index ad38acd4..f60001f 100644 --- a/chrome/browser/ash/smb_client/smb_service.cc +++ b/chrome/browser/ash/smb_client/smb_service.cc
@@ -16,6 +16,7 @@ #include "base/threading/thread_task_runner_handle.h" #include "base/time/default_tick_clock.h" #include "base/unguessable_token.h" +#include "chrome/browser/ash/file_manager/file_manager_pref_names.h" #include "chrome/browser/ash/file_system_provider/mount_path_util.h" #include "chrome/browser/ash/file_system_provider/provided_file_system_info.h" #include "chrome/browser/ash/kerberos/kerberos_credentials_manager.h" @@ -370,6 +371,8 @@ smbfs_options.password = password; smbfs_options.allow_ntlm = IsNTLMAuthenticationEnabled(); smbfs_options.skip_connect = skip_connect; + smbfs_options.enable_verbose_logging = profile_->GetPrefs()->GetBoolean( + file_manager::prefs::kSmbfsEnableVerboseLogging); if (save_credentials && !info.password_salt().empty()) { smbfs_options.save_restore_password = true; smbfs_options.account_hash = user->username_hash();
diff --git a/chrome/browser/ash/web_applications/files_internals_ui_delegate.cc b/chrome/browser/ash/web_applications/files_internals_ui_delegate.cc index be13b74..93db820d 100644 --- a/chrome/browser/ash/web_applications/files_internals_ui_delegate.cc +++ b/chrome/browser/ash/web_applications/files_internals_ui_delegate.cc
@@ -5,9 +5,16 @@ #include "chrome/browser/ash/web_applications/files_internals_ui_delegate.h" #include "base/values.h" +#include "chrome/browser/ash/file_manager/file_manager_pref_names.h" #include "chrome/browser/ash/fusebox/fusebox_server.h" +#include "chrome/browser/profiles/profile.h" +#include "components/prefs/pref_service.h" -ChromeFilesInternalsUIDelegate::ChromeFilesInternalsUIDelegate() = default; +ChromeFilesInternalsUIDelegate::ChromeFilesInternalsUIDelegate( + content::WebUI* web_ui) + : web_ui_(web_ui) {} + +ChromeFilesInternalsUIDelegate::~ChromeFilesInternalsUIDelegate() = default; base::Value ChromeFilesInternalsUIDelegate::GetDebugJSON() const { base::Value::Dict dict; @@ -20,3 +27,18 @@ return base::Value(std::move(dict)); } + +bool ChromeFilesInternalsUIDelegate::GetSmbfsEnableVerboseLogging() const { + Profile* profile = Profile::FromWebUI(web_ui_); + return profile && profile->GetPrefs()->GetBoolean( + file_manager::prefs::kSmbfsEnableVerboseLogging); +} + +void ChromeFilesInternalsUIDelegate::SetSmbfsEnableVerboseLogging( + bool enabled) { + Profile* profile = Profile::FromWebUI(web_ui_); + if (profile) { + profile->GetPrefs()->SetBoolean( + file_manager::prefs::kSmbfsEnableVerboseLogging, enabled); + } +}
diff --git a/chrome/browser/ash/web_applications/files_internals_ui_delegate.h b/chrome/browser/ash/web_applications/files_internals_ui_delegate.h index 85f38889..367edcc 100644 --- a/chrome/browser/ash/web_applications/files_internals_ui_delegate.h +++ b/chrome/browser/ash/web_applications/files_internals_ui_delegate.h
@@ -6,18 +6,29 @@ #define CHROME_BROWSER_ASH_WEB_APPLICATIONS_FILES_INTERNALS_UI_DELEGATE_H_ #include "ash/webui/files_internals/files_internals_ui_delegate.h" +#include "base/memory/raw_ptr.h" + +namespace content { +class WebUI; +} // namespace content // Chrome browser FilesInternalsUIDelegate implementation. class ChromeFilesInternalsUIDelegate : public ash::FilesInternalsUIDelegate { public: - ChromeFilesInternalsUIDelegate(); - + explicit ChromeFilesInternalsUIDelegate(content::WebUI* web_ui); ChromeFilesInternalsUIDelegate(const ChromeFilesInternalsUIDelegate&) = delete; ChromeFilesInternalsUIDelegate& operator=( const ChromeFilesInternalsUIDelegate&) = delete; + ~ChromeFilesInternalsUIDelegate() override; base::Value GetDebugJSON() const override; + + bool GetSmbfsEnableVerboseLogging() const override; + void SetSmbfsEnableVerboseLogging(bool enabled) override; + + private: + raw_ptr<content::WebUI> web_ui_; // Owns |this|. }; #endif // CHROME_BROWSER_ASH_WEB_APPLICATIONS_FILES_INTERNALS_UI_DELEGATE_H_
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc index a17ee4a..a4f2359 100644 --- a/chrome/browser/chrome_browser_interface_binders.cc +++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -227,6 +227,8 @@ #include "ash/webui/face_ml_app_ui/mojom/face_ml_app_ui.mojom.h" #include "ash/webui/file_manager/file_manager_ui.h" #include "ash/webui/file_manager/mojom/file_manager.mojom.h" +#include "ash/webui/files_internals/files_internals.h" +#include "ash/webui/files_internals/mojom/files_internals.mojom.h" #include "ash/webui/firmware_update_ui/firmware_update_app_ui.h" #include "ash/webui/firmware_update_ui/mojom/firmware_update.mojom.h" #include "ash/webui/guest_os_installer/guest_os_installer_ui.h" @@ -1348,6 +1350,8 @@ registry.ForWebUI<ash::ColorInternalsUI>() .Add<color_change_listener::mojom::PageHandler>(); } + registry.ForWebUI<ash::FilesInternalsUI>() + .Add<ash::mojom::files_internals::PageHandler>(); registry.ForWebUI<ash::file_manager::FileManagerUI>() .Add<color_change_listener::mojom::PageHandler>(); #endif // BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index f8ba53d..da6e359 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -137,6 +137,7 @@ "//ash/webui/resources:face_ml_app_bundle_resources_grit", "//ash/webui/resources:face_ml_app_resources_grit", "//ash/webui/resources:face_ml_app_untrusted_resources_grit", + "//ash/webui/resources:files_internals_resources_grit", "//ash/webui/resources:firmware_update_app_resources_grit", "//ash/webui/resources:help_app_resources_grit", "//ash/webui/resources:media_app_bundle_resources_grit",
diff --git a/chrome/browser/component_updater/first_party_sets_component_installer_unittest.cc b/chrome/browser/component_updater/first_party_sets_component_installer_unittest.cc index 2ff8a1d..f2a8191 100644 --- a/chrome/browser/component_updater/first_party_sets_component_installer_unittest.cc +++ b/chrome/browser/component_updater/first_party_sets_component_installer_unittest.cc
@@ -15,6 +15,7 @@ #include "base/test/test_future.h" #include "base/threading/thread_task_runner_handle.h" #include "base/version.h" +#include "chrome/browser/first_party_sets/mock_first_party_sets_handler.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/testing_browser_process.h" #include "components/component_updater/mock_component_updater_service.h" @@ -47,10 +48,15 @@ } void SetUp() override { - content::FirstPartySetsHandler::GetInstance()->ResetForTesting(); + content::FirstPartySetsHandler::SetInstanceForTesting( + &mock_first_party_sets_handler_); FirstPartySetsComponentInstallerPolicy::ResetForTesting(); } + void TearDown() override { + content::FirstPartySetsHandler::SetInstanceForTesting(nullptr); + } + // Subclasses are expected to call this in their constructors. virtual void InitializeFeatureList() = 0; @@ -59,6 +65,7 @@ base::ScopedTempDir component_install_dir_; base::test::ScopedFeatureList scoped_feature_list_; + first_party_sets::MockFirstPartySetsHandler mock_first_party_sets_handler_; }; class FirstPartySetsComponentInstallerFeatureEnabledTest
diff --git a/chrome/browser/download/bubble/download_display_controller.cc b/chrome/browser/download/bubble/download_display_controller.cc index 46152aa..8acedbc 100644 --- a/chrome/browser/download/bubble/download_display_controller.cc +++ b/chrome/browser/download/bubble/download_display_controller.cc
@@ -365,6 +365,10 @@ return icon_info_; } +bool DownloadDisplayController::IsDisplayShowingDetails() { + return display_->IsShowingDetails(); +} + DownloadDisplayController::ProgressInfo DownloadDisplayController::GetProgress() { ProgressInfo progress_info;
diff --git a/chrome/browser/download/bubble/download_display_controller.h b/chrome/browser/download/bubble/download_display_controller.h index f0ca7f8..bec4689 100644 --- a/chrome/browser/download/bubble/download_display_controller.h +++ b/chrome/browser/download/bubble/download_display_controller.h
@@ -68,6 +68,9 @@ // Returns an IconInfo that contains current state of the icon. IconInfo GetIconInfo(); + // Returns whether the display is showing details. + bool IsDisplayShowingDetails(); + // Notifies the controller that the button is pressed. Called by `display_`. void OnButtonPressed();
diff --git a/chrome/browser/download/download_session_durations_metrics_recorder.cc b/chrome/browser/download/download_session_durations_metrics_recorder.cc new file mode 100644 index 0000000..cf187f2e --- /dev/null +++ b/chrome/browser/download/download_session_durations_metrics_recorder.cc
@@ -0,0 +1,48 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/download/download_session_durations_metrics_recorder.h" + +#include "base/metrics/histogram_functions.h" +#include "chrome/browser/download/bubble/download_bubble_controller.h" +#include "chrome/browser/download/bubble/download_display_controller.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_finder.h" +#include "chrome/browser/ui/browser_window.h" + +DownloadSessionDurationsMetricsRecorder:: + DownloadSessionDurationsMetricsRecorder() + : session_start_(base::TimeTicks::Now()) {} + +void DownloadSessionDurationsMetricsRecorder::OnSessionStarted( + base::TimeTicks session_start) { + // Do not reset the session start time if the bubble is showing when the last + // session ends. Assume user is spending time on the bubble during this + // period. + if (!is_bubble_showing_when_session_end_) { + session_start_ = session_start; + } +} + +void DownloadSessionDurationsMetricsRecorder::OnSessionEnded( + base::TimeTicks session_end) { + Browser* browser = chrome::FindLastActive(); + is_bubble_showing_when_session_end_ = + browser && browser->window() && + browser->window()->GetDownloadBubbleUIController() && + browser->window() + ->GetDownloadBubbleUIController() + ->GetDownloadDisplayController() + ->IsDisplayShowingDetails(); + base::UmaHistogramBoolean( + "Download.Session.IsDownloadBubbleShowingWhenSessionEnds", + is_bubble_showing_when_session_end_); + if (!is_bubble_showing_when_session_end_) { + // `OnSessionEnded` can be called with some delays, so we can't use + // base::TimeTicks::Now() here. + base::UmaHistogramLongTimes( + "Download.Session.TotalDurationIncludingBubbleTime", + session_end - session_start_); + } +}
diff --git a/chrome/browser/download/download_session_durations_metrics_recorder.h b/chrome/browser/download/download_session_durations_metrics_recorder.h new file mode 100644 index 0000000..174f54e --- /dev/null +++ b/chrome/browser/download/download_session_durations_metrics_recorder.h
@@ -0,0 +1,26 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SESSION_DURATIONS_METRICS_RECORDER_H_ +#define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SESSION_DURATIONS_METRICS_RECORDER_H_ + +#include "base/time/time.h" + +class DownloadSessionDurationsMetricsRecorder { + public: + DownloadSessionDurationsMetricsRecorder(); + ~DownloadSessionDurationsMetricsRecorder() = default; + DownloadSessionDurationsMetricsRecorder( + const DownloadSessionDurationsMetricsRecorder&) = delete; + + // Called from DesktopProfileSessionDurationsService + void OnSessionStarted(base::TimeTicks session_start); + void OnSessionEnded(base::TimeTicks session_end); + + private: + base::TimeTicks session_start_; + bool is_bubble_showing_when_session_end_ = false; +}; + +#endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SESSION_DURATIONS_METRICS_RECORDER_H_
diff --git a/chrome/browser/feed/feed_service_factory.cc b/chrome/browser/feed/feed_service_factory.cc index 7408228..68559e95 100644 --- a/chrome/browser/feed/feed_service_factory.cc +++ b/chrome/browser/feed/feed_service_factory.cc
@@ -125,8 +125,10 @@ // by design. We do not provide the variations IDs from the backend // and do not attach them to the X-Client-Data header. for (const auto& exp : experiments) { - ChromeMetricsServiceAccessor::RegisterSyntheticFieldTrial(exp.first, - exp.second); + for (const auto& group_name : exp.second) { + ChromeMetricsServiceAccessor::RegisterSyntheticFieldTrial(exp.first, + group_name); + } } } void RegisterFollowingFeedFollowCountFieldTrial(
diff --git a/chrome/browser/first_party_sets/first_party_sets_policy_service_unittest.cc b/chrome/browser/first_party_sets/first_party_sets_policy_service_unittest.cc index 02cd1fe..d218ac5 100644 --- a/chrome/browser/first_party_sets/first_party_sets_policy_service_unittest.cc +++ b/chrome/browser/first_party_sets/first_party_sets_policy_service_unittest.cc
@@ -60,11 +60,20 @@ DefaultFirstPartySetsPolicyServiceTest() = default; void SetUp() override { - content::FirstPartySetsHandler::GetInstance()->ResetForTesting(); + content::FirstPartySetsHandler::SetInstanceForTesting( + &mock_first_party_sets_handler_); + mock_first_party_sets_handler_.SetContextConfig( + net::FirstPartySetsContextConfig()); + mock_first_party_sets_handler_.SetCacheFilter( + net::FirstPartySetsCacheFilter()); mock_delegate_receiver_.Bind( mock_delegate_remote_.BindNewPipeAndPassReceiver()); } + void TearDown() override { + content::FirstPartySetsHandler::SetInstanceForTesting(nullptr); + } + content::BrowserTaskEnvironment& env() { return env_; } protected: @@ -76,6 +85,7 @@ private: content::BrowserTaskEnvironment env_; + first_party_sets::MockFirstPartySetsHandler mock_first_party_sets_handler_; }; TEST_F(DefaultFirstPartySetsPolicyServiceTest, DisabledByFeature) {
diff --git a/chrome/browser/first_party_sets/mock_first_party_sets_handler.cc b/chrome/browser/first_party_sets/mock_first_party_sets_handler.cc index 06674c1..3b4566e 100644 --- a/chrome/browser/first_party_sets/mock_first_party_sets_handler.cc +++ b/chrome/browser/first_party_sets/mock_first_party_sets_handler.cc
@@ -56,12 +56,6 @@ std::move(callback).Run(config_->Clone(), cache_filter_->Clone()); } -void MockFirstPartySetsHandler::ResetForTesting() { - global_sets_ = absl::nullopt; - config_ = absl::nullopt; - cache_filter_ = absl::nullopt; -} - void MockFirstPartySetsHandler::SetContextConfig( net::FirstPartySetsContextConfig config) { config_ = std::move(config);
diff --git a/chrome/browser/first_party_sets/mock_first_party_sets_handler.h b/chrome/browser/first_party_sets/mock_first_party_sets_handler.h index 80d30c0..d0deec5e 100644 --- a/chrome/browser/first_party_sets/mock_first_party_sets_handler.h +++ b/chrome/browser/first_party_sets/mock_first_party_sets_handler.h
@@ -39,7 +39,6 @@ bool IsEnabled() const override; void SetPublicFirstPartySets(const base::Version& version, base::File sets_file) override; - void ResetForTesting() override; absl::optional<net::FirstPartySetEntry> FindEntry( const net::SchemefulSite& site, const net::FirstPartySetsContextConfig& config) const override;
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index f762c05..71126c4 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -198,11 +198,6 @@ "expiry_milestone": 110 }, { - "name": "app-store-rating-test-engaged-user", - "owners": [ "hiramahmood@google.com", "bling-flags@google.com" ], - "expiry_milestone": 110 - }, - { "name": "arc-custom-tabs-experiment", "owners": [ "hashimoto", "dominickn" ], "expiry_milestone": 95 @@ -1582,7 +1577,7 @@ { "name": "drive-fs-chrome-networking", "owners": [ "travislane@google.com" ], - "expiry_milestone": 108 + "expiry_milestone": 112 }, { "name": "drop-input-events-before-first-paint", @@ -2151,11 +2146,6 @@ "expiry_milestone": 115 }, { - "name": "enable-desktop-pwas-window-controls-overlay", - "owners": [ "ambake@microsoft.com", "desktop-pwas-team@google.com" ], - "expiry_milestone": 106 - }, - { "name": "enable-device-trust-connector", "owners": [ "rogerta", "seblalancette" ], "expiry_milestone": 110 @@ -3075,7 +3065,7 @@ { "name": "enable-tab-audio-muting", "owners": [ "evliu@google.com", "chrome-media-ux@google.com" ], - "expiry_milestone": 107 + "expiry_milestone": 115 }, { "name": "enable-tab-engagement-reporting", @@ -6097,11 +6087,6 @@ "expiry_milestone": 96 }, { - "name": "share-button-in-top-toolbar", - "owners": [ "jeffreycohen", "chrome-with-friends-robots@google.com" ], - "expiry_milestone": 92 - }, - { "name": "shared-highlighting-amp", "owners": ["cheickcisse@google.com"], "expiry_milestone": 97
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 9ed4dd9a..025f769b3 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -936,13 +936,6 @@ "Prototype implementation of: " "https://github.com/ivansandrk/multi-apps/blob/main/explainer.md"; -const char kDesktopPWAsWindowControlsOverlayName[] = - "Desktop PWA Window Controls Overlay"; -const char kDesktopPWAsWindowControlsOverlayDescription[] = - "Enable web app manifests to declare Window Controls Overlay as a display " - "override. Prototype implementation of: " - "https://github.com/WICG/window-controls-overlay/blob/main/explainer.md"; - const char kDesktopPWAsBorderlessName[] = "Desktop PWA Borderless"; const char kDesktopPWAsBorderlessDescription[] = "Enable web app manifests to declare borderless mode as a display " @@ -4184,10 +4177,6 @@ "Adaptive button in top toolbar customization"; const char kAdaptiveButtonInTopToolbarCustomizationDescription[] = "Enables UI for customizing the adaptive action button in the top toolbar"; -const char kShareButtonInTopToolbarName[] = "Share button in top toolbar"; -const char kShareButtonInTopToolbarDescription[] = - "Enables UI to initiate sharing from the top toolbar. Enabling Adaptive " - "Button overrides this."; const char kVoiceButtonInTopToolbarName[] = "Voice button in top toolbar"; const char kVoiceButtonInTopToolbarDescription[] = "Enables showing the voice search button in the top toolbar. Enabling "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index f5a6656..273d633 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -532,9 +532,6 @@ extern const char kDesktopPWAsWebBundlesName[]; extern const char kDesktopPWAsWebBundlesDescription[]; -extern const char kDesktopPWAsWindowControlsOverlayName[]; -extern const char kDesktopPWAsWindowControlsOverlayDescription[]; - extern const char kDesktopPWAsBorderlessName[]; extern const char kDesktopPWAsBorderlessDescription[]; @@ -2371,8 +2368,6 @@ extern const char kAdaptiveButtonInTopToolbarDescription[]; extern const char kAdaptiveButtonInTopToolbarCustomizationName[]; extern const char kAdaptiveButtonInTopToolbarCustomizationDescription[]; -extern const char kShareButtonInTopToolbarName[]; -extern const char kShareButtonInTopToolbarDescription[]; extern const char kVoiceButtonInTopToolbarName[]; extern const char kVoiceButtonInTopToolbarDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index 0b991ec3..ad0f07e 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -290,7 +290,6 @@ &kSearchEnginePromoExistingDeviceV2, &kSearchEnginePromoNewDevice, &kSearchEnginePromoNewDeviceV2, - &kShareButtonInTopToolbar, &kShowScrollableMVTOnNTPAndroid, &kFeedPositionAndroid, &kSearchResumptionModuleAndroid, @@ -952,10 +951,6 @@ "SafeModeForCachedFlags", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kShareButtonInTopToolbar, - "ShareButtonInTopToolbar", - base::FEATURE_DISABLED_BY_DEFAULT); - BASE_FEATURE(kShowScrollableMVTOnNTPAndroid, "ShowScrollableMVTOnNTPAndroid", base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h index 402124ba..d04c814 100644 --- a/chrome/browser/flags/android/chrome_feature_list.h +++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -143,7 +143,6 @@ BASE_DECLARE_FEATURE(kSearchEnginePromoExistingDeviceV2); BASE_DECLARE_FEATURE(kSearchEnginePromoNewDevice); BASE_DECLARE_FEATURE(kSearchEnginePromoNewDeviceV2); -BASE_DECLARE_FEATURE(kShareButtonInTopToolbar); BASE_DECLARE_FEATURE(kSharingHubLinkToggle); BASE_DECLARE_FEATURE(kShowScrollableMVTOnNTPAndroid); BASE_DECLARE_FEATURE(kFeedPositionAndroid);
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index c50e572..ea9b8af 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -540,7 +540,6 @@ "SearchEnginePromo.NewDeviceVer2"; public static final String SEND_TAB_TO_SELF_SIGNIN_PROMO = "SendTabToSelfSigninPromo"; public static final String SEND_TAB_TO_SELF_V2 = "SendTabToSelfV2"; - public static final String SHARE_BUTTON_IN_TOP_TOOLBAR = "ShareButtonInTopToolbar"; public static final String SHARE_CROW_BUTTON = "ShareCrowButton"; public static final String SHARE_CROW_BUTTON_LAUNCH_TAB = "ShareCrowLaunchTab"; public static final String SHARED_HIGHLIGHTING_AMP = "SharedHighlightingAmp";
diff --git a/chrome/browser/metrics/desktop_session_duration/desktop_profile_session_durations_service.cc b/chrome/browser/metrics/desktop_session_duration/desktop_profile_session_durations_service.cc index d20ed2c..639e599 100644 --- a/chrome/browser/metrics/desktop_session_duration/desktop_profile_session_durations_service.cc +++ b/chrome/browser/metrics/desktop_session_duration/desktop_profile_session_durations_service.cc
@@ -24,7 +24,9 @@ std::make_unique< password_manager::PasswordSessionDurationsMetricsRecorder>( pref_service, - sync_service)) { + sync_service)), + download_metrics_recorder_( + std::make_unique<DownloadSessionDurationsMetricsRecorder>()) { session_duration_observation_.Observe(tracker); if (tracker->in_session()) { // The session was started before this service was created. Let's start @@ -47,6 +49,7 @@ password_metrics_recorder_.reset(); sync_metrics_recorder_.reset(); + download_metrics_recorder_.reset(); } bool DesktopProfileSessionDurationsService::IsSignedIn() const { @@ -61,6 +64,7 @@ base::TimeTicks session_start) { sync_metrics_recorder_->OnSessionStarted(session_start); password_metrics_recorder_->OnSessionStarted(session_start); + download_metrics_recorder_->OnSessionStarted(session_start); } void DesktopProfileSessionDurationsService::OnSessionEnded( @@ -68,6 +72,7 @@ base::TimeTicks session_end) { sync_metrics_recorder_->OnSessionEnded(session_length); password_metrics_recorder_->OnSessionEnded(session_length); + download_metrics_recorder_->OnSessionEnded(session_end); } } // namespace metrics
diff --git a/chrome/browser/metrics/desktop_session_duration/desktop_profile_session_durations_service.h b/chrome/browser/metrics/desktop_session_duration/desktop_profile_session_durations_service.h index 76800704..6c0fc7e 100644 --- a/chrome/browser/metrics/desktop_session_duration/desktop_profile_session_durations_service.h +++ b/chrome/browser/metrics/desktop_session_duration/desktop_profile_session_durations_service.h
@@ -6,6 +6,7 @@ #define CHROME_BROWSER_METRICS_DESKTOP_SESSION_DURATION_DESKTOP_PROFILE_SESSION_DURATIONS_SERVICE_H_ #include "base/scoped_observation.h" +#include "chrome/browser/download/download_session_durations_metrics_recorder.h" #include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h" #include "components/keyed_service/core/keyed_service.h" #include "components/password_manager/core/browser/password_session_durations_metrics_recorder.h" @@ -57,6 +58,8 @@ sync_metrics_recorder_; std::unique_ptr<password_manager::PasswordSessionDurationsMetricsRecorder> password_metrics_recorder_; + std::unique_ptr<DownloadSessionDurationsMetricsRecorder> + download_metrics_recorder_; base::ScopedObservation<DesktopSessionDurationTracker, DesktopSessionDurationTracker::Observer>
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index f4cddfb..baffeeb 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -330,6 +330,7 @@ #include "chrome/browser/ash/cryptauth/client_app_metadata_provider_service.h" #include "chrome/browser/ash/cryptauth/cryptauth_device_id_provider_impl.h" #include "chrome/browser/ash/customization/customization_document.h" +#include "chrome/browser/ash/file_manager/file_manager_pref_names.h" #include "chrome/browser/ash/file_manager/file_tasks.h" #include "chrome/browser/ash/file_system_provider/registry.h" #include "chrome/browser/ash/first_run/first_run.h" @@ -1518,6 +1519,7 @@ policy::RebootNotificationsScheduler::RegisterProfilePrefs(registry); ash::KioskAppManager::RegisterProfilePrefs(registry); file_manager::file_tasks::RegisterProfilePrefs(registry); + file_manager::prefs::RegisterProfilePrefs(registry); #endif // BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(IS_CHROMEOS_LACROS) @@ -1990,6 +1992,11 @@ // Added 09/2022. profile_prefs->ClearPref(kFirstPartySetsEnabled); +#if BUILDFLAG(IS_ANDROID) + // Added 10/2022 + feed::MigrateObsoleteProfilePrefsOct_2022(profile_prefs); +#endif // BUILDFLAG(IS_ANDROID) + // Please don't delete the following line. It is used by PRESUBMIT.py. // END_MIGRATE_OBSOLETE_PROFILE_PREFS
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc index e8c5c966..c65e3af 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc
@@ -2353,9 +2353,6 @@ prefs()->SetUserPref(prefs::kPrivacySandboxFirstPartySetsEnabled, std::make_unique<base::Value>(true)); - // Reset test state to reflect required state above. - content::FirstPartySetsHandler::GetInstance()->ResetForTesting(); - // Verify `GetFirstPartySetOwner` returns empty if FPS is enabled but the // Global sets are not ready yet. EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(associate1_gurl),
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/accessibility_common/BUILD.gn index ef30dd2..c1f6206 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/BUILD.gn +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/BUILD.gn
@@ -292,6 +292,8 @@ "$pumpkin_output_dir/tagger_wasm_main.wasm", "$pumpkin_output_dir/en_us/action_config.binarypb", "$pumpkin_output_dir/en_us/pumpkin_config.binarypb", + "$pumpkin_output_dir/fr_fr/action_config.binarypb", + "$pumpkin_output_dir/fr_fr/pumpkin_config.binarypb", ] args = [ "--dest-dir=resources/chromeos/accessibility/accessibility_common/dictation/parse/pumpkin",
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_test_base.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_test_base.js index 9b6d63f..cda418e 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_test_base.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_test_base.js
@@ -76,6 +76,8 @@ await importModule( 'Dictation', '/accessibility_common/dictation/dictation.js'); assertNotNullNorUndefined(Dictation); + await importModule( + 'LocaleInfo', '/accessibility_common/dictation/locale_info.js'); await new Promise(resolve => { chrome.accessibilityFeatures.dictation.set({value: true}, resolve); }); @@ -381,6 +383,14 @@ text: ${props.text} hints: ${props.hints}`); } + + /** + * Always allows Dictation commands, even if the Dictation locale and browser + * locale differ. Only used for testing. + */ + alwaysEnableCommands() { + LocaleInfo.alwaysEnableCommandsForTesting = true; + } }; /** A Dictation test class that fails on console warnings and errors. */
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/locale_info.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/locale_info.js index 63593e1..27af2fb0 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/locale_info.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/locale_info.js
@@ -44,7 +44,8 @@ return true; } - return Boolean(LocaleInfo.getUILanguage()) && + return LocaleInfo.alwaysEnableCommandsForTesting || + Boolean(LocaleInfo.getUILanguage()) && (LocaleInfo.getUILanguage() === systemLanguage || LocaleInfo.getUILanguage() === systemLocale); } @@ -65,6 +66,9 @@ */ LocaleInfo.locale = ''; +/** @type {boolean} */ +LocaleInfo.alwaysEnableCommandsForTesting = false; + /** * @const {!Set<string>} * @private
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/dictation_pumpkin_parse_test.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/dictation_pumpkin_parse_test.js index 84cb77c..ff2c9fb 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/dictation_pumpkin_parse_test.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/dictation_pumpkin_parse_test.js
@@ -141,5 +141,35 @@ } }); +AX_TEST_F('DictationPumpkinParseTest', 'ChangeLocale', async function() { + await this.waitForPumpkinParseStrategy_(); + this.alwaysEnableCommands(); + // Pumpkin should work in English. + await this.runParseTestCase( + new ParseTestCase('copy selected text', 'COPY_SELECTED_TEXT')); + // Change the locale. + await this.setPref(Dictation.DICTATION_LOCALE_PREF, 'fr-FR'); + await this.waitForPumpkinParseStrategy_(); + // Pumpkin should work in new locale. + await this.runParseTestCase( + new ParseTestCase('copier', 'COPY_SELECTED_TEXT')); + await this.runParseTestCase(new ParseTestCase( + 'supprimer deux caractères précédent', 'DELETE_PREV_CHAR', 2)); +}); + +AX_TEST_F('DictationPumpkinParseTest', 'UnsupportedLocale', async function() { + await this.waitForPumpkinParseStrategy_(); + this.alwaysEnableCommands(); + await this.setPref(Dictation.DICTATION_LOCALE_PREF, 'ja'); + await this.waitForPumpkinParseStrategy_(); + await this.runParseTestCase(new ParseTestCase('copy selected text')); + // Would produce an UNDO_TEXT_EDIT macro if Japanese was supported. + await this.runParseTestCase(new ParseTestCase('もとどおりにする')); + await this.setPref(Dictation.DICTATION_LOCALE_PREF, 'en-US'); + await this.waitForPumpkinParseStrategy_(); + await this.runParseTestCase( + new ParseTestCase('copy selected text', 'COPY_SELECTED_TEXT')); +}); + // TODO(https://crbug.com/1258190): Add test cases for when Dictation is in // another en-* locale (e.g. en-GB).
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/pumpkin/pumpkin_constants.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/pumpkin/pumpkin_constants.js index 25b20c3f..9c7c5a9 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/pumpkin/pumpkin_constants.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/pumpkin/pumpkin_constants.js
@@ -38,6 +38,7 @@ READY: 'ready', FULLY_INITIALIZED: 'fullyInitialized', TAG_RESULTS: 'tagResults', + REFRESHED: 'refreshed', }; /** @@ -47,6 +48,7 @@ export const ToPumpkinTaggerCommand = { LOAD: 'load', TAG: 'tagAndGetNBestHypotheses', + REFRESH: 'refresh', }; /** @@ -108,6 +110,7 @@ 'en-SG': PumpkinLocale.EN_US, 'en-TZ': PumpkinLocale.EN_US, 'en-ZA': PumpkinLocale.EN_US, + 'fr-FR': PumpkinLocale.FR_FR, }; /**
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/pumpkin/pumpkin_tagger_externs.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/pumpkin/pumpkin_tagger_externs.js index e49686b5..fc174daa 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/pumpkin/pumpkin_tagger_externs.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/pumpkin/pumpkin_tagger_externs.js
@@ -75,22 +75,22 @@ * This proto file can be generated using pumpkin/tools/build_binary_configs * which converts an pumpkin.config and directory of grammar .far files into a * single binary file. - * @param {string} filename The pumpkin config binary file to load. + * @param {!ArrayBuffer} buffer The pumpkin config binary file contents. * @return {!Promise<boolean>} */ speech.pumpkin.api.js.PumpkinTagger.PumpkinTagger.prototype - .initializeFromPumpkinConfig = async function(filename) {}; + .initializeFromPumpkinConfig = async function(buffer) {}; /** * Loads an ActionFrame from an ActionSetConfig proto binary file. * This proto file can be generated using pumpkin/tools/build_binary_configs * which converts an action.config and directory of .far files into a single * binary file. - * @param {string} filename The action set config binary file to load. + * @param {!ArrayBuffer} buffer The action set config binary file contents. * @return {!Promise<boolean>} */ speech.pumpkin.api.js.PumpkinTagger.PumpkinTagger.prototype.loadActionFrame = - async function(filename) {}; + async function(buffer) {}; /** * Cleans up C++ memory. Should be called before the tagger is
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/pumpkin_parse_strategy.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/pumpkin_parse_strategy.js index f4082f2..273e9cb 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/pumpkin_parse_strategy.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/pumpkin_parse_strategy.js
@@ -36,6 +36,8 @@ this.tagResolver_ = null; /** @private {?Worker} */ this.worker_ = null; + /** @private {?PumpkinConstants.PumpkinLocale} */ + this.locale_ = null; this.init_(); } @@ -46,9 +48,8 @@ .DICTATION_PUMPKIN_PARSING; chrome.accessibilityPrivate.isFeatureEnabled(pumpkinFeature, enabled => { this.featureEnabled_ = enabled; - const pumpkinLocale = - PumpkinConstants.SUPPORTED_LOCALES[LocaleInfo.locale]; - if (!enabled || !pumpkinLocale) { + this.refreshLocale_(); + if (!enabled || !this.locale_) { return; } @@ -76,8 +77,8 @@ } } - const pumpkinLocale = PumpkinConstants.SUPPORTED_LOCALES[LocaleInfo.locale]; - if (!pumpkinLocale || !this.isEnabled()) { + this.refreshLocale_(); + if (!this.locale_ || !this.isEnabled()) { return; } @@ -101,9 +102,8 @@ /** @type {!PumpkinConstants.FromPumpkinTagger} */ (message.data); switch (command.type) { case PumpkinConstants.FromPumpkinTaggerCommand.READY: - const pumpkinLocale = - PumpkinConstants.SUPPORTED_LOCALES[LocaleInfo.locale]; - if (!pumpkinLocale) { + this.refreshLocale_(); + if (!this.locale_) { throw new Error( `Can't load SandboxedPumpkinTagger in an unsupported locale ${ LocaleInfo.locale}`); @@ -111,17 +111,22 @@ this.sendToSandboxedPumpkinTagger_({ type: PumpkinConstants.ToPumpkinTaggerCommand.LOAD, - locale: pumpkinLocale, + locale: this.locale_, pumpkinData: this.pumpkinData_, }); this.pumpkinData_ = null; return; case PumpkinConstants.FromPumpkinTaggerCommand.FULLY_INITIALIZED: this.pumpkinTaggerReady_ = true; + this.maybeRefresh_(); return; case PumpkinConstants.FromPumpkinTaggerCommand.TAG_RESULTS: this.tagResolver_(command.results); return; + case PumpkinConstants.FromPumpkinTaggerCommand.REFRESHED: + this.pumpkinTaggerReady_ = true; + this.maybeRefresh_(); + return; } throw new Error( @@ -136,7 +141,8 @@ sendToSandboxedPumpkinTagger_(command) { if (!this.worker_) { throw new Error( - 'Worker not ready, cannot send message to SandboxedPumpkinTagger'); + `Worker not ready, cannot send command to SandboxedPumpkinTagger: ${ + command.type}`); } this.worker_.postMessage(command); @@ -213,12 +219,38 @@ } } + /** @private */ + refreshLocale_() { + this.locale_ = + PumpkinConstants.SUPPORTED_LOCALES[LocaleInfo.locale] || null; + } + + /** + * Refreshes SandboxedPumpkinTagger if the Dictation locale differs from + * the pumpkin locale. + * @private + */ + maybeRefresh_() { + const dictationLocale = + PumpkinConstants.SUPPORTED_LOCALES[LocaleInfo.locale]; + if (dictationLocale !== this.locale_) { + this.refresh(); + } + } + /** @override */ refresh() { - const pumpkinLocale = PumpkinConstants.SUPPORTED_LOCALES[LocaleInfo.locale]; - this.enabled = Boolean(pumpkinLocale) && LocaleInfo.areCommandsSupported(); - // TODO(https://crbug.com/1258190): Re-initialize SandboxedPumpkinTagger - // if the locale changed. + this.refreshLocale_(); + this.enabled = Boolean(this.locale_) && LocaleInfo.areCommandsSupported(); + if (!this.isEnabled() || !this.locale_ || !this.pumpkinTaggerReady_) { + return; + } + + this.pumpkinTaggerReady_ = false; + this.sendToSandboxedPumpkinTagger_({ + type: PumpkinConstants.ToPumpkinTaggerCommand.REFRESH, + locale: this.locale_, + }); } /** @override */
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/sandboxed_pumpkin_tagger.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/sandboxed_pumpkin_tagger.js index fdb1d93a..c9ee9543 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/sandboxed_pumpkin_tagger.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/sandboxed_pumpkin_tagger.js
@@ -12,6 +12,8 @@ constructor() { /** @private {?speech.pumpkin.api.js.PumpkinTagger.PumpkinTagger} */ this.pumpkinTagger_ = null; + /** @private {?PumpkinConstants.PumpkinData} */ + this.pumpkinData_ = null; this.init_(); } @@ -45,6 +47,10 @@ const numResults = /** @type {number} */ (command.numResults); this.tagAndGetNBestHypotheses_(text, numResults); return; + case PumpkinConstants.ToPumpkinTaggerCommand.REFRESH: + this.refresh_( + /** @type {!PumpkinConstants.PumpkinLocale} */ (command.locale)); + return; } throw new Error(`Unrecognized message received in SandboxedPumpkinTagger: ${ @@ -81,6 +87,7 @@ throw new Error(`Can't load pumpkin tagger from empty data`); } + this.pumpkinData_ = data; // Unpack the PumpkinTagger JS. const pumpkinTaggerBytes = data.js_pumpkin_tagger_bin_js; if (!pumpkinTaggerBytes) { @@ -138,34 +145,7 @@ await wasmLoadPromise; // Initialize from config files. - let pumpkinConfig; - let actionConfig; - switch (locale) { - case PumpkinConstants.PumpkinLocale.EN_US: - pumpkinConfig = data.en_us_pumpkin_config_binarypb; - actionConfig = data.en_us_action_config_binarypb; - break; - case PumpkinConstants.PumpkinLocale.FR_FR: - pumpkinConfig = data.fr_fr_pumpkin_config_binarypb; - actionConfig = data.fr_fr_action_config_binarypb; - break; - case PumpkinConstants.PumpkinLocale.IT_IT: - pumpkinConfig = data.it_it_pumpkin_config_binarypb; - actionConfig = data.it_it_action_config_binarypb; - break; - case PumpkinConstants.PumpkinLocale.DE_DE: - pumpkinConfig = data.de_de_pumpkin_config_binarypb; - actionConfig = data.de_de_action_config_binarypb; - break; - case PumpkinConstants.PumpkinLocale.ES_ES: - pumpkinConfig = data.es_es_pumpkin_config_binarypb; - actionConfig = data.es_es_action_config_binarypb; - break; - default: - throw new Error( - `Can't initialize Pumpkin in unsupported locale: ${locale}`); - } - + const {pumpkinConfig, actionConfig} = this.getConfigsForLocale(locale); pumpkinTagger.initializeFromPumpkinConfig(pumpkinConfig); pumpkinTagger.loadActionFrame(actionConfig); @@ -174,6 +154,66 @@ this.sendToBackground_( {type: PumpkinConstants.FromPumpkinTaggerCommand.FULLY_INITIALIZED}); } + + /** + * Refreshes SandboxedPumpkinTagger in a new locale. + * @param {!PumpkinConstants.PumpkinLocale} locale + */ + refresh_(locale) { + if (!this.pumpkinTagger_) { + throw new Error( + 'SandboxedPumpkinTagger must be initialized before calling refresh'); + } + + const {pumpkinConfig, actionConfig} = this.getConfigsForLocale(locale); + this.pumpkinTagger_.initializeFromPumpkinConfig(pumpkinConfig); + this.pumpkinTagger_.loadActionFrame(actionConfig); + this.sendToBackground_({ + type: PumpkinConstants.FromPumpkinTaggerCommand.REFRESHED, + }); + } + + /** + * @param {!PumpkinConstants.PumpkinLocale} locale + * @return {!{pumpkinConfig: !ArrayBuffer, actionConfig: !ArrayBuffer}} + */ + getConfigsForLocale(locale) { + let pumpkinConfig; + let actionConfig; + switch (locale) { + case PumpkinConstants.PumpkinLocale.EN_US: + pumpkinConfig = this.pumpkinData_.en_us_pumpkin_config_binarypb; + actionConfig = this.pumpkinData_.en_us_action_config_binarypb; + break; + case PumpkinConstants.PumpkinLocale.FR_FR: + pumpkinConfig = this.pumpkinData_.fr_fr_pumpkin_config_binarypb; + actionConfig = this.pumpkinData_.fr_fr_action_config_binarypb; + break; + case PumpkinConstants.PumpkinLocale.IT_IT: + pumpkinConfig = this.pumpkinData_.it_it_pumpkin_config_binarypb; + actionConfig = this.pumpkinData_.it_it_action_config_binarypb; + break; + case PumpkinConstants.PumpkinLocale.DE_DE: + pumpkinConfig = this.pumpkinData_.de_de_pumpkin_config_binarypb; + actionConfig = this.pumpkinData_.de_de_action_config_binarypb; + break; + case PumpkinConstants.PumpkinLocale.ES_ES: + pumpkinConfig = this.pumpkinData_.es_es_pumpkin_config_binarypb; + actionConfig = this.pumpkinData_.es_es_action_config_binarypb; + break; + default: + throw new Error( + `Can't initialize Pumpkin in unsupported locale: ${locale}`); + } + + if (!pumpkinConfig || !actionConfig) { + throw new Error( + `Either pumpkinConfig or actionConfig is invalid for locale: ${ + locale}`); + } + + return {pumpkinConfig, actionConfig}; + } } new SandboxedPumpkinTagger();
diff --git a/chrome/browser/resources/chromeos/accessibility/common/testing/e2e_test_base.js b/chrome/browser/resources/chromeos/accessibility/common/testing/e2e_test_base.js index 9213d676..9cb4682 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/testing/e2e_test_base.js +++ b/chrome/browser/resources/chromeos/accessibility/common/testing/e2e_test_base.js
@@ -49,7 +49,7 @@ GEN(` TtsExtensionEngine::GetInstance()->DisableBuiltInTTSEngineForTesting(); if (ash_starter()->HasLacrosArgument()) { - crosapi::BrowserManager::Get()->NewTab(false); + crosapi::BrowserManager::Get()->NewTab(); ASSERT_TRUE(crosapi::BrowserManager::Get()->IsRunning()); } `);
diff --git a/chrome/browser/resources/chromeos/accessibility/common/testing/mock_accessibility_private.js b/chrome/browser/resources/chromeos/accessibility/common/testing/mock_accessibility_private.js index 3f3460ef..2fefaaf 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/testing/mock_accessibility_private.js +++ b/chrome/browser/resources/chromeos/accessibility/common/testing/mock_accessibility_private.js
@@ -19,6 +19,8 @@ * tagger_wasm_main_wasm: !ArrayBuffer, * en_us_action_config_binarypb: !ArrayBuffer, * en_us_pumpkin_config_binarypb: !ArrayBuffer, + * fr_fr_action_config_binarypb: !ArrayBuffer, + * fr_fr_pumpkin_config_binarypb: !ArrayBuffer, * }} */ let MockPumpkinData; @@ -433,6 +435,10 @@ await getFileBytes(`${pumpkinDir}/en_us/action_config.binarypb`); data.en_us_pumpkin_config_binarypb = await getFileBytes(`${pumpkinDir}/en_us/pumpkin_config.binarypb`); + data.fr_fr_action_config_binarypb = + await getFileBytes(`${pumpkinDir}/fr_fr/action_config.binarypb`); + data.fr_fr_pumpkin_config_binarypb = + await getFileBytes(`${pumpkinDir}/fr_fr/pumpkin_config.binarypb`); MockAccessibilityPrivate.pumpkinData_ = data; } }
diff --git a/chrome/browser/resources/new_tab_page/lens_upload_dialog.html b/chrome/browser/resources/new_tab_page/lens_upload_dialog.html index c7535b78..c311584 100644 --- a/chrome/browser/resources/new_tab_page/lens_upload_dialog.html +++ b/chrome/browser/resources/new_tab_page/lens_upload_dialog.html
@@ -246,12 +246,11 @@ } </style> -<ntp-lens-form id="lensForm" - on-loading="handleFormLoading_" - on-error="handleFormError_"> -</ntp-lens-form> - <div id="dialog" hidden$="{{isHidden_}}" tabindex="-1" lang="$i18n{language}"> + <ntp-lens-form id="lensForm" + on-loading="handleFormLoading_" + on-error="handleFormError_"> + </ntp-lens-form> <div id="container"> <cr-icon-button id="closeButton" class="icon-clear" title="$i18n{lensSearchUploadDialogCloseButtonLabel}"
diff --git a/chrome/browser/resources/settings/autofill_page/autofill_section.ts b/chrome/browser/resources/settings/autofill_page/autofill_section.ts index fd25263..6f73616 100644 --- a/chrome/browser/resources/settings/autofill_page/autofill_section.ts +++ b/chrome/browser/resources/settings/autofill_page/autofill_section.ts
@@ -21,7 +21,9 @@ import './passwords_shared.css.js'; import '../i18n_setup.js'; +import {getInstance as getAnnouncerInstance} from '//resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer.js'; import {I18nMixin} from '//resources/cr_elements/i18n_mixin.js'; +import {loadTimeData} from '//resources/js/load_time_data.m.js'; import {CrActionMenuElement} from 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js'; import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.js'; import {assert} from 'chrome://resources/js/assert_ts.js'; @@ -183,6 +185,8 @@ .querySelector('settings-address-remove-confirmation-dialog')! .wasConfirmed()) { this.autofillManager_.removeAddress(this.activeAddress!.guid as string); + getAnnouncerInstance().announce( + loadTimeData.getString('addressRemovedMessage')); } this.showAddressRemoveConfirmationDialog_ = false; assert(this.activeDialogAnchor_);
diff --git a/chrome/browser/resources/side_panel/app.ts b/chrome/browser/resources/side_panel/app.ts index a3fee25e..03c5a02 100644 --- a/chrome/browser/resources/side_panel/app.ts +++ b/chrome/browser/resources/side_panel/app.ts
@@ -62,7 +62,10 @@ override connectedCallback() { super.connectedCallback(); const lastActiveTab = window.localStorage[LOCAL_STORAGE_TAB_ID_KEY]; - if (loadTimeData.getBoolean('hasUnseenReadingListEntries')) { + if (loadTimeData.getBoolean('shouldShowBookmark')) { + window.localStorage[LOCAL_STORAGE_TAB_ID_KEY] = 'bookmarks'; + this.selectedTab_ = Object.keys(this.tabs_).indexOf('bookmarks'); + } else if (loadTimeData.getBoolean('hasUnseenReadingListEntries')) { window.localStorage[LOCAL_STORAGE_TAB_ID_KEY] = 'readingList'; } else if (lastActiveTab) { this.selectedTab_ = Object.keys(this.tabs_).indexOf(lastActiveTab) || 0;
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html index e8dd296..77df6ef 100644 --- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html +++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html
@@ -13,6 +13,11 @@ } } + cr-icon-button { + --cr-icon-button-size: 20px; + --cr-icon-button-margin-start: 14px; + } + .chip-discounted { --power-bookmark-chip-background: var(--price-tracking-chip-background); } @@ -36,30 +41,34 @@ } </style> -<template is="dom-repeat" - items="[[getShownBookmarks_(topLevelBookmarks_, activeFolder_)]]" - id="powerBookmarksContainer"> - <power-bookmark-row id="bookmark-[[item.id]]" bookmark="[[item]]" - description="[[getBookmarkDescription_(item, descriptions_.*)]]" - compact="[[compact_]]" - on-row-clicked="onRowClicked_"> - <div slot="extra-content-container"> - <template is="dom-if" - if="[[isPriceTracked_(item, showPriceTracking_)]]" restamp> - <template is="dom-if" if="[[showDiscountedPrice_(item)]]" restamp> - <power-bookmark-chip class="chip-discounted"> - <div class="icon icon-tracked icon-discounted"></div> - <div class="price-discounted">[[getCurrentPrice_(item)]]</div> - <div class="price-original">[[getPreviousPrice_(item)]]</div> - </power-bookmark-chip> +<div id="powerBookmarksContainer"> + <cr-icon-button iron-icon="cr:arrow-back" on-click="onBackClicked_" + hidden="[[!activeFolderPath_.length]]"></cr-icon-button> + <template is="dom-repeat" + items="[[getShownBookmarks_(topLevelBookmarks_, activeFolderPath_.*)]]" + id="powerBookmarksContainer"> + <power-bookmark-row id="bookmark-[[item.id]]" bookmark="[[item]]" + description="[[getBookmarkDescription_(item, descriptions_.*)]]" + compact="[[compact_]]" + on-row-clicked="onRowClicked_"> + <div slot="extra-content-container"> + <template is="dom-if" + if="[[isPriceTracked_(item, showPriceTracking_)]]" restamp> + <template is="dom-if" if="[[showDiscountedPrice_(item)]]" restamp> + <power-bookmark-chip class="chip-discounted"> + <div class="icon icon-tracked icon-discounted"></div> + <div class="price-discounted">[[getCurrentPrice_(item)]]</div> + <div class="price-original">[[getPreviousPrice_(item)]]</div> + </power-bookmark-chip> + </template> + <template is="dom-if" if="[[!showDiscountedPrice_(item)]]" restamp> + <power-bookmark-chip> + <div class="icon icon-tracked"></div> + <div>[[getCurrentPrice_(item)]]</div> + </power-bookmark-chip> + </template> </template> - <template is="dom-if" if="[[!showDiscountedPrice_(item)]]" restamp> - <power-bookmark-chip> - <div class="icon icon-tracked"></div> - <div>[[getCurrentPrice_(item)]]</div> - </power-bookmark-chip> - </template> - </template> - </div> - </power-bookmark-row> -</template> + </div> + </power-bookmark-row> + </template> +</div>
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts index d6872fce..af08cbb 100644 --- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts +++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
@@ -5,6 +5,8 @@ import './commerce/shopping_list.js'; import './power_bookmark_chip.js'; import './power_bookmark_row.js'; +import '//resources/cr_elements/cr_icon_button/cr_icon_button.js'; +import '//resources/cr_elements/icons.html.js'; import {PluralStringProxyImpl} from 'chrome://resources/js/plural_string_proxy.js'; import {listenOnce} from 'chrome://resources/js/util.js'; @@ -43,13 +45,9 @@ value: true, }, - activeFolder_: { - type: Object, - }, - - depth_: { - type: Number, - value: 0, + activeFolderPath_: { + type: Array, + value: () => [], }, showPriceTracking_: { @@ -67,8 +65,7 @@ private productInfos_ = new Map<string, BookmarkProductInfo>(); private shoppingListenerIds_: number[] = []; private compact_: boolean; - private activeFolder_: chrome.bookmarks.BookmarkTreeNode|undefined; - private depth_: number; + private activeFolderPath_: chrome.bookmarks.BookmarkTreeNode[]; private descriptions_ = new Map<string, string>(); private showPriceTracking_: boolean; @@ -150,8 +147,10 @@ * Returns a list of bookmarks and folders to display to the user. */ private getShownBookmarks_(): chrome.bookmarks.BookmarkTreeNode[] { - if (this.activeFolder_) { - return this.activeFolder_.children!; + const activeFolder = + this.activeFolderPath_[this.activeFolderPath_.length - 1]; + if (activeFolder) { + return activeFolder.children!; } return this.topLevelBookmarks_; } @@ -167,11 +166,10 @@ event.preventDefault(); event.stopPropagation(); if (event.detail.bookmark.children) { - this.activeFolder_ = event.detail.bookmark; - this.depth_++; + this.push('activeFolderPath_', event.detail.bookmark); } else { this.bookmarksApi_.openBookmark( - event.detail.bookmark.id, this.depth_, { + event.detail.bookmark.id, this.activeFolderPath_.length, { middleButton: false, altKey: event.detail.event.altKey, ctrlKey: event.detail.event.ctrlKey, @@ -183,6 +181,13 @@ } /** + * Moves the displayed folders up one level when the back button is clicked. + */ + private onBackClicked_() { + this.pop('activeFolderPath_'); + } + + /** * Whether the given price-tracked bookmark should display as if discounted. */ private showDiscountedPrice_(bookmark: chrome.bookmarks.BookmarkTreeNode):
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 6ab3226..be076b1 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -3136,6 +3136,7 @@ "//ash/webui/diagnostics_ui", "//ash/webui/eche_app_ui", "//ash/webui/file_manager:file_manager_ui", + "//ash/webui/files_internals", "//ash/webui/firmware_update_ui", "//ash/webui/guest_os_installer", "//ash/webui/help_app_ui",
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index 85b4018..2e1dd282 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -3835,6 +3835,9 @@ <message name="IDS_READER_MODE_MESSAGE_BUTTON" desc="The label for the button to open the current page in reader mode."> View </message> + <message name="IDS_READER_MODE_ACTION_CHIP_LABEL_SIMPLIFY_PAGE" desc="The label for the action chip shown on the toolbar to open the current page in reader mode. [CHAR_LIMIT=27]"> + Simplify page + </message> <message name="IDS_CONTENT_PROVIDER_SEARCH_DESCRIPTION" desc="Description for Chrome's entry in QSB's list of search suggestion providers [CHAR_LIMIT=32]"> Bookmarks and web history </message>
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_READER_MODE_ACTION_CHIP_LABEL_SIMPLIFY_PAGE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_READER_MODE_ACTION_CHIP_LABEL_SIMPLIFY_PAGE.png.sha1 new file mode 100644 index 0000000..152ede31 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_READER_MODE_ACTION_CHIP_LABEL_SIMPLIFY_PAGE.png.sha1
@@ -0,0 +1 @@ +cc906f2a37f0700e0fa5b7cfdc7c871f05a0a063 \ No newline at end of file
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictorTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictorTest.java index 44609e2..c43638c 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictorTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictorTest.java
@@ -35,7 +35,6 @@ @Config(manifest = Config.NONE) @RunWith(BaseRobolectricTestRunner.class) @DisableFeatures({ChromeFeatureList.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR, - ChromeFeatureList.SHARE_BUTTON_IN_TOP_TOOLBAR, ChromeFeatureList.VOICE_BUTTON_IN_TOP_TOOLBAR}) @EnableFeatures({ChromeFeatureList.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_V2}) public class AdaptiveToolbarStatePredictorTest {
diff --git a/chrome/browser/ui/ash/arc_open_url_delegate_impl.cc b/chrome/browser/ui/ash/arc_open_url_delegate_impl.cc index 8bcb2a0..7a41dd54 100644 --- a/chrome/browser/ui/ash/arc_open_url_delegate_impl.cc +++ b/chrome/browser/ui/ash/arc_open_url_delegate_impl.cc
@@ -24,7 +24,6 @@ #include "chrome/browser/ash/arc/arc_util.h" #include "chrome/browser/ash/arc/fileapi/arc_content_file_system_url_util.h" #include "chrome/browser/ash/arc/intent_helper/custom_tab_session_impl.h" -#include "chrome/browser/ash/crosapi/browser_util.h" #include "chrome/browser/ash/file_manager/fileapi_util.h" #include "chrome/browser/ash/file_manager/path_util.h" #include "chrome/browser/ash/fusebox/fusebox_server.h" @@ -292,22 +291,6 @@ return; GURL url_to_open = ConvertArcUrlToExternalFileUrlIfNeeded(url); - // If Lacros is primary browser, convert externalfile:// url into file:// url - // managed by the FuseBox moniker system because Lacros cannot handle - // externalfile:// urls. - // TODO(crbug.com/1374575): Check if other externalfile:// urls can use the - // same logic. If so, move this code into CrosapiNewWindowDelegate::OpenUrl() - // which is only for Lacros. - if (crosapi::browser_util::IsLacrosPrimaryBrowser()) { - Profile* profile = ash::ProfileHelper::Get()->GetProfileByUser( - user_manager::UserManager::Get()->GetPrimaryUser()); - // `profile` may be null if sign-in has happened but the profile isn't - // loaded yet. - if (!profile) - return; - url_to_open = ConvertToMonikerFileUrl(profile, url); - } - ash::NewWindowDelegate::GetPrimary()->OpenUrl( url_to_open, ash::NewWindowDelegate::OpenUrlFrom::kArc, ash::NewWindowDelegate::Disposition::kNewForegroundTab); @@ -324,7 +307,7 @@ if (!user) return; - // `profile` may be null if sign-in has happened but the profile isn't loaded + // |profile| may be null if sign-in has happened but the profile isn't loaded // yet. Profile* profile = ash::ProfileHelper::Get()->GetProfileByUser(user); if (!profile)
diff --git a/chrome/browser/ui/ash/crosapi_new_window_delegate.cc b/chrome/browser/ui/ash/crosapi_new_window_delegate.cc index bd14919..f7bf927 100644 --- a/chrome/browser/ui/ash/crosapi_new_window_delegate.cc +++ b/chrome/browser/ui/ash/crosapi_new_window_delegate.cc
@@ -111,8 +111,7 @@ CrosapiNewWindowDelegate::~CrosapiNewWindowDelegate() = default; void CrosapiNewWindowDelegate::NewTab() { - crosapi::BrowserManager::Get()->NewTab( - /*should_trigger_session_restore=*/false); + crosapi::BrowserManager::Get()->NewTab(); } void CrosapiNewWindowDelegate::NewWindow(bool incognito,
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc index 50f10fc2..ff7b89b70 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc
@@ -3382,4 +3382,60 @@ EXPECT_EQ(expected, GetSuggestionsInModel(model)); } +// Verifies the file suggestion update on a profile with restored suggestions. +TEST_P(HoldingSpaceSuggestionsDelegateTest, RestoreSuggestions) { + const base::FilePath drive_file = mount_point()->CreateArbitraryFile(); + std::unique_ptr<HoldingSpaceItem> drive_file_suggestion = + HoldingSpaceItem::CreateFileBackedItem( + HoldingSpaceItem::Type::kDriveSuggestion, drive_file, + GetFileSystemUrl(GetProfile(), drive_file), + base::BindOnce(&CreateTestHoldingSpaceImage)); + + // Create a secondary profile with a persisted drive file suggestion. + TestingProfile* const secondary_profile = CreateSecondaryProfile( + base::BindLambdaForTesting([&](TestingPrefStore* pref_store) { + base::Value::List persisted_items; + persisted_items.Append(drive_file_suggestion->Serialize()); + pref_store->SetValueSilently( + HoldingSpacePersistenceDelegate::kPersistencePath, + base::Value(std::move(persisted_items)), + PersistentPrefStore::DEFAULT_PREF_WRITE_FLAGS); + })); + + // Activate `secondary_profile`. Wait until the model updates. + ActivateSecondaryProfile(); + HoldingSpaceModelAttachedWaiter(secondary_profile).Wait(); + HoldingSpaceModel* const secondary_holding_space_model = + HoldingSpaceController::Get()->model(); + ItemsInitializedWaiter(secondary_holding_space_model).Wait(); + const bool suggestion_feature_enabled = + features::IsHoldingSpaceSuggestionsEnabled(); + EXPECT_EQ(secondary_holding_space_model->items().size(), + suggestion_feature_enabled ? 1u : 0u); + + // Update local file suggestions on the secondary profile. Fast-forward to + // ensure the suggestion fetch completes. + const base::FilePath local_file = mount_point()->CreateArbitraryFile(); + static_cast<app_list::MockFileSuggestKeyedService*>( + app_list::FileSuggestKeyedServiceFactory::GetInstance()->GetService( + secondary_profile)) + ->SetSuggestionsForType( + app_list::FileSuggestionType::kLocalFile, + /*suggestions=*/std::vector<app_list::FileSuggestData>{ + {app_list::FileSuggestionType::kLocalFile, local_file, + /*new_prediction_reason=*/absl::nullopt, + /*new_score=*/absl::nullopt}}); + task_environment()->FastForwardBy(base::Seconds(1)); + + const auto& model_items = secondary_holding_space_model->items(); + if (suggestion_feature_enabled) { + // The drive and local file suggestions should coexist in the model. + ASSERT_EQ(model_items.size(), 2u); + EXPECT_EQ(model_items[0]->file_path(), local_file); + EXPECT_EQ(model_items[1]->file_path(), drive_file); + } else { + EXPECT_TRUE(model_items.empty()); + } +} + } // namespace ash
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.cc b/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.cc index cc1c3eb..a6a152e6 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.h" #include "ash/constants/ash_features.h" +#include "base/containers/adapters.h" #include "chrome/browser/ash/file_manager/path_util.h" #include "chrome/browser/ui/app_list/search/files/file_suggest_keyed_service_factory.h" @@ -26,19 +27,14 @@ // suggested file in `suggestions_by_type`. bool ItemIsPinnedSuggestion( const HoldingSpaceItem* item, - const std::map<app_list::FileSuggestionType, - std::vector<app_list::FileSuggestData>>& + std::map<HoldingSpaceItem::Type, std::vector<base::FilePath>>& suggestions_by_type) { if (item->type() != HoldingSpaceItem::Type::kPinnedFile) return false; - for (const auto& [_, raw_suggestions] : suggestions_by_type) { - if (base::Contains(raw_suggestions, item->file_path(), - [](const app_list::FileSuggestData& suggestion) { - return suggestion.file_path; - })) { + for (const auto& [_, suggested_file_paths] : suggestions_by_type) { + if (base::Contains(suggested_file_paths, item->file_path())) return true; - } } return false; @@ -89,6 +85,16 @@ } void HoldingSpaceSuggestionsDelegate::OnPersistenceRestored() { + // Initialize `suggestions_by_type_` with the restored suggestions. The model + // items are iterated reversely so that the suggestions of the same category + // in `suggestions_by_type_` follow the relevance order. + DCHECK(suggestions_by_type_.empty()); + for (const auto& item : base::Reversed(model()->items())) { + // Skip if `item` is not a suggestion. + if (HoldingSpaceItem::IsSuggestion(item->type())) + suggestions_by_type_[item->type()].push_back(item->file_path()); + } + file_suggest_service_observation_.Observe( app_list::FileSuggestKeyedServiceFactory::GetInstance()->GetService( profile())); @@ -142,7 +148,14 @@ return; // Update `suggestions_by_type_`. - suggestions_by_type_[type] = *suggestions; + std::vector<base::FilePath> updated_suggestions(suggestions->size()); + std::transform(suggestions->cbegin(), suggestions->cend(), + updated_suggestions.begin(), + [](const app_list::FileSuggestData& raw_suggestion_data) { + return raw_suggestion_data.file_path; + }); + suggestions_by_type_[GetItemTypeFromSuggestionType(type)] = + std::move(updated_suggestions); UpdateSuggestionsInModel(); } @@ -152,13 +165,12 @@ suggestion_items; base::FilePath downloads_folder = file_manager::util::GetDownloadsFolderForProfile(profile()); - for (const auto& [type, raw_suggestions] : suggestions_by_type_) { - HoldingSpaceItem::Type item_type = GetItemTypeFromSuggestionType(type); - for (const auto& suggestion : raw_suggestions) { - if (suggestion.file_path != downloads_folder && + for (const auto& [type, suggested_file_paths] : suggestions_by_type_) { + for (const auto& file_path : suggested_file_paths) { + if (file_path != downloads_folder && !model()->ContainsItem(HoldingSpaceItem::Type::kPinnedFile, - suggestion.file_path)) { - suggestion_items.emplace_back(item_type, suggestion.file_path); + file_path)) { + suggestion_items.emplace_back(type, file_path); } } }
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.h b/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.h index 8b914e1..2bbc22c 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.h +++ b/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.h
@@ -5,8 +5,9 @@ #ifndef CHROME_BROWSER_UI_ASH_HOLDING_SPACE_HOLDING_SPACE_SUGGESTIONS_DELEGATE_H_ #define CHROME_BROWSER_UI_ASH_HOLDING_SPACE_HOLDING_SPACE_SUGGESTIONS_DELEGATE_H_ -#include <set> +#include <map> +#include "ash/public/cpp/holding_space/holding_space_item.h" #include "base/timer/timer.h" #include "chrome/browser/ui/app_list/search/files/file_suggest_keyed_service.h" #include "chrome/browser/ui/app_list/search/files/file_suggest_util.h" @@ -69,8 +70,12 @@ // Records the suggestion types on which data fetches are pending. std::set<app_list::FileSuggestionType> pending_fetches_; - // Caches the most recently fetched suggestion data. - std::map<app_list::FileSuggestionType, std::vector<app_list::FileSuggestData>> + // Caches the suggested files in the holding space model. In each key-value + // pair: the key is a holding space suggestion item type; the value is an + // array of paths to the suggested files. NOTE: each file path array follows + // the relevance order, which means that a file path with a smaller index in + // the array has a higher relevance score. + std::map<HoldingSpaceItem::Type, std::vector<base::FilePath>> suggestions_by_type_; // Used to schedule the task of updating suggestions in model.
diff --git a/chrome/browser/ui/ash/network/network_portal_signin_controller_unittest.cc b/chrome/browser/ui/ash/network/network_portal_signin_controller_unittest.cc index e7596a00..6a7983b 100644 --- a/chrome/browser/ui/ash/network/network_portal_signin_controller_unittest.cc +++ b/chrome/browser/ui/ash/network/network_portal_signin_controller_unittest.cc
@@ -75,7 +75,9 @@ class NetworkPortalSigninControllerTest : public testing::Test { public: - NetworkPortalSigninControllerTest() = default; + NetworkPortalSigninControllerTest() { + feature_list_.InitAndDisableFeature({features::kCaptivePortalUI2022}); + } NetworkPortalSigninControllerTest(const NetworkPortalSigninControllerTest&) = delete; NetworkPortalSigninControllerTest& operator=( @@ -164,6 +166,7 @@ FakeChromeUserManager* user_manager_; std::unique_ptr<TestingProfileManager> test_profile_manager_; std::unique_ptr<TestSigninController> controller_; + base::test::ScopedFeatureList feature_list_; }; TEST_F(NetworkPortalSigninControllerTest, LoginScreen) { @@ -214,11 +217,9 @@ : public NetworkPortalSigninControllerTest { public: NetworkPortalSigninControllerTest2022Update() { + feature_list_.Reset(); feature_list_.InitAndEnableFeature(features::kCaptivePortalUI2022); } - - protected: - base::test::ScopedFeatureList feature_list_; }; TEST_F(NetworkPortalSigninControllerTest2022Update, LoginScreen) {
diff --git a/chrome/browser/ui/commerce/price_tracking/shopping_list_ui_tab_helper.cc b/chrome/browser/ui/commerce/price_tracking/shopping_list_ui_tab_helper.cc index 3e31fa6..1d3f147 100644 --- a/chrome/browser/ui/commerce/price_tracking/shopping_list_ui_tab_helper.cc +++ b/chrome/browser/ui/commerce/price_tracking/shopping_list_ui_tab_helper.cc
@@ -82,6 +82,7 @@ void ShoppingListUiTabHelper::RegisterProfilePrefs( PrefRegistrySimple* registry) { registry->RegisterBooleanPref(prefs::kShouldShowPriceTrackFUEBubble, true); + registry->RegisterBooleanPref(prefs::kShouldShowSidePanelBookmarkTab, false); } void ShoppingListUiTabHelper::NavigationEntryCommitted(
diff --git a/chrome/browser/ui/extensions/extension_action_view_controller.cc b/chrome/browser/ui/extensions/extension_action_view_controller.cc index 7618f97..2727138 100644 --- a/chrome/browser/ui/extensions/extension_action_view_controller.cc +++ b/chrome/browser/ui/extensions/extension_action_view_controller.cc
@@ -50,6 +50,7 @@ using extensions::ActionInfo; using extensions::CommandService; using extensions::ExtensionActionRunner; +using extensions::PermissionsManager; namespace { @@ -58,6 +59,71 @@ base::UmaHistogramEnumeration("Extensions.Toolbar.InvocationSource", source); } +// Computes hover card site access status based on: +// 1. Extension wants site access: user site settings takes precedence +// over the extension's site access. +// 2. Extension does not want access: if all extensions are blocked display +// such message because a) user could wrongly infer that an extension that +// does not want access has access if we only show the blocked message for +// extensions that want access; and b) it helps us work around tricky +// calculations where we get into collisions between withheld and denied +// permission. Otherwise, it should display "does not want access". +ExtensionActionViewController::HoverCardState::SiteAccess +GetHoverCardSiteAccessState( + extensions::PermissionsManager::UserSiteSetting site_setting, + extensions::SitePermissionsHelper::SiteInteraction site_interaction) { + switch (site_interaction) { + case extensions::SitePermissionsHelper::SiteInteraction::kGranted: + return site_setting == extensions::PermissionsManager::UserSiteSetting:: + kGrantAllExtensions + ? ExtensionActionViewController::HoverCardState::SiteAccess:: + kAllExtensionsAllowed + : ExtensionActionViewController::HoverCardState::SiteAccess:: + kExtensionHasAccess; + + case extensions::SitePermissionsHelper::SiteInteraction::kWithheld: + case extensions::SitePermissionsHelper::SiteInteraction::kActiveTab: + return site_setting == extensions::PermissionsManager::UserSiteSetting:: + kBlockAllExtensions + ? ExtensionActionViewController::HoverCardState::SiteAccess:: + kAllExtensionsBlocked + : ExtensionActionViewController::HoverCardState::SiteAccess:: + kExtensionRequestsAccess; + + case extensions::SitePermissionsHelper::SiteInteraction::kNone: + // kNone site interaction includes extensions that don't want access when + // user site setting is "block all extensions". + return site_setting == extensions::PermissionsManager::UserSiteSetting:: + kBlockAllExtensions + ? ExtensionActionViewController::HoverCardState::SiteAccess:: + kAllExtensionsBlocked + : ExtensionActionViewController::HoverCardState::SiteAccess:: + kExtensionDoesNotWantAccess; + } +} + +// Computes hover card policy status based on admin policy. Note that an +// extension pinned by admin is also installed by admin. Thus, "pinned by admin" +// has preference. +ExtensionActionViewController::HoverCardState::AdminPolicy +GetHoverCardPolicyState(Browser* browser, + const extensions::ExtensionId& extension_id) { + auto* const model = ToolbarActionsModel::Get(browser->profile()); + if (model->IsActionForcePinned(extension_id)) + return ExtensionActionViewController::HoverCardState::AdminPolicy:: + kPinnedByAdmin; + + scoped_refptr<const extensions::Extension> extension = + extensions::ExtensionRegistry::Get(browser->profile()) + ->enabled_extensions() + .GetByID(extension_id); + if (extensions::Manifest::IsPolicyLocation(extension->location())) + return ExtensionActionViewController::HoverCardState::AdminPolicy:: + kInstalledByAdmin; + + return ExtensionActionViewController::HoverCardState::AdminPolicy::kNone; +} + } // namespace // static @@ -393,57 +459,14 @@ extensions::PermissionsManager::UserSiteSetting site_setting = extensions::PermissionsManager::Get(browser_->profile()) ->GetUserSiteSetting(origin); - - // Compute hover card status based on: - // 1. Extension wants site access: user site settings takes precedence - // over the extension's site access. - // 2. Extension does not want access: if all extensions are blocked display - // such message because a) user could wrongly infer that an extension that - // does not want access has access if we only show the blocked message for - // extensions that want access; and b) it helps us work around tricky - // calculations where we get into collisions between withheld and denied - // permission. Otherwise, it should display "does not want access". auto site_interaction = GetSiteInteraction(web_contents); - switch (site_interaction) { - case extensions::SitePermissionsHelper::SiteInteraction::kGranted: - return site_setting == extensions::PermissionsManager::UserSiteSetting:: - kGrantAllExtensions - ? HoverCardState::kAllExtensionsAllowed - : HoverCardState::kExtensionHasAccess; - case extensions::SitePermissionsHelper::SiteInteraction::kWithheld: - case extensions::SitePermissionsHelper::SiteInteraction::kActiveTab: - return site_setting == extensions::PermissionsManager::UserSiteSetting:: - kBlockAllExtensions - ? HoverCardState::kAllExtensionsBlocked - : HoverCardState::kExtensionRequestsAccess; + HoverCardState state; + state.site_access = + GetHoverCardSiteAccessState(site_setting, site_interaction); + state.policy = GetHoverCardPolicyState(browser_, GetId()); - case extensions::SitePermissionsHelper::SiteInteraction::kNone: - // kNone site interaction includes extensions that don't want access when - // user site setting is "block all extensions". - return site_setting == extensions::PermissionsManager::UserSiteSetting:: - kBlockAllExtensions - ? HoverCardState::kAllExtensionsBlocked - : HoverCardState::kExtensionDoesNotWantAccess; - } -} - -ToolbarActionViewController::HoverCardPolicyState -ExtensionActionViewController::GetHoverCardPolicyState() const { - // An extension pinned by admin is also installed by admin. Thus, - // "pinned by admin" has preference. - auto* const model = ToolbarActionsModel::Get(browser_->profile()); - if (model->IsActionForcePinned(GetId())) - return HoverCardPolicyState::kPinnedByAdmin; - - scoped_refptr<const extensions::Extension> extension = - extensions::ExtensionRegistry::Get(browser_->profile()) - ->enabled_extensions() - .GetByID(GetId()); - if (extensions::Manifest::IsPolicyLocation(extension->location())) - return HoverCardPolicyState::kInstalledByAdmin; - - return HoverCardPolicyState::kNone; + return state; } bool ExtensionActionViewController::CanHandleAccelerators() const {
diff --git a/chrome/browser/ui/extensions/extension_action_view_controller.h b/chrome/browser/ui/extensions/extension_action_view_controller.h index 10ba8365..8bb5494 100644 --- a/chrome/browser/ui/extensions/extension_action_view_controller.h +++ b/chrome/browser/ui/extensions/extension_action_view_controller.h
@@ -72,8 +72,6 @@ std::u16string GetTooltip(content::WebContents* web_contents) const override; ToolbarActionViewController::HoverCardState GetHoverCardState( content::WebContents* web_contents) const override; - ToolbarActionViewController::HoverCardPolicyState GetHoverCardPolicyState() - const override; extensions::SitePermissionsHelper::SiteInteraction GetSiteInteraction( content::WebContents* web_contents) const override; bool IsEnabled(content::WebContents* web_contents) const override;
diff --git a/chrome/browser/ui/extensions/extension_action_view_controller_unittest.cc b/chrome/browser/ui/extensions/extension_action_view_controller_unittest.cc index f21e9ed4..9b51684 100644 --- a/chrome/browser/ui/extensions/extension_action_view_controller_unittest.cc +++ b/chrome/browser/ui/extensions/extension_action_view_controller_unittest.cc
@@ -833,6 +833,12 @@ ExtensionActionViewControllerFeatureUnitTest& operator=( const ExtensionActionViewControllerFeatureUnitTest&) = delete; + HoverCardState::SiteAccess GetHoverCardSiteAccessState( + ExtensionActionViewController* controller, + content::WebContents* web_contents) { + return controller->GetHoverCardState(web_contents).site_access; + } + private: base::test::ScopedFeatureList scoped_feature_list_; }; @@ -869,55 +875,55 @@ extensions::PermissionsManager::Get(browser()->profile()); ASSERT_EQ(permissions_manager->GetUserSiteSetting(url), UserSiteSetting::kCustomizeByExtension); - EXPECT_EQ(controllerA->GetHoverCardState(web_contents), - HoverCardState::kExtensionDoesNotWantAccess); - EXPECT_EQ(controllerB->GetHoverCardState(web_contents), - HoverCardState::kExtensionHasAccess); - EXPECT_EQ(controllerC->GetHoverCardState(web_contents), - HoverCardState::kExtensionHasAccess); + EXPECT_EQ(GetHoverCardSiteAccessState(controllerA, web_contents), + HoverCardState::SiteAccess::kExtensionDoesNotWantAccess); + EXPECT_EQ(GetHoverCardSiteAccessState(controllerB, web_contents), + HoverCardState::SiteAccess::kExtensionHasAccess); + EXPECT_EQ(GetHoverCardSiteAccessState(controllerC, web_contents), + HoverCardState::SiteAccess::kExtensionHasAccess); // Withhold extension C host permissions. Verify only extension C changed // hover card state to "requests access". extensions::ScriptingPermissionsModifier(profile(), extensionC) .SetWithholdHostPermissions(true); - EXPECT_EQ(controllerA->GetHoverCardState(web_contents), - HoverCardState::kExtensionDoesNotWantAccess); - EXPECT_EQ(controllerB->GetHoverCardState(web_contents), - HoverCardState::kExtensionHasAccess); - EXPECT_EQ(controllerC->GetHoverCardState(web_contents), - HoverCardState::kExtensionRequestsAccess); + EXPECT_EQ(GetHoverCardSiteAccessState(controllerA, web_contents), + HoverCardState::SiteAccess::kExtensionDoesNotWantAccess); + EXPECT_EQ(GetHoverCardSiteAccessState(controllerB, web_contents), + HoverCardState::SiteAccess::kExtensionHasAccess); + EXPECT_EQ(GetHoverCardSiteAccessState(controllerC, web_contents), + HoverCardState::SiteAccess::kExtensionRequestsAccess); // Grant all extensions site access. Verify extension A hover card state is // "does not want access" and extensions B and C is "all extensions allowed". permissions_manager->UpdateUserSiteSetting( url, UserSiteSetting::kGrantAllExtensions); - EXPECT_EQ(controllerA->GetHoverCardState(web_contents), - HoverCardState::kExtensionDoesNotWantAccess); - EXPECT_EQ(controllerB->GetHoverCardState(web_contents), - HoverCardState::kAllExtensionsAllowed); - EXPECT_EQ(controllerC->GetHoverCardState(web_contents), - HoverCardState::kAllExtensionsAllowed); + EXPECT_EQ(GetHoverCardSiteAccessState(controllerA, web_contents), + HoverCardState::SiteAccess::kExtensionDoesNotWantAccess); + EXPECT_EQ(GetHoverCardSiteAccessState(controllerB, web_contents), + HoverCardState::SiteAccess::kAllExtensionsAllowed); + EXPECT_EQ(GetHoverCardSiteAccessState(controllerC, web_contents), + HoverCardState::SiteAccess::kAllExtensionsAllowed); // Block all extensions site access. Verify all extensions appear as "all // extensions blocked" (even though extension A never requested access). permissions_manager->UpdateUserSiteSetting( url, UserSiteSetting::kBlockAllExtensions); - EXPECT_EQ(controllerA->GetHoverCardState(web_contents), - HoverCardState::kAllExtensionsBlocked); - EXPECT_EQ(controllerB->GetHoverCardState(web_contents), - HoverCardState::kAllExtensionsBlocked); - EXPECT_EQ(controllerC->GetHoverCardState(web_contents), - HoverCardState::kAllExtensionsBlocked); + EXPECT_EQ(GetHoverCardSiteAccessState(controllerA, web_contents), + HoverCardState::SiteAccess::kAllExtensionsBlocked); + EXPECT_EQ(GetHoverCardSiteAccessState(controllerB, web_contents), + HoverCardState::SiteAccess::kAllExtensionsBlocked); + EXPECT_EQ(GetHoverCardSiteAccessState(controllerC, web_contents), + HoverCardState::SiteAccess::kAllExtensionsBlocked); // Change back to customize site access by extension. Verify extension A // hover card state is "does not want access", extension B is "has access" and // extension C is "requests access". permissions_manager->UpdateUserSiteSetting( url, UserSiteSetting::kCustomizeByExtension); - EXPECT_EQ(controllerA->GetHoverCardState(web_contents), - HoverCardState::kExtensionDoesNotWantAccess); - EXPECT_EQ(controllerB->GetHoverCardState(web_contents), - HoverCardState::kExtensionHasAccess); - EXPECT_EQ(controllerC->GetHoverCardState(web_contents), - HoverCardState::kExtensionRequestsAccess); + EXPECT_EQ(GetHoverCardSiteAccessState(controllerA, web_contents), + HoverCardState::SiteAccess::kExtensionDoesNotWantAccess); + EXPECT_EQ(GetHoverCardSiteAccessState(controllerB, web_contents), + HoverCardState::SiteAccess::kExtensionHasAccess); + EXPECT_EQ(GetHoverCardSiteAccessState(controllerC, web_contents), + HoverCardState::SiteAccess::kExtensionRequestsAccess); }
diff --git a/chrome/browser/ui/toolbar/test_toolbar_action_view_controller.cc b/chrome/browser/ui/toolbar/test_toolbar_action_view_controller.cc index 856bd6f..b54261d 100644 --- a/chrome/browser/ui/toolbar/test_toolbar_action_view_controller.cc +++ b/chrome/browser/ui/toolbar/test_toolbar_action_view_controller.cc
@@ -52,13 +52,12 @@ ToolbarActionViewController::HoverCardState TestToolbarActionViewController::GetHoverCardState( content::WebContents* web_contents) const { - return ToolbarActionViewController::HoverCardState:: + ToolbarActionViewController::HoverCardState state; + state.site_access = ToolbarActionViewController::HoverCardState::SiteAccess:: kExtensionDoesNotWantAccess; -} - -ToolbarActionViewController::HoverCardPolicyState -TestToolbarActionViewController::GetHoverCardPolicyState() const { - return ToolbarActionViewController::HoverCardPolicyState::kNone; + state.policy = + ToolbarActionViewController::HoverCardState::AdminPolicy::kNone; + return state; } bool TestToolbarActionViewController::IsEnabled(
diff --git a/chrome/browser/ui/toolbar/test_toolbar_action_view_controller.h b/chrome/browser/ui/toolbar/test_toolbar_action_view_controller.h index d297bca..75e0d3c 100644 --- a/chrome/browser/ui/toolbar/test_toolbar_action_view_controller.h +++ b/chrome/browser/ui/toolbar/test_toolbar_action_view_controller.h
@@ -33,8 +33,6 @@ std::u16string GetTooltip(content::WebContents* web_contents) const override; ToolbarActionViewController::HoverCardState GetHoverCardState( content::WebContents* web_contents) const override; - ToolbarActionViewController::HoverCardPolicyState GetHoverCardPolicyState() - const override; bool IsEnabled(content::WebContents* web_contents) const override; bool IsShowingPopup() const override; bool IsRequestingSiteAccess(
diff --git a/chrome/browser/ui/toolbar/toolbar_action_view_controller.h b/chrome/browser/ui/toolbar/toolbar_action_view_controller.h index 607082a..2e75f0d3 100644 --- a/chrome/browser/ui/toolbar/toolbar_action_view_controller.h +++ b/chrome/browser/ui/toolbar/toolbar_action_view_controller.h
@@ -62,35 +62,36 @@ kMaxValue = kRequestAccessButton, }; - // Site access state for the toolbar action view's hover card. - // TODO(emiliapaz): Change the enum name to reflect "site acesss" state, or - // bundle both enums in one struct. - enum class HoverCardState { - // All extensions are allowed on the current site by the user. - kAllExtensionsAllowed, + // State for the toolbar action view's hover card. + struct HoverCardState { + enum class SiteAccess { + // All extensions are allowed on the current site by the user. + kAllExtensionsAllowed, - // All extensions are blocked on the current site by the user. - kAllExtensionsBlocked, + // All extensions are blocked on the current site by the user. + kAllExtensionsBlocked, - // The extension has access to the current site. - kExtensionHasAccess, + // The extension has access to the current site. + kExtensionHasAccess, - // The extension requests access to the current site. - kExtensionRequestsAccess, + // The extension requests access to the current site. + kExtensionRequestsAccess, - // The extension does not want access to the current site. - kExtensionDoesNotWantAccess, - }; + // The extension does not want access to the current site. + kExtensionDoesNotWantAccess, + }; - // Policy state for the toolbar action view's hover card. - enum class HoverCardPolicyState { - kNone, + enum class AdminPolicy { + kNone, + // Extension is force pinned by administrator. + kPinnedByAdmin, - // Extension is force pinned by administrator. - kPinnedByAdmin, + // Extension if force installed by administrator. + kInstalledByAdmin, + }; - // Extension if force installed by administrator. - kInstalledByAdmin + SiteAccess site_access; + AdminPolicy policy; }; virtual ~ToolbarActionViewController() = default; @@ -124,8 +125,6 @@ virtual HoverCardState GetHoverCardState( content::WebContents* web_contents) const = 0; - virtual HoverCardPolicyState GetHoverCardPolicyState() const = 0; - // Returns true if the action should be enabled on the given |web_contents|. virtual bool IsEnabled(content::WebContents* web_contents) const = 0;
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc index 07237364..4452467 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
@@ -247,8 +247,7 @@ dialog_model_builder.AddSeparator().AddCustomField( std::make_unique<views::BubbleDialogModelHost::CustomView>( std::make_unique<PriceTrackingView>( - profile, url, ui::ImageModel::FromImage(product_image), - is_price_tracked), + profile, url, *product_image.ToImageSkia(), is_price_tracked), views::BubbleDialogModelHost::FieldType::kControl), kPriceTrackingBookmarkViewElementId); }
diff --git a/chrome/browser/ui/views/commerce/price_tracking_icon_view.cc b/chrome/browser/ui/views/commerce/price_tracking_icon_view.cc index 575dde4f..23d512e 100644 --- a/chrome/browser/ui/views/commerce/price_tracking_icon_view.cc +++ b/chrome/browser/ui/views/commerce/price_tracking_icon_view.cc
@@ -5,8 +5,10 @@ #include "chrome/browser/ui/views/commerce/price_tracking_icon_view.h" #include "base/metrics/user_metrics.h" +#include "base/timer/timer.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h" #include "chrome/browser/commerce/shopping_service_factory.h" +#include "chrome/browser/feature_engagement/tracker_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/bookmarks/bookmark_utils.h" #include "chrome/browser/ui/browser.h" @@ -15,10 +17,14 @@ #include "chrome/browser/ui/views/commerce/price_tracking_bubble_dialog_view.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/page_action/page_action_icon_view.h" +#include "chrome/browser/ui/views/side_panel/side_panel_coordinator.h" +#include "chrome/browser/ui/views/side_panel/side_panel_entry.h" +#include "chrome/browser/ui/views/side_panel/side_panel_registry.h" #include "chrome/common/pref_names.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/commerce/core/price_tracking_utils.h" #include "components/feature_engagement/public/feature_constants.h" +#include "components/feature_engagement/public/tracker.h" #include "components/omnibox/browser/vector_icons.h" #include "components/power_bookmarks/core/power_bookmark_utils.h" #include "components/power_bookmarks/core/proto/power_bookmark_meta.pb.h" @@ -43,6 +49,7 @@ profile_(browser->profile()), bubble_coordinator_(this), icon_(&omnibox::kPriceTrackingDisabledIcon) { + SetUpForInOutAnimation(); SetProperty(views::kElementIdentifierKey, kPriceTrackingChipElementId); } @@ -93,10 +100,6 @@ return *icon_; } -bool PriceTrackingIconView::ShouldShowLabel() const { - return false; -} - bool PriceTrackingIconView::ShouldShow() { if (delegate()->ShouldHidePageActionIcons()) { return false; @@ -118,11 +121,37 @@ if (!GetVisible()) { base::RecordAction( base::UserMetricsAction("Commerce.PriceTracking.OmniboxChipShown")); + MaybeShowPageActionLabel(); } + } else { + HidePageActionLabel(); } SetVisible(should_show); } +void PriceTrackingIconView::AnimationProgressed( + const gfx::Animation* animation) { + PageActionIconView::AnimationProgressed(animation); + // When the label is fully revealed pause the animation for + // kLabelPersistDuration before resuming the animation and allowing the label + // to animate out. This is currently set to show for 12s including the in/out + // animation. + // TODO(crbug.com/1314206): This approach of inspecting the animation progress + // to extend the animation duration is quite hacky. This should be removed and + // the IconLabelBubbleView API expanded to support a finer level of control. + constexpr double kAnimationValueWhenLabelFullyShown = 0.5; + constexpr base::TimeDelta kLabelPersistDuration = base::Seconds(10.8); + if (should_extend_label_shown_duration_ && + GetAnimationValue() >= kAnimationValueWhenLabelFullyShown) { + should_extend_label_shown_duration_ = false; + PauseAnimation(); + animate_out_timer_.Start( + FROM_HERE, kLabelPersistDuration, + base::BindRepeating(&PriceTrackingIconView::UnpauseAnimation, + base::Unretained(this))); + } +} + void PriceTrackingIconView::ForceVisibleForTesting(bool is_tracking_price) { SetVisible(true); SetVisualState(is_tracking_price); @@ -153,8 +182,21 @@ base::RecordAction( base::UserMetricsAction("Commerce.PriceTracking.OmniboxChip.Tracked")); commerce::MaybeEnableEmailNotifications(profile_->GetPrefs()); - browser_->window()->MaybeShowFeaturePromo( + bool should_show_iph = browser_->window()->MaybeShowFeaturePromo( feature_engagement::kIPHPriceTrackingInSidePanelFeature); + if (should_show_iph) { + SidePanelCoordinator* coordinator = + BrowserView::GetBrowserViewForBrowser(browser_) + ->side_panel_coordinator(); + if (coordinator) { + SidePanelRegistry* registry = coordinator->GetGlobalSidePanelRegistry(); + registry->SetActiveEntry(registry->GetEntryForKey( + SidePanelEntry::Key(SidePanelEntry::Id::kBookmarks))); + } else { + profile_->GetPrefs()->SetBoolean(prefs::kShouldShowSidePanelBookmarkTab, + true); + } + } } const bookmarks::BookmarkNode* node = @@ -204,3 +246,27 @@ prefs::kShouldShowPriceTrackFUEBubble) && !IsPriceTracking(); } + +void PriceTrackingIconView::MaybeShowPageActionLabel() { + auto* tracker = + feature_engagement::TrackerFactory::GetForBrowserContext(profile_); + if (!tracker || + !tracker->ShouldTriggerHelpUI( + feature_engagement::kIPHPriceTrackingPageActionIconLabelFeature)) { + return; + } + + should_extend_label_shown_duration_ = true; + AnimateIn(absl::nullopt); + + // Note that `Dismiss()` in this case does not dismiss the UI. It's telling + // the FE backend that the promo is done so that other promos can run. Showing + // the label should not block other promos from displaying. + tracker->Dismissed( + feature_engagement::kIPHPriceTrackingPageActionIconLabelFeature); +} + +void PriceTrackingIconView::HidePageActionLabel() { + UnpauseAnimation(); + ResetSlideAnimation(false); +}
diff --git a/chrome/browser/ui/views/commerce/price_tracking_icon_view.h b/chrome/browser/ui/views/commerce/price_tracking_icon_view.h index b0f4266..b1164d7 100644 --- a/chrome/browser/ui/views/commerce/price_tracking_icon_view.h +++ b/chrome/browser/ui/views/commerce/price_tracking_icon_view.h
@@ -6,6 +6,7 @@ #define CHROME_BROWSER_UI_VIEWS_COMMERCE_PRICE_TRACKING_ICON_VIEW_H_ #include "base/memory/raw_ptr.h" +#include "base/timer/timer.h" #include "chrome/browser/ui/views/commerce/price_tracking_bubble_dialog_view.h" #include "chrome/browser/ui/views/page_action/page_action_icon_view.h" #include "ui/gfx/vector_icon_types.h" @@ -29,9 +30,6 @@ void OnExecuting(PageActionIconView::ExecuteSource execute_source) override; const gfx::VectorIcon& GetVectorIcon() const override; - // IconLabelBubbleView: - bool ShouldShowLabel() const override; - void ForceVisibleForTesting(bool is_tracking_price); const std::u16string& GetIconLabelForTesting(); @@ -40,12 +38,16 @@ void UpdateImpl() override; private: + // IconLabelBubbleView: + void AnimationProgressed(const gfx::Animation* animation) override; void EnablePriceTracking(bool enable); void SetVisualState(bool enable); void OnPriceTrackingServerStateUpdated(bool success); bool ShouldShow(); bool IsPriceTracking() const; bool ShouldShowFirstUseExperienceBubble() const; + void MaybeShowPageActionLabel(); + void HidePageActionLabel(); const raw_ptr<Browser> browser_; const raw_ptr<Profile> profile_; @@ -54,6 +56,14 @@ raw_ptr<const gfx::VectorIcon> icon_; std::u16string tooltip_text_and_accessibleName_; + // Animates out the price tracking icon label after a fixed period of time. + // This keeps the label visible for long enough to give users an opportunity + // to read the label text. + base::RetainingOneShotTimer animate_out_timer_; + // Boolean that tracks whether we should extend the duration for which the + // label is shown when it animates in. + bool should_extend_label_shown_duration_ = false; + base::WeakPtrFactory<PriceTrackingIconView> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/ui/views/commerce/price_tracking_icon_view_interactive_uitest.cc b/chrome/browser/ui/views/commerce/price_tracking_icon_view_interactive_uitest.cc index 92d536d4..13cdec6 100644 --- a/chrome/browser/ui/views/commerce/price_tracking_icon_view_interactive_uitest.cc +++ b/chrome/browser/ui/views/commerce/price_tracking_icon_view_interactive_uitest.cc
@@ -10,14 +10,19 @@ #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h" #include "chrome/browser/ui/browser_element_identifiers.h" #include "chrome/browser/ui/commerce/price_tracking/mock_shopping_list_ui_tab_helper.h" +#include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/views/commerce/price_tracking_bubble_dialog_view.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/location_bar/star_view.h" +#include "chrome/browser/ui/views/side_panel/side_panel_coordinator.h" +#include "chrome/browser/ui/views/side_panel/side_panel_entry.h" +#include "chrome/browser/ui/views/side_panel/side_panel_registry.h" #include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/browser_with_test_window_test.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/interactive_test_utils.h" +#include "chrome/test/base/ui_test_utils.h" #include "components/bookmarks/browser/bookmark_utils.h" #include "components/bookmarks/test/bookmark_test_helpers.h" #include "components/commerce/core/commerce_feature_list.h" @@ -40,7 +45,8 @@ #include "ui/views/widget/any_widget_observer.h" namespace { -const char kTestURL[] = "about:blank"; +const char kNonTrackableUrl[] = "http://google.com"; +const char kTrackableUrl[] = "about:blank"; } // namespace class PriceTrackingIconViewInteractiveTest : public InProcessBrowserTest { @@ -49,7 +55,7 @@ test_features_.InitWithFeatures( {commerce::kShoppingList, feature_engagement::kIPHPriceTrackingInSidePanelFeature}, - {}); + {features::kUnifiedSidePanel}); } PriceTrackingIconViewInteractiveTest( @@ -64,7 +70,7 @@ BookmarkModelFactory::GetForBrowserContext(browser()->profile()); bookmarks::test::WaitForBookmarkModelToLoad(bookmark_model); - bookmarks::AddIfNotBookmarked(bookmark_model, GURL(kTestURL), + bookmarks::AddIfNotBookmarked(bookmark_model, GURL(kTrackableUrl), std::u16string()); MockShoppingListUiTabHelper::CreateForWebContents( @@ -72,7 +78,6 @@ mock_tab_helper_ = static_cast<MockShoppingListUiTabHelper*>( MockShoppingListUiTabHelper::FromWebContents( browser()->tab_strip_model()->GetActiveWebContents())); - EXPECT_CALL(*mock_tab_helper_, GetProductImage); const gfx::Image image = mock_tab_helper_->GetValidProductImage(); ON_CALL(*mock_tab_helper_, GetProductImage) .WillByDefault( @@ -106,8 +111,8 @@ bookmarks::BookmarkModel* bookmark_model = BookmarkModelFactory::GetForBrowserContext(browser()->profile()); - commerce::AddProductBookmark(bookmark_model, u"title", GURL(kTestURL), 0, - is_price_tracked); + commerce::AddProductBookmark(bookmark_model, u"title", GURL(kTrackableUrl), + 0, is_price_tracked); } protected: @@ -138,7 +143,7 @@ prefs::kShouldShowPriceTrackFUEBubble)); bookmarks::BookmarkModel* bookmark_model = BookmarkModelFactory::GetForBrowserContext(browser()->profile()); - commerce::AddProductBookmark(bookmark_model, u"title", GURL(kTestURL), 0, + commerce::AddProductBookmark(bookmark_model, u"title", GURL(kTrackableUrl), 0, true); auto* icon_view = GetChip(); @@ -270,6 +275,69 @@ 0); } +class PriceTrackingIconViewEngagementTest + : public PriceTrackingIconViewInteractiveTest { + public: + PriceTrackingIconViewEngagementTest() { + test_features_.InitWithFeatures( + {commerce::kShoppingList, + feature_engagement::kIPHPriceTrackingPageActionIconLabelFeature}, + {}); + } + + private: + base::test::ScopedFeatureList test_features_; +}; + +IN_PROC_BROWSER_TEST_F(PriceTrackingIconViewEngagementTest, ShowExpandedIcon) { + BrowserFeaturePromoController* const promo_controller = + BrowserView::GetBrowserViewForBrowser(browser()) + ->GetFeaturePromoController(); + EXPECT_TRUE( + user_education::test::WaitForFeatureEngagementReady(promo_controller)); + + SimulateServerPriceTrackStateUpdated(/*is_price_tracked=*/false); + ON_CALL(*mock_tab_helper_, ShouldShowPriceTrackingIconView) + .WillByDefault(testing::Return(true)); + + auto* icon_view = GetChip(); + EXPECT_FALSE(icon_view->GetVisible()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL(kTrackableUrl))); + EXPECT_TRUE(icon_view->GetVisible()); + EXPECT_TRUE(icon_view->ShouldShowLabel()); +} + +IN_PROC_BROWSER_TEST_F(PriceTrackingIconViewEngagementTest, + ExpandedIconShownOnceOnly) { + BrowserFeaturePromoController* const promo_controller = + BrowserView::GetBrowserViewForBrowser(browser()) + ->GetFeaturePromoController(); + EXPECT_TRUE( + user_education::test::WaitForFeatureEngagementReady(promo_controller)); + + SimulateServerPriceTrackStateUpdated(/*is_price_tracked=*/false); + ON_CALL(*mock_tab_helper_, ShouldShowPriceTrackingIconView) + .WillByDefault(testing::Return(true)); + + auto* icon_view = GetChip(); + EXPECT_FALSE(icon_view->GetVisible()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL(kTrackableUrl))); + EXPECT_TRUE(icon_view->GetVisible()); + EXPECT_TRUE(icon_view->ShouldShowLabel()); + + ON_CALL(*mock_tab_helper_, ShouldShowPriceTrackingIconView) + .WillByDefault(testing::Return(false)); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL(kNonTrackableUrl))); + EXPECT_FALSE(icon_view->GetVisible()); + EXPECT_FALSE(icon_view->ShouldShowLabel()); + + ON_CALL(*mock_tab_helper_, ShouldShowPriceTrackingIconView) + .WillByDefault(testing::Return(true)); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL(kTrackableUrl))); + EXPECT_TRUE(icon_view->GetVisible()); + EXPECT_FALSE(icon_view->ShouldShowLabel()); +} + class PriceTrackingBubbleInteractiveTest : public PriceTrackingIconViewInteractiveTest { public: @@ -297,12 +365,6 @@ IN_PROC_BROWSER_TEST_F(PriceTrackingBubbleInteractiveTest, TrackPriceOnFUEBubble) { - BrowserFeaturePromoController* const promo_controller = - BrowserView::GetBrowserViewForBrowser(browser()) - ->GetFeaturePromoController(); - EXPECT_TRUE( - user_education::test::WaitForFeatureEngagementReady(promo_controller)); - // Show PriceTackingIconView. auto* icon_view = GetChip(); icon_view->ForceVisibleForTesting(/*is_tracking_price=*/false); @@ -335,10 +397,80 @@ EXPECT_EQ(icon_view->GetTextForTooltipAndAccessibleName(), l10n_util::GetStringUTF16(IDS_OMNIBOX_TRACKING_PRICE)); EXPECT_TRUE(GetBookmarkStar()->GetActive()); +} - // Verify IPH is showing after accepting the FUE bubble. +IN_PROC_BROWSER_TEST_F(PriceTrackingBubbleInteractiveTest, + TriggerSidePanelIPH) { + PrefService* prefs = browser()->profile()->GetPrefs(); + prefs->SetBoolean(prefs::kShouldShowPriceTrackFUEBubble, false); + EXPECT_FALSE(prefs->GetBoolean(prefs::kShouldShowSidePanelBookmarkTab)); + auto* promo_controller = BrowserView::GetBrowserViewForBrowser(browser()) + ->GetFeaturePromoController(); + EXPECT_TRUE( + user_education::test::WaitForFeatureEngagementReady(promo_controller)); + + // Show PriceTackingIconView. + auto* icon_view = GetChip(); + icon_view->ForceVisibleForTesting(/*is_tracking_price=*/false); + + // Click PriceTackingIconView and show the PriceTrackingBubble. + ClickPriceTrackingIconView(); + auto* bubble = + static_cast<PriceTrackingBubbleDialogView*>(icon_view->GetBubble()); + EXPECT_TRUE(bubble); + EXPECT_EQ(bubble->GetTypeForTesting(), + PriceTrackingBubbleDialogView::Type::TYPE_NORMAL); + + // Click the Accept(Track price) bubble. + bubble->Accept(); + SimulateServerPriceTrackStateUpdated(/*is_price_tracked=*/true); + + // Verify IPH is showing and pref is properly set up to force show bookmark + // tab in side panel. EXPECT_TRUE(promo_controller->IsPromoActive( feature_engagement::kIPHPriceTrackingInSidePanelFeature)); + EXPECT_TRUE(prefs->GetBoolean(prefs::kShouldShowSidePanelBookmarkTab)); +} + +IN_PROC_BROWSER_TEST_F(PriceTrackingBubbleInteractiveTest, + NotTriggerSidePanelIPH) { + PrefService* prefs = browser()->profile()->GetPrefs(); + prefs->SetBoolean(prefs::kShouldShowPriceTrackFUEBubble, false); + EXPECT_FALSE(prefs->GetBoolean(prefs::kShouldShowSidePanelBookmarkTab)); + auto* promo_controller = BrowserView::GetBrowserViewForBrowser(browser()) + ->GetFeaturePromoController(); + EXPECT_TRUE( + user_education::test::WaitForFeatureEngagementReady(promo_controller)); + + // Trigger IPH now so it won't be triggred later. + EXPECT_TRUE( + promo_controller->feature_engagement_tracker()->ShouldTriggerHelpUI( + feature_engagement::kIPHPriceTrackingInSidePanelFeature)); + EXPECT_FALSE( + promo_controller->feature_engagement_tracker()->WouldTriggerHelpUI( + feature_engagement::kIPHPriceTrackingInSidePanelFeature)); + + // Show PriceTackingIconView. + auto* icon_view = GetChip(); + icon_view->ForceVisibleForTesting(/*is_tracking_price=*/false); + + // Click PriceTackingIconView and show the PriceTrackingBubble. + ClickPriceTrackingIconView(); + auto* bubble = + static_cast<PriceTrackingBubbleDialogView*>(icon_view->GetBubble()); + EXPECT_TRUE(bubble); + EXPECT_EQ(bubble->GetTypeForTesting(), + PriceTrackingBubbleDialogView::Type::TYPE_NORMAL); + + // Click the Accept(Track price) bubble. + bubble->Accept(); + SimulateServerPriceTrackStateUpdated(/*is_price_tracked=*/true); + + // Verify IPH is not showing and pref is not set up to force show bookmark tab + // in side panel. + EXPECT_FALSE(promo_controller->IsPromoActive( + feature_engagement::kIPHPriceTrackingInSidePanelFeature)); + EXPECT_FALSE(prefs->GetBoolean(prefs::kShouldShowSidePanelBookmarkTab)); } IN_PROC_BROWSER_TEST_F(PriceTrackingBubbleInteractiveTest, @@ -495,3 +627,104 @@ "Commerce.PriceTracking.EditedBookmarkFolderFromOmniboxBubble"), 1); } + +class PriceTrackingIconViewUnifiedSidePanelInteractiveTest + : public PriceTrackingBubbleInteractiveTest { + public: + PriceTrackingIconViewUnifiedSidePanelInteractiveTest() { + test_features_.InitWithFeatures( + {commerce::kShoppingList, + feature_engagement::kIPHPriceTrackingInSidePanelFeature, + features::kUnifiedSidePanel}, + {}); + } + + private: + base::test::ScopedFeatureList test_features_; +}; + +IN_PROC_BROWSER_TEST_F(PriceTrackingIconViewUnifiedSidePanelInteractiveTest, + TriggerSidePanelIPH) { + SidePanelCoordinator* coordinator = + BrowserView::GetBrowserViewForBrowser(browser()) + ->side_panel_coordinator(); + DCHECK(coordinator); + PrefService* prefs = browser()->profile()->GetPrefs(); + prefs->SetBoolean(prefs::kShouldShowPriceTrackFUEBubble, false); + auto* promo_controller = BrowserView::GetBrowserViewForBrowser(browser()) + ->GetFeaturePromoController(); + EXPECT_TRUE( + user_education::test::WaitForFeatureEngagementReady(promo_controller)); + + // Show PriceTackingIconView. + auto* icon_view = GetChip(); + icon_view->ForceVisibleForTesting(/*is_tracking_price=*/false); + + // Click PriceTackingIconView and show the PriceTrackingBubble. + ClickPriceTrackingIconView(); + auto* bubble = + static_cast<PriceTrackingBubbleDialogView*>(icon_view->GetBubble()); + EXPECT_TRUE(bubble); + EXPECT_EQ(bubble->GetTypeForTesting(), + PriceTrackingBubbleDialogView::Type::TYPE_NORMAL); + + // Click the Accept(Track price) bubble. + bubble->Accept(); + SimulateServerPriceTrackStateUpdated(/*is_price_tracked=*/true); + + // Verify IPH is showing and side panel registry is properly set up to force + // show bookmark tab in side panel. + EXPECT_TRUE(promo_controller->IsPromoActive( + feature_engagement::kIPHPriceTrackingInSidePanelFeature)); + SidePanelRegistry* registry = coordinator->GetGlobalSidePanelRegistry(); + EXPECT_TRUE(registry->active_entry().has_value()); + EXPECT_EQ(registry->active_entry().value()->key().id(), + SidePanelEntry::Id::kBookmarks); + EXPECT_FALSE(prefs->GetBoolean(prefs::kShouldShowSidePanelBookmarkTab)); +} + +IN_PROC_BROWSER_TEST_F(PriceTrackingIconViewUnifiedSidePanelInteractiveTest, + NotTriggerSidePanelIPH) { + SidePanelCoordinator* coordinator = + BrowserView::GetBrowserViewForBrowser(browser()) + ->side_panel_coordinator(); + DCHECK(coordinator); + PrefService* prefs = browser()->profile()->GetPrefs(); + prefs->SetBoolean(prefs::kShouldShowPriceTrackFUEBubble, false); + auto* promo_controller = BrowserView::GetBrowserViewForBrowser(browser()) + ->GetFeaturePromoController(); + EXPECT_TRUE( + user_education::test::WaitForFeatureEngagementReady(promo_controller)); + + // Trigger IPH now so it won't be triggred later. + EXPECT_TRUE( + promo_controller->feature_engagement_tracker()->ShouldTriggerHelpUI( + feature_engagement::kIPHPriceTrackingInSidePanelFeature)); + EXPECT_FALSE( + promo_controller->feature_engagement_tracker()->WouldTriggerHelpUI( + feature_engagement::kIPHPriceTrackingInSidePanelFeature)); + + // Show PriceTackingIconView. + auto* icon_view = GetChip(); + icon_view->ForceVisibleForTesting(/*is_tracking_price=*/false); + + // Click PriceTackingIconView and show the PriceTrackingBubble. + ClickPriceTrackingIconView(); + auto* bubble = + static_cast<PriceTrackingBubbleDialogView*>(icon_view->GetBubble()); + EXPECT_TRUE(bubble); + EXPECT_EQ(bubble->GetTypeForTesting(), + PriceTrackingBubbleDialogView::Type::TYPE_NORMAL); + + // Click the Accept(Track price) bubble. + bubble->Accept(); + SimulateServerPriceTrackStateUpdated(/*is_price_tracked=*/true); + + // Verify IPH is not showing and side panel registry is not set up to force + // show bookmark tab in side panel. + EXPECT_FALSE(promo_controller->IsPromoActive( + feature_engagement::kIPHPriceTrackingInSidePanelFeature)); + SidePanelRegistry* registry = coordinator->GetGlobalSidePanelRegistry(); + EXPECT_FALSE(registry->active_entry().has_value()); + EXPECT_FALSE(prefs->GetBoolean(prefs::kShouldShowSidePanelBookmarkTab)); +}
diff --git a/chrome/browser/ui/views/commerce/price_tracking_view.cc b/chrome/browser/ui/views/commerce/price_tracking_view.cc index c88dae40..666510f2a 100644 --- a/chrome/browser/ui/views/commerce/price_tracking_view.cc +++ b/chrome/browser/ui/views/commerce/price_tracking_view.cc
@@ -17,6 +17,7 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/gfx/color_palette.h" #include "ui/gfx/geometry/insets_outsets_base.h" +#include "ui/gfx/image/image_skia_operations.h" #include "ui/views/background.h" #include "ui/views/border.h" #include "ui/views/controls/button/toggle_button.h" @@ -30,11 +31,12 @@ constexpr int kProductImageSize = 56; constexpr int kLableSpacing = 4; constexpr int kHorizontalSpacing = 16; +constexpr int kImageBorderRadius = 4; } // namespace PriceTrackingView::PriceTrackingView(Profile* profile, GURL page_url, - ui::ImageModel product_image, + gfx::ImageSkia product_image, bool is_price_track_enabled) : profile_(profile), is_price_track_enabled_(is_price_track_enabled) { // image column @@ -51,8 +53,11 @@ .SetPreferredSize(gfx::Size(kProductImageSize, kProductImageSize)) // TODO(meiliang@): Verify color and corner radius with UX. .SetBorder(views::CreateRoundedRectBorder( - 1, 4, SkColorSetA(gfx::kGoogleGrey900, 0x24))) - .SetImage(product_image) + 1, kImageBorderRadius, SkColorSetA(gfx::kGoogleGrey900, 0x24))) + .SetImage( + gfx::ImageSkiaOperations::CreateCroppedCenteredRoundRectImage( + gfx::Size(kProductImageSize, kProductImageSize), + kImageBorderRadius, product_image)) .Build()); // Text column
diff --git a/chrome/browser/ui/views/commerce/price_tracking_view.h b/chrome/browser/ui/views/commerce/price_tracking_view.h index 3d6a95b3..61fe2f81 100644 --- a/chrome/browser/ui/views/commerce/price_tracking_view.h +++ b/chrome/browser/ui/views/commerce/price_tracking_view.h
@@ -6,6 +6,7 @@ #define CHROME_BROWSER_UI_VIEWS_COMMERCE_PRICE_TRACKING_VIEW_H_ #include "base/memory/raw_ptr.h" +#include "ui/gfx/image/image_skia.h" #include "ui/views/controls/button/toggle_button.h" #include "ui/views/controls/label.h" #include "ui/views/layout/flex_layout_view.h" @@ -16,7 +17,7 @@ public: PriceTrackingView(Profile* profile, GURL page_url, - ui::ImageModel product_image, + gfx::ImageSkia product_image, bool is_price_track_enabled); ~PriceTrackingView() override;
diff --git a/chrome/browser/ui/views/commerce/price_tracking_view_unittest.cc b/chrome/browser/ui/views/commerce/price_tracking_view_unittest.cc index 7532d5d..abdcc16 100644 --- a/chrome/browser/ui/views/commerce/price_tracking_view_unittest.cc +++ b/chrome/browser/ui/views/commerce/price_tracking_view_unittest.cc
@@ -83,8 +83,8 @@ const auto valid_product_image = gfx::Image(gfx::ImageSkia::CreateFrom1xBitmap(bitmap)); auto price_tracking_View = std::make_unique<PriceTrackingView>( - profile(), GURL(kTestURL), - ui::ImageModel::FromImage(valid_product_image), is_price_track_enabled); + profile(), GURL(kTestURL), *valid_product_image.ToImageSkia(), + is_price_track_enabled); price_tracking_View_ = anchor_widget_->SetContentsView(std::move(price_tracking_View)); anchor_widget_->Show();
diff --git a/chrome/browser/ui/views/frame/glass_browser_frame_view_browsertest_win.cc b/chrome/browser/ui/views/frame/glass_browser_frame_view_browsertest_win.cc index e7805b2..e356a45 100644 --- a/chrome/browser/ui/views/frame/glass_browser_frame_view_browsertest_win.cc +++ b/chrome/browser/ui/views/frame/glass_browser_frame_view_browsertest_win.cc
@@ -11,7 +11,6 @@ #include "base/memory/raw_ptr.h" #include "base/strings/stringprintf.h" #include "base/test/bind.h" -#include "base/test/scoped_feature_list.h" #include "chrome/app/chrome_command_ids.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_commands.h" @@ -30,7 +29,6 @@ #include "chrome/common/webui_url_constants.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" -#include "content/public/common/content_features.h" #include "content/public/test/browser_test.h" #include "content/public/test/test_navigation_observer.h" #include "third_party/blink/public/mojom/manifest/display_mode.mojom.h" @@ -265,10 +263,7 @@ class WebAppGlassBrowserFrameViewWindowControlsOverlayTest : public InProcessBrowserTest { public: - WebAppGlassBrowserFrameViewWindowControlsOverlayTest() { - scoped_feature_list_.InitAndEnableFeature( - features::kWebAppWindowControlsOverlay); - } + WebAppGlassBrowserFrameViewWindowControlsOverlayTest() = default; WebAppGlassBrowserFrameViewWindowControlsOverlayTest( const WebAppGlassBrowserFrameViewWindowControlsOverlayTest&) = delete; WebAppGlassBrowserFrameViewWindowControlsOverlayTest& operator=( @@ -344,7 +339,6 @@ WebAppFrameToolbarTestHelper web_app_frame_toolbar_helper_; private: - base::test::ScopedFeatureList scoped_feature_list_; base::ScopedTempDir temp_dir_; };
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_browsertest.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view_browsertest.cc index fcb6bd3..9b288a3 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_browsertest.cc +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_browsertest.cc
@@ -28,7 +28,6 @@ #include "chrome/browser/web_applications/web_app_install_info.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" -#include "content/public/common/content_features.h" #include "content/public/test/browser_test.h" #include "ui/base/hit_test.h" #include "ui/compositor/scoped_animation_duration_scale_mode.h" @@ -331,10 +330,7 @@ class WebAppOpaqueBrowserFrameViewWindowControlsOverlayTest : public InProcessBrowserTest { public: - WebAppOpaqueBrowserFrameViewWindowControlsOverlayTest() { - scoped_feature_list_.InitAndEnableFeature( - features::kWebAppWindowControlsOverlay); - } + WebAppOpaqueBrowserFrameViewWindowControlsOverlayTest() = default; WebAppOpaqueBrowserFrameViewWindowControlsOverlayTest( const WebAppOpaqueBrowserFrameViewWindowControlsOverlayTest&) = delete; WebAppOpaqueBrowserFrameViewWindowControlsOverlayTest& operator=( @@ -408,7 +404,6 @@ WebAppFrameToolbarTestHelper web_app_frame_toolbar_helper_; private: - base::test::ScopedFeatureList scoped_feature_list_; base::ScopedTempDir temp_dir_; };
diff --git a/chrome/browser/ui/views/sharing_hub/preview_view.cc b/chrome/browser/ui/views/sharing_hub/preview_view.cc index 5f25f6f..89e775a 100644 --- a/chrome/browser/ui/views/sharing_hub/preview_view.cc +++ b/chrome/browser/ui/views/sharing_hub/preview_view.cc
@@ -23,7 +23,8 @@ gfx::Insets default_margin; gfx::Size image_size; - static LayoutVariant FromFeatureConfig(); + static LayoutVariant FromFeatureVariant( + share::DesktopSharePreviewVariant variant); }; // These values are all directly from the Figma redlines. See @@ -37,8 +38,9 @@ constexpr LayoutVariant kVariant72{gfx::Insets::VH(8, 8), gfx::Insets::VH(0, 16), gfx::Size(72, 72)}; -LayoutVariant LayoutVariant::FromFeatureConfig() { - switch (share::GetDesktopSharePreviewVariant()) { +LayoutVariant LayoutVariant::FromFeatureVariant( + share::DesktopSharePreviewVariant variant) { + switch (variant) { case share::DesktopSharePreviewVariant::kEnabled16: return kVariant16; case share::DesktopSharePreviewVariant::kEnabled40: @@ -91,20 +93,22 @@ // View [FlexLayout, vertical] // Label (title) // Label (URL) -PreviewView::PreviewView(share::ShareAttempt attempt) { - auto variant = LayoutVariant::FromFeatureConfig(); +PreviewView::PreviewView(share::ShareAttempt attempt, + share::DesktopSharePreviewVariant feature_variant) + : feature_variant_(feature_variant) { + auto layout_variant = LayoutVariant::FromFeatureVariant(feature_variant); auto* layout = SetLayoutManager(std::make_unique<views::FlexLayout>()); layout->SetOrientation(views::LayoutOrientation::kHorizontal) .SetMainAxisAlignment(views::LayoutAlignment::kStart) .SetCrossAxisAlignment(views::LayoutAlignment::kCenter) - .SetInteriorMargin(variant.interior_margin) - .SetDefault(views::kMarginsKey, variant.default_margin) + .SetInteriorMargin(layout_variant.interior_margin) + .SetDefault(views::kMarginsKey, layout_variant.default_margin) .SetCollapseMargins(true); image_ = AddChildView(std::make_unique<views::ImageView>(attempt.preview_image)); - image_->SetPreferredSize(variant.image_size); + image_->SetPreferredSize(layout_variant.image_size); auto* labels_container = AddChildView(std::make_unique<views::View>()); labels_container->SetProperty( @@ -142,7 +146,8 @@ void PreviewView::OnImageChanged(ui::ImageModel model) { image_->SetImage(model); - image_->SetImageSize(LayoutVariant::FromFeatureConfig().image_size); + image_->SetImageSize( + LayoutVariant::FromFeatureVariant(feature_variant_).image_size); } } // namespace sharing_hub
diff --git a/chrome/browser/ui/views/sharing_hub/preview_view.h b/chrome/browser/ui/views/sharing_hub/preview_view.h index ca3bbcd..bad46390 100644 --- a/chrome/browser/ui/views/sharing_hub/preview_view.h +++ b/chrome/browser/ui/views/sharing_hub/preview_view.h
@@ -7,6 +7,7 @@ #include "base/memory/raw_ptr.h" #include "chrome/browser/share/share_attempt.h" +#include "chrome/browser/share/share_features.h" #include "ui/base/models/image_model.h" #include "ui/views/view.h" #include "url/gurl.h" @@ -30,7 +31,8 @@ // trial. class PreviewView : public views::View { public: - explicit PreviewView(share::ShareAttempt attempt); + PreviewView(share::ShareAttempt attempt, + share::DesktopSharePreviewVariant variant); ~PreviewView() override; // This seemingly-odd method allows for PreviewView to be uncoupled from the @@ -47,6 +49,8 @@ private: base::CallbackListSubscription subscription_; + const share::DesktopSharePreviewVariant feature_variant_; + raw_ptr<views::Label> title_ = nullptr; raw_ptr<views::Label> url_ = nullptr; raw_ptr<views::ImageView> image_ = nullptr;
diff --git a/chrome/browser/ui/views/sharing_hub/preview_view_unittest.cc b/chrome/browser/ui/views/sharing_hub/preview_view_unittest.cc new file mode 100644 index 0000000..6ccfb382 --- /dev/null +++ b/chrome/browser/ui/views/sharing_hub/preview_view_unittest.cc
@@ -0,0 +1,86 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/views/sharing_hub/preview_view.h" + +#include "chrome/browser/share/share_attempt.h" +#include "chrome/browser/share/share_features.h" +#include "chrome/test/views/chrome_views_test_base.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/skia/include/core/SkBitmap.h" +#include "ui/gfx/image/image_skia.h" +#include "ui/views/controls/image_view.h" +#include "ui/views/controls/label.h" +#include "ui/views/test/widget_test.h" + +namespace { + +using PreviewViewTest = ChromeViewsTestBase; + +views::Label* FindLabelWithText(views::View* root, std::u16string text) { + return static_cast<views::Label*>(views::test::AnyViewMatchingPredicate( + root, [=](const views::View* candidate) -> bool { + return !strcmp(candidate->GetClassName(), "Label") && + static_cast<const views::Label*>(candidate)->GetText() == text; + })); +} + +views::ImageView* FindImage(views::View* root) { + return static_cast<views::ImageView*>(views::test::AnyViewMatchingPredicate( + root, [](const views::View* candidate) -> bool { + return !strcmp(candidate->GetClassName(), "ImageView"); + })); +} + +ui::ImageModel BuildTestImage(SkColor color) { + SkBitmap new_bitmap; + new_bitmap.allocN32Pixels(32, 32); + new_bitmap.eraseColor(color); + return ui::ImageModel::FromImageSkia( + gfx::ImageSkia::CreateFromBitmap(new_bitmap, 1.0)); +} + +SkColor ImageTopLeftColor(ui::ImageModel model) { + gfx::ImageSkia skia = model.Rasterize(nullptr); + return skia.bitmap()->getColor(0, 0); +} + +std::unique_ptr<sharing_hub::PreviewView> BuildTestPreview( + share::DesktopSharePreviewVariant) { + auto view = std::make_unique<sharing_hub::PreviewView>( + share::ShareAttempt(nullptr, u"Title", GURL("https://www.chromium.org/"), + BuildTestImage(SK_ColorRED)), + share::DesktopSharePreviewVariant::kEnabled16); + return view; +} + +TEST_F(PreviewViewTest, IncludesTitle) { + auto view = BuildTestPreview(share::DesktopSharePreviewVariant::kEnabled16); + ASSERT_TRUE(FindLabelWithText(view.get(), u"Title")); +} + +TEST_F(PreviewViewTest, IncludesURL) { + auto view = BuildTestPreview(share::DesktopSharePreviewVariant::kEnabled16); + ASSERT_TRUE(FindLabelWithText(view.get(), u"https://www.chromium.org/")); +} + +TEST_F(PreviewViewTest, IncludesImage) { + auto view = BuildTestPreview(share::DesktopSharePreviewVariant::kEnabled16); + ASSERT_TRUE(FindImage(view.get())); +} + +TEST_F(PreviewViewTest, OnImageChangedReplacesImage) { + auto view = BuildTestPreview(share::DesktopSharePreviewVariant::kEnabled16); + + auto* old_image = FindImage(view.get()); + ASSERT_TRUE(old_image); + EXPECT_EQ(ImageTopLeftColor(old_image->GetImageModel()), SK_ColorRED); + + view->OnImageChanged(BuildTestImage(SK_ColorGREEN)); + auto* new_image = FindImage(view.get()); + ASSERT_TRUE(new_image); + EXPECT_EQ(ImageTopLeftColor(new_image->GetImageModel()), SK_ColorGREEN); +} + +} // namespace
diff --git a/chrome/browser/ui/views/sharing_hub/sharing_hub_bubble_view_impl.cc b/chrome/browser/ui/views/sharing_hub/sharing_hub_bubble_view_impl.cc index dedba93..f0d7f4cd5 100644 --- a/chrome/browser/ui/views/sharing_hub/sharing_hub_bubble_view_impl.cc +++ b/chrome/browser/ui/views/sharing_hub/sharing_hub_bubble_view_impl.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/ui/views/sharing_hub/sharing_hub_bubble_view_impl.h" +#include "chrome/browser/share/share_features.h" #include "chrome/browser/share/share_metrics.h" #include "chrome/browser/sharing_hub/sharing_hub_model.h" #include "chrome/browser/ui/sharing_hub/sharing_hub_bubble_controller.h" @@ -133,7 +134,8 @@ views::BoxLayout::Orientation::kVertical, gfx::Insets(), kInterItemPadding)); if (controller_->ShouldUsePreview()) { - auto* preview = AddChildView(std::make_unique<PreviewView>(attempt_)); + auto* preview = AddChildView(std::make_unique<PreviewView>( + attempt_, share::GetDesktopSharePreviewVariant())); preview->TakeCallbackSubscription( controller_->RegisterPreviewImageChangedCallback(base::BindRepeating( &PreviewView::OnImageChanged, base::Unretained(preview))));
diff --git a/chrome/browser/ui/views/side_panel/side_panel_registry.cc b/chrome/browser/ui/views/side_panel/side_panel_registry.cc index b950baa..39c0eb3 100644 --- a/chrome/browser/ui/views/side_panel/side_panel_registry.cc +++ b/chrome/browser/ui/views/side_panel/side_panel_registry.cc
@@ -84,6 +84,10 @@ return true; } +void SidePanelRegistry::SetActiveEntry(SidePanelEntry* entry) { + active_entry_ = entry; +} + void SidePanelRegistry::OnEntryShown(SidePanelEntry* entry) { active_entry_ = entry; }
diff --git a/chrome/browser/ui/views/side_panel/side_panel_registry.h b/chrome/browser/ui/views/side_panel/side_panel_registry.h index ba2a290..406ec5d 100644 --- a/chrome/browser/ui/views/side_panel/side_panel_registry.h +++ b/chrome/browser/ui/views/side_panel/side_panel_registry.h
@@ -49,6 +49,8 @@ // Deregisters the entry for the given SidePanelEntry::Key. Returns true if // successful and false if there is no entry registered for the |key|. bool Deregister(const SidePanelEntry::Key& key); + // Set the active entry in the side panel to be |entry|. + void SetActiveEntry(SidePanelEntry* entry); absl::optional<SidePanelEntry*> active_entry() { return active_entry_; } std::vector<std::unique_ptr<SidePanelEntry>>& entries() { return entries_; }
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc index 410214173..95f33c1 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.cc +++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -164,8 +164,11 @@ gfx::Size CalculatePreferredSize() const override { int max_child_x = 0; - for (views::View* child : children()) + for (views::View* child : children()) { + if (!views::IsViewClass<TabSlotView>(child)) + continue; max_child_x = std::max(max_child_x, child->bounds().right()); + } return gfx::Size(max_child_x, GetLayoutConstant(TAB_HEIGHT)); }
diff --git a/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_bubble_view.cc b/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_bubble_view.cc index 9977d686..bf01dad9 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_bubble_view.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_bubble_view.cc
@@ -33,6 +33,8 @@ namespace { +using HoverCardState = ToolbarActionViewController::HoverCardState; + // Hover card fixed width. Toolbar actions are not visible when window is too // small to display them, therefore hover cards wouldn't be displayed if the // window is not big enough. @@ -55,72 +57,68 @@ } std::u16string GetFootnoteTitle( - ToolbarActionViewController::HoverCardState state) { + ToolbarActionViewController::HoverCardState::SiteAccess state) { int title_id = -1; switch (state) { - case ToolbarActionViewController::HoverCardState::kAllExtensionsAllowed: - case ToolbarActionViewController::HoverCardState::kExtensionHasAccess: + case HoverCardState::SiteAccess::kAllExtensionsAllowed: + case HoverCardState::SiteAccess::kExtensionHasAccess: title_id = IDS_EXTENSIONS_TOOLBAR_ACTION_HOVER_CARD_FOOTER_TITLE_HAS_ACCESS; break; - case ToolbarActionViewController::HoverCardState::kAllExtensionsBlocked: + case HoverCardState::SiteAccess::kAllExtensionsBlocked: title_id = IDS_EXTENSIONS_TOOLBAR_ACTION_HOVER_CARD_FOOTER_TITLE_BLOCKED_ACCESS; break; - case ToolbarActionViewController::HoverCardState::kExtensionRequestsAccess: + case HoverCardState::SiteAccess::kExtensionRequestsAccess: title_id = IDS_EXTENSIONS_TOOLBAR_ACTION_HOVER_CARD_FOOTER_TITLE_REQUESTS_ACCESS; break; - case ToolbarActionViewController::HoverCardState:: - kExtensionDoesNotWantAccess: + case HoverCardState::SiteAccess::kExtensionDoesNotWantAccess: NOTREACHED(); break; } return l10n_util::GetStringUTF16(title_id); } -std::u16string GetFootnoteDescription( - ToolbarActionViewController::HoverCardState state, - std::u16string host) { +std::u16string GetFootnoteDescription(HoverCardState::SiteAccess state, + std::u16string host) { int title_id = -1; switch (state) { - case ToolbarActionViewController::HoverCardState::kAllExtensionsAllowed: + case HoverCardState::SiteAccess::kAllExtensionsAllowed: title_id = IDS_EXTENSIONS_TOOLBAR_ACTION_HOVER_CARD_FOOTER_DESCRIPTION_ALL_EXTENSIONS_ALLOWED_ACCESS; break; - case ToolbarActionViewController::HoverCardState::kAllExtensionsBlocked: + case HoverCardState::SiteAccess::kAllExtensionsBlocked: title_id = IDS_EXTENSIONS_TOOLBAR_ACTION_HOVER_CARD_FOOTER_DESCRIPTION_ALL_EXTENSIONS_BLOCKED_ACCESS; break; - case ToolbarActionViewController::HoverCardState::kExtensionHasAccess: + case HoverCardState::SiteAccess::kExtensionHasAccess: title_id = IDS_EXTENSIONS_TOOLBAR_ACTION_HOVER_CARD_FOOTER_DESCRIPTION_EXTENSION_HAS_ACESSS; break; - case ToolbarActionViewController::HoverCardState::kExtensionRequestsAccess: + case HoverCardState::SiteAccess::kExtensionRequestsAccess: title_id = IDS_EXTENSIONS_TOOLBAR_ACTION_HOVER_CARD_FOOTER_DESCRIPTION_EXTENSION_REQUESTS_ACESSS; break; - case ToolbarActionViewController::HoverCardState:: - kExtensionDoesNotWantAccess: + case HoverCardState::SiteAccess::kExtensionDoesNotWantAccess: NOTREACHED(); break; } return l10n_util::GetStringFUTF16(title_id, host); } -std::u16string GetFootnotePolicyText( - ToolbarActionViewController::HoverCardPolicyState state) { +std::u16string GetFootnotePolicyText(HoverCardState::AdminPolicy state) { int text_id = -1; switch (state) { - case ToolbarActionViewController::HoverCardPolicyState::kPinnedByAdmin: + case HoverCardState::AdminPolicy::kPinnedByAdmin: text_id = IDS_EXTENSIONS_TOOLBAR_ACTION_HOVER_CARD_FOOTER_POLICY_LABEL_PINNED_TEXT; break; - case ToolbarActionViewController::HoverCardPolicyState::kInstalledByAdmin: + case HoverCardState::AdminPolicy::kInstalledByAdmin: text_id = IDS_EXTENSIONS_TOOLBAR_ACTION_HOVER_CARD_FOOTER_POLICY_LABEL_INSTALLED_TEXT; break; - case ToolbarActionViewController::HoverCardPolicyState::kNone: + case HoverCardState::AdminPolicy::kNone: NOTREACHED(); break; } @@ -289,16 +287,11 @@ color_provider->GetColor(ui::kColorBubbleFooterBorder))); } - void UpdateContent( - ToolbarActionViewController::HoverCardState site_access_state, - ToolbarActionViewController::HoverCardPolicyState policy_state, - std::u16string host) { - bool show_site_access_labels = site_access_state != - ToolbarActionViewController::HoverCardState:: - kExtensionDoesNotWantAccess; - bool show_policy_label = - policy_state != - ToolbarActionViewController::HoverCardPolicyState::kNone; + void UpdateContent(HoverCardState state, std::u16string host) { + bool show_site_access_labels = + state.site_access != + HoverCardState::SiteAccess::kExtensionDoesNotWantAccess; + bool show_policy_label = state.policy != HoverCardState::AdminPolicy::kNone; bool footer_visible = show_site_access_labels || show_policy_label; SetVisible(footer_visible); @@ -311,13 +304,13 @@ separator_->SetVisible(show_site_access_labels && show_policy_label); if (show_site_access_labels) { - title_label_->SetText(GetFootnoteTitle(site_access_state)); + title_label_->SetText(GetFootnoteTitle(state.site_access)); description_label_->SetText( - GetFootnoteDescription(site_access_state, host)); + GetFootnoteDescription(state.site_access, host)); } if (show_policy_label) - policy_label_->SetText(GetFootnotePolicyText(policy_state)); + policy_label_->SetText(GetFootnotePolicyText(state.policy)); } void SetFade(double percent) { @@ -424,7 +417,6 @@ title_label_->SetText(action_controller->GetActionName()); footnote_view_->UpdateContent( action_controller->GetHoverCardState(web_contents), - action_controller->GetHoverCardPolicyState(), GetCurrentHost(web_contents)); } @@ -454,7 +446,7 @@ return footnote_view_->IsSeparatorVisible(); } -bool ToolbarActionHoverCardBubbleView::IsFooterPolicyLabelVisible() const { +bool ToolbarActionHoverCardBubbleView::IsFooterAdminPolicyVisible() const { return footnote_view_->IsPolicyVisible(); }
diff --git a/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_bubble_view.h b/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_bubble_view.h index 82c3ff3c..0dc8880c 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_bubble_view.h +++ b/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_bubble_view.h
@@ -38,7 +38,7 @@ bool IsFooterTitleLabelVisible() const; bool IsFooterDescriptionLabelVisible() const; bool IsFooterSeparatorVisible() const; - bool IsFooterPolicyLabelVisible() const; + bool IsFooterAdminPolicyVisible() const; private: friend class ToolbarActionHoverCardBubbleViewUITest;
diff --git a/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_bubble_view_interactive_uitest.cc b/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_bubble_view_interactive_uitest.cc index b03688832..41f0231 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_bubble_view_interactive_uitest.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_bubble_view_interactive_uitest.cc
@@ -263,7 +263,7 @@ EXPECT_TRUE(hover_card()->IsFooterVisible()); EXPECT_FALSE(hover_card()->IsFooterTitleLabelVisible()); EXPECT_FALSE(hover_card()->IsFooterDescriptionLabelVisible()); - EXPECT_TRUE(hover_card()->IsFooterPolicyLabelVisible()); + EXPECT_TRUE(hover_card()->IsFooterAdminPolicyVisible()); EXPECT_FALSE(hover_card()->IsFooterSeparatorVisible()); // Hover over the extension with host permissions pinned by the user. @@ -283,7 +283,7 @@ EXPECT_TRUE(hover_card()->IsFooterVisible()); EXPECT_TRUE(hover_card()->IsFooterTitleLabelVisible()); EXPECT_TRUE(hover_card()->IsFooterDescriptionLabelVisible()); - EXPECT_FALSE(hover_card()->IsFooterPolicyLabelVisible()); + EXPECT_FALSE(hover_card()->IsFooterAdminPolicyVisible()); EXPECT_FALSE(hover_card()->IsFooterSeparatorVisible()); // Hover over the extension with host permission installed and pinned by @@ -306,7 +306,7 @@ EXPECT_TRUE(hover_card()->IsFooterVisible()); EXPECT_TRUE(hover_card()->IsFooterTitleLabelVisible()); EXPECT_TRUE(hover_card()->IsFooterDescriptionLabelVisible()); - EXPECT_TRUE(hover_card()->IsFooterPolicyLabelVisible()); + EXPECT_TRUE(hover_card()->IsFooterAdminPolicyVisible()); EXPECT_TRUE(hover_card()->IsFooterSeparatorVisible()); }
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc index f4cdf81..9eb8825 100644 --- a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc +++ b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc
@@ -614,10 +614,7 @@ }; WebAppFrameToolbarBrowserTest_WindowControlsOverlay() { - scoped_feature_list_.InitWithFeatures( - /*enabled_features=*/{safe_browsing::kDownloadBubble, - features::kWebAppWindowControlsOverlay}, - /*disabled_features=*/{}); + scoped_feature_list_.InitAndEnableFeature(safe_browsing::kDownloadBubble); } void SetUp() override {
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc index f0ae7e5..c046f24 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc +++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
@@ -3140,7 +3140,6 @@ enabled_features.push_back(features::kPwaUpdateDialogForIcon); enabled_features.push_back(features::kPwaUpdateDialogForName); enabled_features.push_back(features::kDesktopPWAsEnforceWebAppSettingsPolicy); - enabled_features.push_back(features::kWebAppWindowControlsOverlay); enabled_features.push_back(features::kRecordWebAppDebugInfo); enabled_features.push_back(blink::features::kFileHandlingAPI); #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/ui/web_applications/web_app_browsertest.cc b/chrome/browser/ui/web_applications/web_app_browsertest.cc index 1b3d0f4..4e3c662 100644 --- a/chrome/browser/ui/web_applications/web_app_browsertest.cc +++ b/chrome/browser/ui/web_applications/web_app_browsertest.cc
@@ -241,17 +241,6 @@ } }; -// A dedicated test fixture for WindowControlsOverlay, which requires a command -// line switch to enable manifest parsing. -class WebAppBrowserTest_WindowControlsOverlay : public WebAppBrowserTest { - public: - WebAppBrowserTest_WindowControlsOverlay() = default; - - private: - base::test::ScopedFeatureList scoped_feature_list_{ - features::kWebAppWindowControlsOverlay}; -}; - // A dedicated test fixture for Borderless, which requires a command // line switch to enable manifest parsing. class WebAppBrowserTest_Borderless : public WebAppBrowserTest { @@ -1952,7 +1941,7 @@ EXPECT_EQ(GetAppMenuCommandState(IDC_INSTALL_PWA, new_browser), kNotPresent); } -IN_PROC_BROWSER_TEST_F(WebAppBrowserTest_WindowControlsOverlay, +IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, DISABLE_POSIX(WindowControlsOverlay)) { GURL test_url = https_server()->GetURL( "/banners/"
diff --git a/chrome/browser/ui/web_applications/web_app_window_controls_overlay_browsertest.cc b/chrome/browser/ui/web_applications/web_app_window_controls_overlay_browsertest.cc index c6e607f..8ece760 100644 --- a/chrome/browser/ui/web_applications/web_app_window_controls_overlay_browsertest.cc +++ b/chrome/browser/ui/web_applications/web_app_window_controls_overlay_browsertest.cc
@@ -11,7 +11,6 @@ #include "chrome/browser/web_applications/os_integration/os_integration_manager.h" #include "chrome/browser/web_applications/web_app_provider.h" #include "components/page_load_metrics/browser/page_load_metrics_test_waiter.h" -#include "content/public/common/content_features.h" #include "content/public/test/browser_test.h" #include "content/public/test/test_navigation_observer.h" #include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" @@ -63,8 +62,6 @@ private: OsIntegrationManager::ScopedSuppressForTesting os_hooks_supress_; - base::test::ScopedFeatureList scoped_feature_list_{ - features::kWebAppWindowControlsOverlay}; }; IN_PROC_BROWSER_TEST_F(WebAppWindowControlsOverlayBrowserTest,
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc index 1f0c418..f3ca049 100644 --- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc +++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -578,7 +578,7 @@ WebUIController* NewWebUI<ash::FilesInternalsUI>(WebUI* web_ui, const GURL& url) { return new ash::FilesInternalsUI( - web_ui, std::make_unique<ChromeFilesInternalsUIDelegate>()); + web_ui, std::make_unique<ChromeFilesInternalsUIDelegate>(web_ui)); } template <>
diff --git a/chrome/browser/ui/webui/cr_components/history_clusters/history_clusters_util.cc b/chrome/browser/ui/webui/cr_components/history_clusters/history_clusters_util.cc index f8e05503..7047c4e 100644 --- a/chrome/browser/ui/webui/cr_components/history_clusters/history_clusters_util.cc +++ b/chrome/browser/ui/webui/cr_components/history_clusters/history_clusters_util.cc
@@ -38,6 +38,7 @@ static constexpr webui::LocalizedString kHistoryClustersStrings[] = { {"actionMenuDescription", IDS_HISTORY_CLUSTERS_ACTION_MENU_DESCRIPTION}, + {"bookmarked", IDS_HISTORY_ENTRY_BOOKMARKED}, {"cancel", IDS_CANCEL}, {"clearSearch", IDS_CLEAR_SEARCH}, {"deleteConfirm",
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc index b054320..2b1f24d 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -990,6 +990,7 @@ IDS_SETTINGS_ADDRESS_REMOVE_CONFIRMATION_TITLE}, {"removeAddressConfirmationDescription", IDS_SETTINGS_ADDRESS_REMOVE_CONFIRMATION_DESCRIPTION}, + {"addressRemovedMessage", IDS_SETTINGS_ADDRESS_REMOVED_MESSAGE}, {"removeCreditCard", IDS_SETTINGS_CREDIT_CARD_REMOVE}, {"clearCreditCard", IDS_SETTINGS_CREDIT_CARD_CLEAR}, {"creditCardType", IDS_SETTINGS_AUTOFILL_CREDIT_CARD_TYPE_COLUMN_LABEL},
diff --git a/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc b/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc index b6ab8a7..cc3f7d9 100644 --- a/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc +++ b/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc
@@ -20,6 +20,7 @@ #include "chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.h" #include "chrome/browser/ui/webui/side_panel/reading_list/reading_list_page_handler.h" #include "chrome/browser/ui/webui/webui_util.h" +#include "chrome/common/pref_names.h" #include "chrome/common/webui_url_constants.h" #include "chrome/grit/generated_resources.h" #include "chrome/grit/side_panel_resources.h" @@ -95,6 +96,17 @@ source->AddBoolean("unifiedSidePanel", base::FeatureList::IsEnabled(features::kUnifiedSidePanel)); + source->AddBoolean( + "showPowerBookmarks", + base::FeatureList::IsEnabled(features::kPowerBookmarksSidePanel)); + + bool shouldShowBookmark = + prefs->GetBoolean(prefs::kShouldShowSidePanelBookmarkTab); + source->AddBoolean("shouldShowBookmark", shouldShowBookmark); + if (shouldShowBookmark) { + prefs->SetBoolean(prefs::kShouldShowSidePanelBookmarkTab, false); + } + content::URLDataSource::Add( profile, std::make_unique<FaviconSource>( profile, chrome::FaviconUrlFormat::kFavicon2));
diff --git a/chrome/browser/vr/elements/viewport_aware_root_unittest.cc b/chrome/browser/vr/elements/viewport_aware_root_unittest.cc index a7b2b5c..12f7dab7 100644 --- a/chrome/browser/vr/elements/viewport_aware_root_unittest.cc +++ b/chrome/browser/vr/elements/viewport_aware_root_unittest.cc
@@ -36,8 +36,8 @@ const gfx::Transform& rhs) { for (int row = 0; row < 4; ++row) { for (int col = 0; col < 4; ++col) { - if (!base::IsApproximatelyEqual(lhs.rc(row, col), rhs.rc(row, col), - kEpsilon)) { + if (!base::IsApproximatelyEqual<double>(lhs.rc(row, col), + rhs.rc(row, col), kEpsilon)) { return false; } }
diff --git a/chrome/browser/vr/ui_unittest.cc b/chrome/browser/vr/ui_unittest.cc index 0958ba87..9c948cca 100644 --- a/chrome/browser/vr/ui_unittest.cc +++ b/chrome/browser/vr/ui_unittest.cc
@@ -32,6 +32,7 @@ #include "components/omnibox/browser/autocomplete_match.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/gfx/geometry/test/geometry_util.h" namespace vr { @@ -1257,7 +1258,7 @@ model_->mutable_primary_controller().recentered = true; AdvanceFrame(); - EXPECT_EQ(original, repositioner->world_space_transform()); + EXPECT_TRANSFORM_NEAR(original, repositioner->world_space_transform(), 1e-20); } // No element in the controller root's subtree should be hit testable.
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 06a0653f2..979c7128 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1666007719-b3086f429daf2747751dfa6a3852e72c79c2ae43.profdata +chrome-linux-main-1666029593-ced6dd87becdd1f0649e3a24f41821485b40b899.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index b5969ef..3b9aea60 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1666007719-47e97c1e75e387a8447bcfb937bae7bd211b1b3f.profdata +chrome-mac-arm-main-1666029593-44512b2560803554918539a059d4bd5cc870211b.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 48be8ca4..cccf36be 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1666007719-013b80cf06e6ab1b864dc17865e3165dfc3052e1.profdata +chrome-mac-main-1666029593-e6ed3ce9ba2c388109f472f1f99c3c811b845568.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 2a50f6e..8047da6 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1666018656-3c6bc066b8ef3b48471b174136b5048e01638286.profdata +chrome-win64-main-1666029593-b92f5ea1668afad0cff79988d756ae03b4a725b7.profdata
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni index c5eb50b..7be7aca 100644 --- a/chrome/chrome_paks.gni +++ b/chrome/chrome_paks.gni
@@ -235,6 +235,7 @@ "$root_gen_dir/ash/webui/ash_face_ml_app_bundle_resources.pak", "$root_gen_dir/ash/webui/ash_face_ml_app_resources.pak", "$root_gen_dir/ash/webui/ash_face_ml_app_untrusted_resources.pak", + "$root_gen_dir/ash/webui/ash_files_internals_resources.pak", "$root_gen_dir/ash/webui/ash_firmware_update_app_resources.pak", "$root_gen_dir/ash/webui/ash_guest_os_installer_resources.pak", "$root_gen_dir/ash/webui/ash_help_app_resources.pak", @@ -307,6 +308,7 @@ "//ash/webui/resources:face_ml_app_resources", "//ash/webui/resources:face_ml_app_resources", "//ash/webui/resources:face_ml_app_untrusted_resources", + "//ash/webui/resources:files_internals_resources", "//ash/webui/resources:firmware_update_app_resources", "//ash/webui/resources:help_app_bundle_resources", "//ash/webui/resources:help_app_kids_magazine_bundle_resources",
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index f1bd990..2b07edb 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc
@@ -3614,6 +3614,13 @@ // button in the FUE bubble once. const char kShouldShowPriceTrackFUEBubble[] = "should_show_price_track_fue_bubble_fue"; + +// A boolean indicating whether we should show the bookmark tab for the next +// side panel opening. Right now this is only used by Price Tracking feature +// to show the bookmark tab (which contains the price tracking list) after +// IPH. +const char kShouldShowSidePanelBookmarkTab[] = + "should_show_side_panel_bookmark_tab"; #endif const char kStrictMimetypeCheckForWorkerScriptsEnabled[] =
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index 028f700..3d344e7 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -1273,6 +1273,7 @@ extern const char kHighEfficiencyChipExpandedCount[]; extern const char kShouldShowPriceTrackFUEBubble[]; +extern const char kShouldShowSidePanelBookmarkTab[]; #endif extern const char kStrictMimetypeCheckForWorkerScriptsEnabled[];
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 21ff941..87090d5 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -8257,7 +8257,10 @@ } if (is_win || is_mac || is_linux) { - sources += [ "../browser/ui/views/sharing_hub/sharing_hub_bubble_view_impl_unittest.cc" ] + sources += [ + "../browser/ui/views/sharing_hub/preview_view_unittest.cc", + "../browser/ui/views/sharing_hub/sharing_hub_bubble_view_impl_unittest.cc", + ] } if (use_aura) {
diff --git a/chrome/test/base/chromeos/demo_ash_requires_lacros_browsertest.cc b/chrome/test/base/chromeos/demo_ash_requires_lacros_browsertest.cc index 763ab50a..bfe448c 100644 --- a/chrome/test/base/chromeos/demo_ash_requires_lacros_browsertest.cc +++ b/chrome/test/base/chromeos/demo_ash_requires_lacros_browsertest.cc
@@ -45,8 +45,7 @@ IN_PROC_BROWSER_TEST_F(DemoAshRequiresLacrosTest, NewTab) { if (ash_starter_.HasLacrosArgument()) { - crosapi::BrowserManager::Get()->NewTab( - /*should_trigger_session_restore=*/false); + crosapi::BrowserManager::Get()->NewTab(); // Assert Lacros is running. ASSERT_TRUE(crosapi::BrowserManager::Get()->IsRunning()); // browser() returns an Ash browser instance.
diff --git a/chrome/test/data/webui/chromeos/diagnostics/touchscreen_tester_test.js b/chrome/test/data/webui/chromeos/diagnostics/touchscreen_tester_test.js index 60c73c3..9ab8a1c 100644 --- a/chrome/test/data/webui/chromeos/diagnostics/touchscreen_tester_test.js +++ b/chrome/test/data/webui/chromeos/diagnostics/touchscreen_tester_test.js
@@ -109,4 +109,48 @@ mockController.verifyMocks(); } }); + + test('OnDraw', async () => { + await initializeTouchscreenTester(); + await openTester(); + + // Mock drawTrailMark and drawTrail function. + const drawingProvider = touchscreenTesterElement.getDrawingProvider(); + const mockController = new MockController(); + const mockDrawTrail = + mockController.createFunctionMock(drawingProvider, 'drawTrail'); + + const expectedTouches = new Map(); + const touchStartEvents = [ + { + type: 'touchstart', + id: 1, + point: {x: 100, y: 150}, + pressure: 40, + }, + { + type: 'touchmove', + id: 1, + point: {x: 110, y: 160}, + pressure: 30, + }, + ]; + + for (const {type, id, point, pressure} of touchStartEvents) { + if (type === 'touchstart') { + mockDrawTrail.addExpectation( + point.x - 1, point.y, point.x, point.y, pressure); + touchscreenTesterElement.onDrawStart(id, point, pressure); + } else if (type === 'touchmove') { + const previousPt = expectedTouches.get(id); + mockDrawTrail.addExpectation( + previousPt.x, previousPt.y, point.x, point.y, pressure); + touchscreenTesterElement.onDraw(id, point, pressure); + } + + expectedTouches.set(id, point); + assertDeepEquals(expectedTouches, touchscreenTesterElement.getTouches()); + mockController.verifyMocks(); + } + }); }
diff --git a/chrome/test/data/webui/chromeos/internet_detail_dialog_test.js b/chrome/test/data/webui/chromeos/internet_detail_dialog_test.js index bf1cf33..275256b 100644 --- a/chrome/test/data/webui/chromeos/internet_detail_dialog_test.js +++ b/chrome/test/data/webui/chromeos/internet_detail_dialog_test.js
@@ -69,8 +69,9 @@ mojoApi_.resetForTest(); }); - async function init() { + async function init(captive_portal_2022) { internetDetailDialog = document.createElement('internet-detail-dialog'); + internetDetailDialog.isCaptivePortalUI2022Enabled_ = captive_portal_2022; document.body.appendChild(internetDetailDialog); await flushAsync(); } @@ -125,8 +126,7 @@ wifiNetwork.portalState = PortalState.kPortal; mojoApi_.setManagedPropertiesForTest(wifiNetwork); - init(); - internetDetailDialog.isCaptivePortalUI2022Enabled_ = true; + init(/*captive_portal_2022=*/ true); return flushAsync().then(() => { const networkStateText = internetDetailDialog.shadowRoot.querySelector(`#networkState`); @@ -150,8 +150,7 @@ wifiNetwork.portalState = PortalState.kNoInternet; mojoApi_.setManagedPropertiesForTest(wifiNetwork); - init(); - internetDetailDialog.isCaptivePortalUI2022Enabled_ = true; + init(/*captive_portal_2022=*/ true); return flushAsync().then(() => { const networkStateText = internetDetailDialog.shadowRoot.querySelector(`#networkState`); @@ -176,8 +175,7 @@ wifiNetwork.portalState = PortalState.kProxyAuthRequired; mojoApi_.setManagedPropertiesForTest(wifiNetwork); - init(); - internetDetailDialog.isCaptivePortalUI2022Enabled_ = true; + init(/*captive_portal_2022=*/ true); return flushAsync().then(() => { const networkStateText = internetDetailDialog.shadowRoot.querySelector(`#networkState`); @@ -201,8 +199,7 @@ wifiNetwork.portalState = PortalState.kPortal; mojoApi_.setManagedPropertiesForTest(wifiNetwork); - init(); - internetDetailDialog.isCaptivePortalUI2022Enabled_ = false; + init(/*captive_portal_2022=*/ false); return flushAsync().then(() => { const networkStateText = internetDetailDialog.shadowRoot.querySelector(`#networkState`);
diff --git a/chrome/test/data/webui/chromeos/personalization_app/local_images_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/local_images_element_test.ts index b5c2f7ce..5163734 100644 --- a/chrome/test/data/webui/chromeos/personalization_app/local_images_element_test.ts +++ b/chrome/test/data/webui/chromeos/personalization_app/local_images_element_test.ts
@@ -5,8 +5,8 @@ import 'chrome://personalization/strings.m.js'; import 'chrome://webui-test/mojo_webui_test_support.js'; -import {kDefaultImageSymbol, LocalImages} from 'chrome://personalization/js/personalization_app.js'; -import {assertEquals, assertTrue} from 'chrome://webui-test/chai_assert.js'; +import {kDefaultImageSymbol, LocalImages, WallpaperGridItem} from 'chrome://personalization/js/personalization_app.js'; +import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js'; import {baseSetup, initElement, teardownElement} from './personalization_app_test_utils.js'; @@ -23,21 +23,19 @@ /** * Get all currently visible photo loading placeholders. */ - function getLoadingPlaceholders(): HTMLElement[] { + function getLoadingPlaceholders(): WallpaperGridItem[] { if (!localImagesElement) { return []; } - const selectors = [ - '.photo-container:not([hidden])', - '.photo-inner-container.placeholder:not([style*="display: none"])', - ]; + return Array.from( - localImagesElement.shadowRoot!.querySelectorAll(selectors.join(' '))); + localImagesElement.shadowRoot!.querySelectorAll<WallpaperGridItem>( + `${WallpaperGridItem.is}[placeholder]:not([hidden])`)); } - function getDefaultImageHtmlElement(): HTMLElement|null { - return localImagesElement!.shadowRoot!.querySelector( - `.photo-inner-container[data-id="${kDefaultImageSymbol.toString()}"]`); + function getDefaultImageHtmlElement(): WallpaperGridItem|null { + return localImagesElement!.shadowRoot!.querySelector<WallpaperGridItem>( + `${WallpaperGridItem.is}[data-id="${kDefaultImageSymbol.toString()}"]`); } setup(() => { @@ -52,7 +50,7 @@ await flushTasks(); }); - test('displays a loading placeholder for unloaded local images', async () => { + test('displays a tile with no src for unloaded local images', async () => { personalizationStore.data.wallpaper.local = { images: wallpaperProvider.localImages, data: wallpaperProvider.localImageData, @@ -68,21 +66,23 @@ // Iron-list creates some extra dom elements as a scroll buffer and // hides them. Only select visible elements here to get the real ones. let loadingPlaceholders = getLoadingPlaceholders(); + // Counts as loading if store.loading.local.data does not contain an // entry for the image. Therefore should be 2 loading tiles. - assertEquals(2, loadingPlaceholders.length); + assertEquals(2, loadingPlaceholders.length, 'first time 2 placeholders'); personalizationStore.data.wallpaper.loading.local = { images: false, - data: {'LocalImage0.png': true, 'LocalImage1.png': true}, + data: { + 'LocalImage0.png': true, + 'LocalImage1.png': true, + }, }; personalizationStore.notifyObservers(); await waitAfterNextRender(localImagesElement); - loadingPlaceholders = getLoadingPlaceholders(); - // Still 2 loading tiles. - assertEquals(2, loadingPlaceholders.length); + assertEquals(2, loadingPlaceholders.length, 'still 2 placeholders'); personalizationStore.data.wallpaper.loading.local = { images: false, @@ -92,7 +92,7 @@ await waitAfterNextRender(localImagesElement); loadingPlaceholders = getLoadingPlaceholders(); - assertEquals(1, loadingPlaceholders.length); + assertEquals(1, loadingPlaceholders.length, 'Only one loading placeholder'); }); test( @@ -113,10 +113,9 @@ localImagesElement.shadowRoot!.querySelector('iron-list'); assertTrue(!!ironList); - // Both items are sent. No images are rendered yet because they are not - // done loading thumbnails. - assertEquals(2, ironList.items!.length); - assertEquals(0, ironList.shadowRoot!.querySelectorAll('img').length); + // Both items are sent. + assertEquals( + 2, ironList.items!.length, 'both images are sent to iron-list'); // Set loading finished for first thumbnail. personalizationStore.data.wallpaper.loading.local.data = { @@ -124,10 +123,14 @@ }; personalizationStore.notifyObservers(); await waitAfterNextRender(localImagesElement); + assertEquals(2, ironList.items!.length); - let imgTags = localImagesElement.shadowRoot!.querySelectorAll('img'); - assertEquals(1, imgTags.length); - assertEquals('data:image/png;base64,localimage0data', imgTags![0]!.src); + let gridItems = + localImagesElement.shadowRoot!.querySelectorAll<WallpaperGridItem>( + `${WallpaperGridItem.is}:not([placeholder]):not([hidden])`); + assertEquals(1, gridItems.length); + assertDeepEquals( + {url: 'data:image/png;base64,localimage0data'}, gridItems![0]!.src); // Set loading failed for second thumbnail. personalizationStore.data.wallpaper.loading.local.data = { @@ -135,61 +138,64 @@ 'LocalImage1.png': false, }; personalizationStore.data.wallpaper.local.data = { - 'LocalImage0.png': 'data:image/png;base64,localimage0data', + 'LocalImage0.png': {url: 'data:image/png;base64,localimage0data'}, 'LocalImage1.png': null, }; personalizationStore.notifyObservers(); await waitAfterNextRender(localImagesElement); + // Still only first thumbnail displayed. - imgTags = localImagesElement.shadowRoot!.querySelectorAll('img'); - assertEquals(1, imgTags.length); - assertEquals('data:image/png;base64,localimage0data', imgTags![0]!.src); + gridItems = + localImagesElement.shadowRoot!.querySelectorAll<WallpaperGridItem>( + `${WallpaperGridItem.is}:not([placeholder]):not([hidden])`); + assertEquals( + 1, gridItems.length, 'still only first thumbnail displayed'); + assertDeepEquals( + {url: 'data:image/png;base64,localimage0data'}, gridItems![0]!.src); }); - test( - 'sets aria-selected attribute if image name matches currently selected', - async () => { - personalizationStore.data.wallpaper.local = { - images: [ - {path: '/test/LocalImage0.png'}, - {path: '/test/LocalImage1.png'}, - ], - data: { - '/test/LocalImage0.png': - {url: 'data:image/png;base64,localimage0data'}, - '/test/LocalImage1.png': - {url: 'data:image/png;base64,localimage1data'}, - }, - }; - // Done loading. - personalizationStore.data.wallpaper.loading.local = { - images: false, - data: - {'/test/LocalImage0.png': false, '/test/LocalImage1.png': false}, - }; + test('sets selected if image name matches currently selected', async () => { + personalizationStore.data.wallpaper.local = { + images: [ + {path: '/test/LocalImage0.png'}, + {path: '/test/LocalImage1.png'}, + ], + data: { + '/test/LocalImage0.png': {url: 'data:image/png;base64,localimage0data'}, + '/test/LocalImage1.png': {url: 'data:image/png;base64,localimage1data'}, + }, + }; + // Done loading. + personalizationStore.data.wallpaper.loading.local = { + images: false, + data: { + '/test/LocalImage0.png': false, + '/test/LocalImage1.png': false, + }, + }; - localImagesElement = initElement(LocalImages, {hidden: false}); - await waitAfterNextRender(localImagesElement); + localImagesElement = initElement(LocalImages, {hidden: false}); + await waitAfterNextRender(localImagesElement); - // iron-list pre-creates some extra DOM elements but marks them as - // hidden. Ignore them here to only get visible images. - const images = localImagesElement.shadowRoot!.querySelectorAll( - '.photo-container:not([hidden]) .photo-inner-container'); + // iron-list pre-creates some extra DOM elements but marks them as + // hidden. Ignore them here to only get visible images. + const images = + localImagesElement.shadowRoot!.querySelectorAll<WallpaperGridItem>( + `${WallpaperGridItem.is}:not([hidden])`); - assertEquals(2, images.length); - // Every image is aria-selected false. - assertTrue(Array.from(images).every( - image => image.getAttribute('aria-selected') === 'false')); + assertEquals(2, images.length); + // Every image is not selected. + assertTrue(Array.from(images).every(image => !image.selected)); - personalizationStore.data.wallpaper.currentSelected = { - key: '/test/LocalImage1.png', - }; - personalizationStore.notifyObservers(); + personalizationStore.data.wallpaper.currentSelected = { + key: '/test/LocalImage1.png', + }; + personalizationStore.notifyObservers(); - assertEquals(2, images.length); - assertEquals(images[0]!.getAttribute('aria-selected'), 'false'); - assertEquals(images[1]!.getAttribute('aria-selected'), 'true'); - }); + assertEquals(2, images.length); + assertFalse(images[0]!.selected!); + assertTrue(images[1]!.selected!); + }); test('images have proper aria label when loaded', async () => { personalizationStore.data.wallpaper.local = { @@ -199,7 +205,10 @@ // Done loading. personalizationStore.data.wallpaper.loading.local = { images: false, - data: {'LocalImage0.png': false, 'LocalImage1.png': false}, + data: { + 'LocalImage0.png': false, + 'LocalImage1.png': false, + }, }; localImagesElement = initElement(LocalImages, {hidden: false}); @@ -207,20 +216,42 @@ // iron-list pre-creates some extra DOM elements but marks them as // hidden. Ignore them here to only get visible images. - const images = localImagesElement.shadowRoot!.querySelectorAll( - '.photo-container:not([hidden]) .photo-inner-container'); + const images = + localImagesElement.shadowRoot!.querySelectorAll<WallpaperGridItem>( + `${WallpaperGridItem.is}:not([hidden])`); assertEquals(2, images.length); - // Every image is aria-selected false. - assertTrue(Array.from(images).every( - image => image.getAttribute('aria-selected') === 'false')); // Every image has aria-label set. assertEquals( images[0]!.getAttribute('aria-label'), - wallpaperProvider.localImages![0]!.path); + wallpaperProvider.localImages![0]!.path, 'image 0 has aria label'); assertEquals( images[1]!.getAttribute('aria-label'), - wallpaperProvider.localImages![1]!.path); + wallpaperProvider.localImages![1]!.path, 'image 1 has aria label'); + }); + + test('default image has proper aria label', async () => { + personalizationStore.data.wallpaper.local = { + images: [kDefaultImageSymbol], + data: {[kDefaultImageSymbol]: wallpaperProvider.defaultImageThumbnail}, + }; + + personalizationStore.data.wallpaper.loading.local = { + images: false, + data: {[kDefaultImageSymbol]: false}, + }; + + localImagesElement = initElement(LocalImages, {hidden: false}); + await waitAfterNextRender(localImagesElement); + + const images = + localImagesElement.shadowRoot!.querySelectorAll<WallpaperGridItem>( + `${WallpaperGridItem.is}:not([hidden])`); + + assertEquals(1, images.length, 'only default image is present'); + assertEquals( + images[0]!.getAttribute('aria-label'), 'Default Wallpaper', + 'default image has correct aria label'); }); test('click default image thumbnail resets wallpaper', async () => { @@ -244,7 +275,7 @@ test('default image thumbnail hidden when fails to load', async () => { personalizationStore.data.wallpaper.local = { images: [kDefaultImageSymbol], - data: {[kDefaultImageSymbol]: ''}, + data: {[kDefaultImageSymbol]: {url: ''}}, }; localImagesElement = initElement(LocalImages, {hidden: false});
diff --git a/chrome/test/data/webui/settings/chromeos/internet_detail_page_tests.js b/chrome/test/data/webui/settings/chromeos/internet_detail_page_tests.js index 3d379d2..eb8cbe973 100644 --- a/chrome/test/data/webui/settings/chromeos/internet_detail_page_tests.js +++ b/chrome/test/data/webui/settings/chromeos/internet_detail_page_tests.js
@@ -232,8 +232,8 @@ mojoApi_.setManagedPropertiesForTest(wifiNetwork); - internetDetailPage.init('wifi_user_guid', 'WiFi', 'wifi_user'); internetDetailPage.isCaptivePortalUI2022Enabled_ = true; + internetDetailPage.init('wifi_user_guid', 'WiFi', 'wifi_user'); return flushAsync().then(() => { const networkStateText = internetDetailPage.shadowRoot.querySelector(`#networkState`); @@ -260,8 +260,8 @@ mojoApi_.setManagedPropertiesForTest(wifiNetwork); - internetDetailPage.init('wifi_user_guid', 'WiFi', 'wifi_user'); internetDetailPage.isCaptivePortalUI2022Enabled_ = true; + internetDetailPage.init('wifi_user_guid', 'WiFi', 'wifi_user'); return flushAsync().then(() => { const networkStateText = internetDetailPage.shadowRoot.querySelector(`#networkState`); @@ -288,8 +288,8 @@ mojoApi_.setManagedPropertiesForTest(wifiNetwork); - internetDetailPage.init('wifi_user_guid', 'WiFi', 'wifi_user'); internetDetailPage.isCaptivePortalUI2022Enabled_ = true; + internetDetailPage.init('wifi_user_guid', 'WiFi', 'wifi_user'); return flushAsync().then(() => { const networkStateText = internetDetailPage.shadowRoot.querySelector(`#networkState`); @@ -316,8 +316,8 @@ mojoApi_.setManagedPropertiesForTest(wifiNetwork); - internetDetailPage.init('wifi_user_guid', 'WiFi', 'wifi_user'); internetDetailPage.isCaptivePortalUI2022Enabled_ = true; + internetDetailPage.init('wifi_user_guid', 'WiFi', 'wifi_user'); return flushAsync().then(() => { const networkStateText = internetDetailPage.shadowRoot.querySelector(`#networkState`); @@ -347,8 +347,8 @@ mojoApi_.setManagedPropertiesForTest(wifiNetwork); - internetDetailPage.init('wifi_user_guid', 'WiFi', 'wifi_user'); internetDetailPage.isCaptivePortalUI2022Enabled_ = false; + internetDetailPage.init('wifi_user_guid', 'WiFi', 'wifi_user'); return flushAsync().then(() => { const networkStateText = internetDetailPage.shadowRoot.querySelector(`#networkState`);
diff --git a/chrome/test/data/webui/side_panel/side_panel_app_test.ts b/chrome/test/data/webui/side_panel/side_panel_app_test.ts index 28a5864..314dbf5 100644 --- a/chrome/test/data/webui/side_panel/side_panel_app_test.ts +++ b/chrome/test/data/webui/side_panel/side_panel_app_test.ts
@@ -6,6 +6,7 @@ import 'chrome://read-later.top-chrome/app.js'; import {LOCAL_STORAGE_TAB_ID_KEY, SidePanelAppElement} from 'chrome://read-later.top-chrome/app.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {assertEquals} from 'chrome://webui-test/chai_assert.js'; import {flushTasks} from 'chrome://webui-test/polymer_test_util.js'; @@ -51,4 +52,20 @@ assertEquals( 1, sidePanelApp.shadowRoot!.querySelectorAll('bookmarks-list').length); }); + + test('ForceShowBookmarkTab', async () => { + const tabs = sidePanelApp.shadowRoot!.querySelector('cr-tabs')!; + + // Remove the app, change localStorage to select the ReadList tab while + // force showing Bookmarks tab, and add the app back to the DOM to see if + // the app changes tabs on connectedCallback. + sidePanelApp.remove(); + window.localStorage[LOCAL_STORAGE_TAB_ID_KEY] = 'readingList'; + loadTimeData.overrideValues({ + shouldShowBookmark: true, + }); + + document.body.appendChild(sidePanelApp); + assertEquals(1, tabs.selected); + }); });
diff --git a/chrome/updater/BUILD.gn b/chrome/updater/BUILD.gn index 25ed918..cb3c5d32 100644 --- a/chrome/updater/BUILD.gn +++ b/chrome/updater/BUILD.gn
@@ -360,6 +360,8 @@ "app/server/linux/server.cc", "app/server/linux/server.h", "device_management/dm_storage_linux.cc", + "linux/ipc_support.cc", + "linux/ipc_support.h", "linux/linux_util.cc", "linux/linux_util.h", "linux/net/network.cc", @@ -372,6 +374,8 @@ "setup_linux.cc", "update_usage_stats_task_linux.cc", ] + + deps += [ "//mojo/core/embedder" ] } }
diff --git a/chrome/updater/DEPS b/chrome/updater/DEPS index 5d61d217..4ce6659 100644 --- a/chrome/updater/DEPS +++ b/chrome/updater/DEPS
@@ -12,6 +12,7 @@ "+components/winhttp", "+courgette", "+crypto", + "+mojo", "+third_party/boringssl", "+third_party/crashpad", "+third_party/re2",
diff --git a/chrome/updater/linux/ipc_support.cc b/chrome/updater/linux/ipc_support.cc new file mode 100644 index 0000000..3c91639 --- /dev/null +++ b/chrome/updater/linux/ipc_support.cc
@@ -0,0 +1,28 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/updater/linux/ipc_support.h" + +#include <memory> + +#include "base/message_loop/message_pump_type.h" +#include "base/threading/thread.h" +#include "mojo/core/embedder/embedder.h" +#include "mojo/core/embedder/scoped_ipc_support.h" + +namespace updater { + +ScopedIPCSupportWrapper::ScopedIPCSupportWrapper() { + mojo::core::Init(); + ipc_thread_.StartWithOptions( + base::Thread::Options(base::MessagePumpType::IO, 0)); + + ipc_support_ = std::make_unique<mojo::core::ScopedIPCSupport>( + ipc_thread_.task_runner(), + mojo::core::ScopedIPCSupport::ShutdownPolicy::CLEAN); +} + +ScopedIPCSupportWrapper::~ScopedIPCSupportWrapper() = default; + +} // namespace updater
diff --git a/chrome/updater/linux/ipc_support.h b/chrome/updater/linux/ipc_support.h new file mode 100644 index 0000000..3347d2cc --- /dev/null +++ b/chrome/updater/linux/ipc_support.h
@@ -0,0 +1,30 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_UPDATER_LINUX_IPC_SUPPORT_H_ +#define CHROME_UPDATER_LINUX_IPC_SUPPORT_H_ + +#include <memory> + +#include "base/threading/thread.h" +#include "mojo/core/embedder/embedder.h" +#include "mojo/core/embedder/scoped_ipc_support.h" + +namespace updater { + +class ScopedIPCSupportWrapper { + public: + ScopedIPCSupportWrapper(); + ScopedIPCSupportWrapper(const ScopedIPCSupportWrapper&) = delete; + ScopedIPCSupportWrapper& operator=(const ScopedIPCSupportWrapper) = delete; + ~ScopedIPCSupportWrapper(); + + private: + base::Thread ipc_thread_ = base::Thread("ipc!"); + std::unique_ptr<mojo::core::ScopedIPCSupport> ipc_support_; +}; + +} // namespace updater + +#endif // CHROME_UPDATER_LINUX_IPC_SUPPORT_H_
diff --git a/chrome/updater/updater.cc b/chrome/updater/updater.cc index e56a6d9f..2ee07fa 100644 --- a/chrome/updater/updater.cc +++ b/chrome/updater/updater.cc
@@ -46,6 +46,7 @@ #include "chrome/updater/app/server/mac/server.h" #elif BUILDFLAG(IS_LINUX) #include "chrome/updater/app/server/linux/server.h" +#include "chrome/updater/linux/ipc_support.h" #endif // Instructions For Windows. @@ -136,6 +137,13 @@ CHECK(false) << "--crash-me was used."; } +#if BUILDFLAG(IS_LINUX) + // As long as this object is alive, all Mojo API surface relevant to IPC + // connections is usable, and message pipes which span a process boundary will + // continue to function. + ScopedIPCSupportWrapper ipc_support; +#endif + if (command_line->HasSwitch(kServerSwitch)) { #if BUILDFLAG(IS_WIN) // By design, Windows uses a leaky singleton server for its RPC server. @@ -205,8 +213,8 @@ // that do not pass --recover, report the browser version switch as --recover. return it != std::end(commands) ? *it - : command_line->HasSwitch(kBrowserVersionSwitch) ? kRecoverSwitch - : ""; + : (command_line->HasSwitch(kBrowserVersionSwitch) ? kRecoverSwitch + : ""); } constexpr const char* BuildFlavor() {
diff --git a/chromeos/ash/components/memory/userspace_swap/userfaultfd_unittest.cc b/chromeos/ash/components/memory/userspace_swap/userfaultfd_unittest.cc index 54f039b..fdafb68 100644 --- a/chromeos/ash/components/memory/userspace_swap/userfaultfd_unittest.cc +++ b/chromeos/ash/components/memory/userspace_swap/userfaultfd_unittest.cc
@@ -104,10 +104,14 @@ class UserfaultFDTest : public testing::Test { public: void SetUp() override { - // We skip these tests if the kernel does not support userfaultfd. + // We skip these tests if the kernel does not support userfaultfd + // or when we have insufficient permissions. if (!UserfaultFD::KernelSupportsUserfaultFD()) { GTEST_SKIP() << "Skipping test: no userfaultfd(2) support."; } + if (!CreateUffd() && errno == EPERM) { + GTEST_SKIP() << "Skipping test: userfaultfd(2) not permitted."; + } } void TearDown() override {
diff --git a/chromeos/ash/components/smbfs/smbfs_mounter.cc b/chromeos/ash/components/smbfs/smbfs_mounter.cc index 75e9a08..1b40e4e 100644 --- a/chromeos/ash/components/smbfs/smbfs_mounter.cc +++ b/chromeos/ash/components/smbfs/smbfs_mounter.cc
@@ -96,9 +96,14 @@ bootstrap_.set_disconnect_handler( base::BindOnce(&SmbFsMounter::OnMojoDisconnect, base::Unretained(this))); + std::vector<std::string> mount_options; + if (options_.enable_verbose_logging) { + mount_options.emplace_back("log-level=-1"); + } + ash::disks::MountPoint::Mount( disk_mount_manager_, mount_url_, "" /* source_format */, mount_dir_name_, - {} /* mount_options */, ash::MountType::kNetworkStorage, + mount_options, ash::MountType::kNetworkStorage, ash::MountAccessMode::kReadWrite, base::BindOnce(&SmbFsMounter::OnMountDone, weak_factory_.GetWeakPtr())); mount_timer_.Start(
diff --git a/chromeos/ash/components/smbfs/smbfs_mounter.h b/chromeos/ash/components/smbfs/smbfs_mounter.h index 09290e5..cdffde3 100644 --- a/chromeos/ash/components/smbfs/smbfs_mounter.h +++ b/chromeos/ash/components/smbfs/smbfs_mounter.h
@@ -66,6 +66,9 @@ // Skip attempting to connect to the share. bool skip_connect = false; + // Run /usr/sbin/smbfs with a chattier log-level. + bool enable_verbose_logging = false; + // Have smbfs save/restore the share's password. bool save_restore_password = false; std::string account_hash;
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt index a7d0a93..d5e7fda 100644 --- a/chromeos/profiles/atom.afdo.newest.txt +++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-atom-108-5335.0-1665395930-benchmark-108.0.5359.5-r1-redacted.afdo.xz +chromeos-chrome-amd64-atom-108-5344.0-1666002754-benchmark-108.0.5359.6-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt index ebadf2e..bffe099 100644 --- a/chromeos/profiles/bigcore.afdo.newest.txt +++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-bigcore-108-5335.0-1665395359-benchmark-108.0.5359.5-r1-redacted.afdo.xz +chromeos-chrome-amd64-bigcore-108-5344.0-1665999557-benchmark-108.0.5359.6-r1-redacted.afdo.xz
diff --git a/components/autofill/core/browser/payments/full_card_request.cc b/components/autofill/core/browser/payments/full_card_request.cc index c6ec9ffa..ca3961a5 100644 --- a/components/autofill/core/browser/payments/full_card_request.cc +++ b/components/autofill/core/browser/payments/full_card_request.cc
@@ -246,6 +246,14 @@ // authentication. Exactly one of these fields must be populated. DCHECK_NE(!request_->user_response.cvc.empty(), request_->fido_assertion_info.has_value()); + + // Update the existing context token to the most up-to-date one received from + // the payments server. The context token in the response details can be an + // empty string for regular server cards. It will be populated in situations + // where the server needs to connect multiple steps of the unmasking flow + // together, such as in the case of virtual cards. + request_->context_token = response_details.context_token; + AutofillClient::PaymentsRpcCardType card_type = response_details.card_type; if (!request_->user_response.cvc.empty()) { AutofillMetrics::LogRealPanDuration(
diff --git a/components/autofill/core/browser/payments/full_card_request_unittest.cc b/components/autofill/core/browser/payments/full_card_request_unittest.cc index ffb7dd3..2b2a0f17 100644 --- a/components/autofill/core/browser/payments/full_card_request_unittest.cc +++ b/components/autofill/core/browser/payments/full_card_request_unittest.cc
@@ -523,7 +523,7 @@ // If the server provides an empty PAN with VCN_RETRIEVAL_TRY_AGAIN_FAILURE // error, FullCardRequest::Delegate::OnFullCardRequestFailed() should be // invoked. -TEST_F(FullCardRequestTest, VcnRetrievalTryAgainFailure) { +TEST_F(FullCardRequestTest, VcnRetrievalTemporaryFailure) { EXPECT_CALL( *result_delegate(), OnFullCardRequestFailed(FullCardRequest::FailureType:: @@ -654,6 +654,49 @@ card_unmask_delegate()->OnUnmaskPromptClosed(); } +// If the server provides an empty PAN with TRY_AGAIN_FAILURE for virtual card, +// ensure it is handled the same way as a regular try again case. +TEST_F(FullCardRequestTest, VcnTryAgainFailure) { + EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _)).Times(1); + EXPECT_CALL(*ui_delegate(), + OnUnmaskVerificationResult( + AutofillClient::PaymentsRpcResult::kTryAgainFailure)) + .Times(1); + + CreditCard virtual_card; + virtual_card.set_record_type(CreditCard::RecordType::VIRTUAL_CARD); + virtual_card.set_server_id("server_id"); + request()->GetFullVirtualCardViaCVC( + virtual_card, AutofillClient::UnmaskCardReason::kAutofill, + result_delegate()->AsWeakPtr(), ui_delegate()->AsWeakPtr(), + GURL("https://example.com/"), "test_vcn_context_token", + CardUnmaskChallengeOption{.id = "test_challenge_option_id", + .type = CardUnmaskChallengeOptionType::kCvc}); + CardUnmaskDelegate::UserProvidedUnmaskDetails user_provided_details; + user_provided_details.cvc = u"321"; + card_unmask_delegate()->OnUnmaskPromptAccepted(user_provided_details); + PaymentsClient::UnmaskResponseDetails response_details; + response_details.card_type = + AutofillClient::PaymentsRpcCardType::kVirtualCard; + response_details.context_token = "test_vcn_context_token"; + request()->OnDidGetRealPan( + AutofillClient::PaymentsRpcResult::kTryAgainFailure, response_details); + EXPECT_EQ(request()->GetUnmaskRequestDetailsForTesting()->context_token, + "test_vcn_context_token"); + EXPECT_EQ(request() + ->GetUnmaskRequestDetailsForTesting() + ->selected_challenge_option->id, + "test_challenge_option_id"); + EXPECT_EQ(request() + ->GetUnmaskRequestDetailsForTesting() + ->selected_challenge_option->type, + CardUnmaskChallengeOptionType::kCvc); + EXPECT_EQ(request() + ->GetUnmaskRequestDetailsForTesting() + ->last_committed_primary_main_frame_origin->spec(), + "https://example.com/"); +} + // Verify updating expiration date for a masked server card. TEST_F(FullCardRequestTest, UpdateExpDateForMaskedServerCard) { EXPECT_CALL(*result_delegate(), OnFullCardRequestSucceeded(
diff --git a/components/feature_engagement/public/feature_configurations.cc b/components/feature_engagement/public/feature_configurations.cc index de343bb7..4e860ee 100644 --- a/components/feature_engagement/public/feature_configurations.cc +++ b/components/feature_engagement/public/feature_configurations.cc
@@ -198,6 +198,18 @@ return config; } + if (kIPHPriceTrackingPageActionIconLabelFeature.name == feature->name) { + absl::optional<FeatureConfig> config = FeatureConfig(); + config->valid = true; + config->availability = Comparator(ANY, 0); + config->session_rate = Comparator(ANY, 0); + // Show the promo once per day. + config->trigger = + EventConfig("price_tracking_page_action_icon_label_in_trigger", + Comparator(LESS_THAN, 1), 1, 360); + return config; + } + #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || // BUILDFLAG(IS_CHROMEOS)
diff --git a/components/feature_engagement/public/feature_constants.cc b/components/feature_engagement/public/feature_constants.cc index 99a9eda..330b27d 100644 --- a/components/feature_engagement/public/feature_constants.cc +++ b/components/feature_engagement/public/feature_constants.cc
@@ -61,6 +61,9 @@ BASE_FEATURE(kIPHPerformanceNewBadgeFeature, "IPH_PerformanceNewBadge", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kIPHPriceTrackingPageActionIconLabelFeature, + "IPH_PriceTrackingPageActionIconLabelFeature", + base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kIPHReadingListDiscoveryFeature, "IPH_ReadingListDiscovery", base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/components/feature_engagement/public/feature_constants.h b/components/feature_engagement/public/feature_constants.h index ad22881..99e1cb0 100644 --- a/components/feature_engagement/public/feature_constants.h +++ b/components/feature_engagement/public/feature_constants.h
@@ -45,6 +45,7 @@ BASE_DECLARE_FEATURE(kIPHTabAudioMutingFeature); BASE_DECLARE_FEATURE(kIPHPasswordsAccountStorageFeature); BASE_DECLARE_FEATURE(kIPHPerformanceNewBadgeFeature); +BASE_DECLARE_FEATURE(kIPHPriceTrackingPageActionIconLabelFeature); BASE_DECLARE_FEATURE(kIPHReadingListDiscoveryFeature); BASE_DECLARE_FEATURE(kIPHReadingListEntryPointFeature); BASE_DECLARE_FEATURE(kIPHIntentChipFeature);
diff --git a/components/feature_engagement/public/feature_list.cc b/components/feature_engagement/public/feature_list.cc index 717c67d..c91c8b5 100644 --- a/components/feature_engagement/public/feature_list.cc +++ b/components/feature_engagement/public/feature_list.cc
@@ -131,6 +131,7 @@ &kIPHTabAudioMutingFeature, &kIPHPasswordsAccountStorageFeature, &kIPHPerformanceNewBadgeFeature, + &kIPHPriceTrackingPageActionIconLabelFeature, &kIPHReadingListDiscoveryFeature, &kIPHReadingListEntryPointFeature, &kIPHReadingListInSidePanelFeature,
diff --git a/components/feature_engagement/public/feature_list.h b/components/feature_engagement/public/feature_list.h index 8431ce6..572eeff 100644 --- a/components/feature_engagement/public/feature_list.h +++ b/components/feature_engagement/public/feature_list.h
@@ -233,6 +233,8 @@ "IPH_PasswordsAccountStorage"); DEFINE_VARIATION_PARAM(kIPHPerformanceNewBadgeFeature, "IPH_PerformanceNewBadge"); +DEFINE_VARIATION_PARAM(kIPHPriceTrackingPageActionIconLabelFeature, + "IPH_PriceTrackingPageActionIconLabelFeature"); DEFINE_VARIATION_PARAM(kIPHReadingListDiscoveryFeature, "IPH_ReadingListDiscovery"); DEFINE_VARIATION_PARAM(kIPHReadingListEntryPointFeature, @@ -377,6 +379,7 @@ VARIATION_ENTRY(kIPHLiveCaption), VARIATION_ENTRY(kIPHPasswordsAccountStorageFeature), VARIATION_ENTRY(kIPHPerformanceNewBadgeFeature), + VARIATION_ENTRY(kIPHPriceTrackingPageActionIconLabelFeature), VARIATION_ENTRY(kIPHReadingListDiscoveryFeature), VARIATION_ENTRY(kIPHReadingListEntryPointFeature), VARIATION_ENTRY(kIPHReadingListInSidePanelFeature),
diff --git a/components/feed/BUILD.gn b/components/feed/BUILD.gn index 8ad5afb..62db2ad 100644 --- a/components/feed/BUILD.gn +++ b/components/feed/BUILD.gn
@@ -32,6 +32,7 @@ sources = [ "feed_feature_list_unittest.cc" ] deps = [ ":feature_list", + "core/common:feed_core_common_unit_tests", "core/v2:core_unit_tests", "//base", "//base/test:test_support",
diff --git a/components/feed/core/common/BUILD.gn b/components/feed/core/common/BUILD.gn index 2fb22043..a8ac913 100644 --- a/components/feed/core/common/BUILD.gn +++ b/components/feed/core/common/BUILD.gn
@@ -18,3 +18,16 @@ "//components/feed:feature_list", ] } + +source_set("feed_core_common_unit_tests") { + testonly = true + sources = [ "pref_names_unittest.cc" ] + + # public_deps = [ ":test_helpers" ] + deps = [ + ":feed_core_common", + "//base", + "//components/prefs:test_support", + "//testing/gtest", + ] +}
diff --git a/components/feed/core/common/pref_names.cc b/components/feed/core/common/pref_names.cc index 71e4c51..d3c503d 100644 --- a/components/feed/core/common/pref_names.cc +++ b/components/feed/core/common/pref_names.cc
@@ -38,7 +38,6 @@ const char kClientInstanceId[] = "feedv2.client_instance_id"; // This pref applies to all discover APIs despite the string. const char kDiscoverAPIEndpointOverride[] = "feedv2.actions_endpoint_override"; -const char kExperiments[] = "feedv2.experiments"; const char kEnableWebFeedFollowIntroDebug[] = "webfeed_follow_intro_debug.enable"; const char kReliabilityLoggingIdSalt[] = "feedv2.reliability_logging_id_salt"; @@ -49,6 +48,10 @@ const char kInfoCardStates[] = "feed.info_card_states"; const char kHasSeenWebFeed[] = "webfeed.has_seen_feed"; const char kLastBadgeAnimationTime[] = "webfeed.last_badge_animation_time"; +const char kExperimentsV2[] = "feedv2.experiments_v2"; + +// Deprecated October 2022 +const char kExperimentsDeprecated[] = "feedv2.experiments"; } // namespace prefs @@ -64,6 +67,10 @@ registry->RegisterBooleanPref(kIsWebFeedSubscriber, false); } +void RegisterObsoletePrefsOct_2022(PrefRegistrySimple* registry) { + registry->RegisterDictionaryPref(prefs::kExperimentsDeprecated); +} + } // namespace void RegisterProfilePrefs(PrefRegistrySimple* registry) { @@ -84,7 +91,6 @@ registry->RegisterIntegerPref(feed::prefs::kNoticeCardViewsCount, 0); registry->RegisterIntegerPref(feed::prefs::kNoticeCardClicksCount, 0); - registry->RegisterDictionaryPref(feed::prefs::kExperiments); registry->RegisterBooleanPref(feed::prefs::kEnableWebFeedFollowIntroDebug, false); registry->RegisterUint64Pref(feed::prefs::kReliabilityLoggingIdSalt, 0); @@ -97,6 +103,7 @@ registry->RegisterBooleanPref(feed::prefs::kHasSeenWebFeed, false); registry->RegisterTimePref(feed::prefs::kLastBadgeAnimationTime, base::Time()); + registry->RegisterDictionaryPref(feed::prefs::kExperimentsV2); #if BUILDFLAG(IS_IOS) registry->RegisterBooleanPref(feed::prefs::kLastFetchHadLoggingEnabled, @@ -104,6 +111,7 @@ #endif // BUILDFLAG(IS_IOS) RegisterObsoletePrefsJune_2021(registry); + RegisterObsoletePrefsOct_2022(registry); } void MigrateObsoleteProfilePrefsJune_2021(PrefService* prefs) { @@ -111,4 +119,20 @@ prefs->ClearPref(kIsWebFeedSubscriber); } +void MigrateObsoleteProfilePrefsOct_2022(PrefService* prefs) { + const base::Value* val = + prefs->GetUserPrefValue(prefs::kExperimentsDeprecated); + const base::Value::Dict* old = val ? val->GetIfDict() : nullptr; + if (old) { + base::Value::Dict dict; + for (const auto kv : *old) { + base::Value::List list; + list.Append(kv.second.GetString()); + dict.Set(kv.first, std::move(list)); + } + prefs->SetDict(feed::prefs::kExperimentsV2, std::move(dict)); + } + prefs->ClearPref(prefs::kExperimentsDeprecated); +} + } // namespace feed
diff --git a/components/feed/core/common/pref_names.h b/components/feed/core/common/pref_names.h index 538b3054..bf78ba7 100644 --- a/components/feed/core/common/pref_names.h +++ b/components/feed/core/common/pref_names.h
@@ -65,8 +65,6 @@ extern const char kClientInstanceId[]; // The pref name for the Discover API endpoint override. extern const char kDiscoverAPIEndpointOverride[]; -// The pref name for storing the server experiments the client is in. -extern const char kExperiments[]; // If set to true, the WebFeed follow intro bypasses some gates and only checks // for recommended and scroll status. extern const char kEnableWebFeedFollowIntroDebug[]; @@ -88,12 +86,20 @@ extern const char kHasSeenWebFeed[]; // The pref name for when the user last saw badge animation for web feed. extern const char kLastBadgeAnimationTime[]; +// The pref name for storing the server experiments the client is in. +extern const char kExperimentsV2[]; + +// Deprecated prefs + +// The pref name for storing the server experiments the client is in. +extern const char kExperimentsDeprecated[]; } // namespace prefs void RegisterProfilePrefs(PrefRegistrySimple* registry); void MigrateObsoleteProfilePrefsFeb_2021(PrefService* prefs); void MigrateObsoleteProfilePrefsJune_2021(PrefService* prefs); +void MigrateObsoleteProfilePrefsOct_2022(PrefService* prefs); } // namespace feed
diff --git a/components/feed/core/common/pref_names_unittest.cc b/components/feed/core/common/pref_names_unittest.cc new file mode 100644 index 0000000..2d99467 --- /dev/null +++ b/components/feed/core/common/pref_names_unittest.cc
@@ -0,0 +1,40 @@ +// 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/common/pref_names.h" + +#include <string> + +#include "base/values.h" +#include "components/prefs/testing_pref_service.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace feed { + +class PrefNamesTest : public testing::Test { + protected: + PrefNamesTest() { feed::RegisterProfilePrefs(prefs_.registry()); } + + TestingPrefServiceSimple prefs_; +}; + +TEST_F(PrefNamesTest, MigrateExperiments) { + base::Value::Dict dict; + dict.Set("Trial1", "Group1"); + base::Value::Dict expected; + base::Value::List group_list; + group_list.Append("Group1"); + expected.Set("Trial1", std::move(group_list)); + + // Set the old prefs dictionary. + prefs_.SetDict(prefs::kExperimentsDeprecated, std::move(dict)); + + // Migrate the prefs. + MigrateObsoleteProfilePrefsOct_2022(&prefs_); + + ASSERT_TRUE(prefs_.HasPrefPath(prefs::kExperimentsV2)); + EXPECT_EQ(expected, prefs_.GetDict(prefs::kExperimentsV2)); +} + +} // namespace feed
diff --git a/components/feed/core/proto/v2/wire/chrome_feed_response_metadata.proto b/components/feed/core/proto/v2/wire/chrome_feed_response_metadata.proto index bf2345b..12baa83d 100644 --- a/components/feed/core/proto/v2/wire/chrome_feed_response_metadata.proto +++ b/components/feed/core/proto/v2/wire/chrome_feed_response_metadata.proto
@@ -19,4 +19,5 @@ message Experiment { optional string trial_name = 1; optional string group_name = 2; + optional string experiment_id = 3; }
diff --git a/components/feed/core/v2/BUILD.gn b/components/feed/core/v2/BUILD.gn index 8c00477..b4974a7 100644 --- a/components/feed/core/v2/BUILD.gn +++ b/components/feed/core/v2/BUILD.gn
@@ -212,6 +212,7 @@ "metrics_reporter_unittest.cc", "operation_token_unittest.cc", "persistent_key_value_store_impl_unittest.cc", + "prefs_unittest.cc", "proto_util_unittest.cc", "protocol_translator_unittest.cc", "public/feed_service_unittest.cc",
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 3402358d..3411d155 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
@@ -2600,8 +2600,10 @@ TEST_F(FeedApiTest, ExperimentsAreClearedOnClearAll) { Experiments e; - e["Trial1"] = "Group1"; - e["Trial2"] = "Group2"; + std::vector<std::string> group_list1{"Group1"}; + std::vector<std::string> group_list2{"Group2"}; + e["Trial1"] = group_list1; + e["Trial2"] = group_list2; prefs::SetExperiments(e, profile_prefs_); stream_->OnCacheDataCleared(); // triggers ClearAll().
diff --git a/components/feed/core/v2/prefs.cc b/components/feed/core/v2/prefs.cc index 92e2bbf..4b8fa90 100644 --- a/components/feed/core/v2/prefs.cc +++ b/components/feed/core/v2/prefs.cc
@@ -105,16 +105,24 @@ void SetExperiments(const Experiments& experiments, PrefService& pref_service) { base::Value::Dict dict; for (const auto& exp : experiments) { - dict.Set(exp.first, exp.second); + base::Value::List list; + for (auto elem : exp.second) { + list.Append(elem); + } + dict.Set(exp.first, std::move(list)); } - pref_service.SetDict(kExperiments, std::move(dict)); + pref_service.SetDict(kExperimentsV2, std::move(dict)); } Experiments GetExperiments(PrefService& pref_service) { - const auto& value = pref_service.GetDict(kExperiments); + const auto& dict = pref_service.GetDict(kExperimentsV2); Experiments experiments; - for (auto kv : value) { - experiments[kv.first] = kv.second.GetString(); + for (auto kv : dict) { + std::vector<std::string> vect; + for (const auto& v : kv.second.GetList()) { + vect.push_back(v.GetString()); + } + experiments[kv.first] = vect; } return experiments; }
diff --git a/components/feed/core/v2/prefs_unittest.cc b/components/feed/core/v2/prefs_unittest.cc new file mode 100644 index 0000000..faf330db --- /dev/null +++ b/components/feed/core/v2/prefs_unittest.cc
@@ -0,0 +1,35 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/feed/core/v2/prefs.h" + +#include <string> +#include <vector> + +#include "components/feed/core/common/pref_names.h" +#include "components/feed/core/v2/types.h" +#include "components/prefs/testing_pref_service.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace feed { + +class FeedPrefsTest : public testing::Test { + protected: + FeedPrefsTest() { feed::RegisterProfilePrefs(prefs_.registry()); } + + TestingPrefServiceSimple prefs_; +}; + +TEST_F(FeedPrefsTest, TestSetAndGetExperiments) { + Experiments e; + std::vector<std::string> group_list{"Group1"}; + e["Trial1"] = group_list; + + prefs::SetExperiments(e, prefs_); + + ASSERT_TRUE(prefs_.HasPrefPath(prefs::kExperimentsV2)); + EXPECT_EQ(e, prefs::GetExperiments(prefs_)); +} + +} // namespace feed
diff --git a/components/feed/core/v2/protocol_translator.cc b/components/feed/core/v2/protocol_translator.cc index ec30a28..1923b65 100644 --- a/components/feed/core/v2/protocol_translator.cc +++ b/components/feed/core/v2/protocol_translator.cc
@@ -21,6 +21,7 @@ #include "components/feed/core/v2/feedstore_util.h" #include "components/feed/core/v2/metrics_reporter.h" #include "components/feed/core/v2/proto_util.h" +#include "components/feed/feed_feature_list.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace feed { @@ -364,11 +365,33 @@ absl::optional<Experiments> experiments = absl::nullopt; if (chrome_response_metadata.experiments_size() > 0) { + // Set up the Experiments map that contains the trial -> list of groups. Experiments e; for (feedwire::Experiment exp : chrome_response_metadata.experiments()) { - e[exp.trial_name()] = exp.group_name(); + if (exp.has_trial_name() && exp.has_group_name()) { + // Extract experiment in response that contains both trial and + // group names. + if (e.find(exp.trial_name()) != e.end()) { + e[exp.trial_name()].push_back(exp.group_name()); + } else { + std::vector<std::string> v{exp.group_name()}; + e[exp.trial_name()] = v; + } + } else if (exp.has_experiment_id() && + base::FeatureList::IsEnabled(kFeedExperimentIDTagging)) { + // Extract experiment in response that contains an experiment ID. + std::string trial_name = + exp.has_trial_name() ? exp.trial_name() : kDiscoverFeedExperiments; + if (e.find(trial_name) != e.end()) { + e[trial_name].push_back(exp.experiment_id()); + } else { + std::vector<std::string> v{exp.experiment_id()}; + e[trial_name] = v; + } + } } - experiments = std::move(e); + if (!e.empty()) + experiments = std::move(e); } MetricsReporter::ActivityLoggingEnabled(
diff --git a/components/feed/core/v2/protocol_translator.h b/components/feed/core/v2/protocol_translator.h index edf7593..72a497a 100644 --- a/components/feed/core/v2/protocol_translator.h +++ b/components/feed/core/v2/protocol_translator.h
@@ -20,6 +20,8 @@ namespace feed { +constexpr const char kDiscoverFeedExperiments[] = "DiscoverFeedExperiments"; + // Data for updating StreamModel. This can be sourced from the network or // persistent storage. struct StreamModelUpdateRequest {
diff --git a/components/feed/core/v2/protocol_translator_unittest.cc b/components/feed/core/v2/protocol_translator_unittest.cc index 069a4a1..d2dc21f 100644 --- a/components/feed/core/v2/protocol_translator_unittest.cc +++ b/components/feed/core/v2/protocol_translator_unittest.cc
@@ -15,11 +15,13 @@ #include "base/path_service.h" #include "base/strings/string_number_conversions.h" #include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_feature_list.h" #include "base/time/time.h" #include "components/feed/core/proto/v2/wire/feed_response.pb.h" #include "components/feed/core/proto/v2/wire/response.pb.h" #include "components/feed/core/v2/proto_util.h" #include "components/feed/core/v2/test/proto_printer.h" +#include "components/feed/feed_feature_list.h" #include "testing/gtest/include/gtest/gtest.h" namespace feed { @@ -108,7 +110,22 @@ } // namespace -TEST(ProtocolTranslatorTest, NextPageToken) { +class ProtocolTranslatorTest : public testing::Test { + public: + ProtocolTranslatorTest() = default; + ProtocolTranslatorTest(ProtocolTranslatorTest&) = delete; + ProtocolTranslatorTest& operator=(const ProtocolTranslatorTest&) = delete; + ~ProtocolTranslatorTest() override = default; + + void SetUp() override { + feature_list_.InitAndEnableFeature(kFeedExperimentIDTagging); + } + + protected: + base::test::ScopedFeatureList feature_list_; +}; + +TEST_F(ProtocolTranslatorTest, NextPageToken) { feedwire::Response response = EmptyWireResponse(); feedwire::DataOperation* operation = response.mutable_feed_response()->add_data_operation(); @@ -125,12 +142,12 @@ translated.model_update_request->stream_data.next_page_token()); } -TEST(ProtocolTranslatorTest, EmptyResponse) { +TEST_F(ProtocolTranslatorTest, EmptyResponse) { feedwire::Response response = EmptyWireResponse(); EXPECT_TRUE(TranslateWireResponse(response).model_update_request); } -TEST(ProtocolTranslatorTest, RootEventIdPresent) { +TEST_F(ProtocolTranslatorTest, RootEventIdPresent) { feedwire::Response response = EmptyWireResponse(); response.mutable_feed_response() ->mutable_feed_response_metadata() @@ -144,14 +161,14 @@ .SerializeAsString()); } -TEST(ProtocolTranslatorTest, RootEventIdNotPresent) { +TEST_F(ProtocolTranslatorTest, RootEventIdNotPresent) { feedwire::Response response = EmptyWireResponse(); EXPECT_EQ(TranslateWireResponse(response) .model_update_request->stream_data.root_event_id(), ""); } -TEST(ProtocolTranslatorTest, WasSignedInRequest) { +TEST_F(ProtocolTranslatorTest, WasSignedInRequest) { feedwire::Response response = EmptyWireResponse(); for (AccountInfo account_info : @@ -163,7 +180,7 @@ } } -TEST(ProtocolTranslatorTest, ActivityLoggingEnabled) { +TEST_F(ProtocolTranslatorTest, ActivityLoggingEnabled) { feedwire::Response response = EmptyWireResponse(); for (bool logging_enabled_state : {true, false}) { response.mutable_feed_response() @@ -183,7 +200,7 @@ } } -TEST(ProtocolTranslatorTest, PrivacyNoticeFulfilled) { +TEST_F(ProtocolTranslatorTest, PrivacyNoticeFulfilled) { feedwire::Response response = EmptyWireResponse(); for (bool privacy_notice_fulfilled_state : {true, false}) { response.mutable_feed_response() @@ -203,9 +220,10 @@ } } -TEST(ProtocolTranslatorTest, ExperimentsAreTranslated) { +TEST_F(ProtocolTranslatorTest, ExperimentsAreTranslated) { Experiments expected; - expected["Trial1"] = "Group1"; + std::vector<std::string> group_list{"Group1"}; + expected["Trial1"] = group_list; feedwire::Response response = EmptyWireResponse(); auto* exp = response.mutable_feed_response() @@ -221,13 +239,84 @@ EXPECT_EQ(refresh.experiments.value(), expected); } -TEST(ProtocolTranslatorTest, MissingResponseVersion) { +TEST_F(ProtocolTranslatorTest, ExperimentsAreTranslatedIDTaggingEnabled) { + Experiments expected; + std::vector<std::string> group_list1{"ID1"}; + std::vector<std::string> group_list2{"ID2"}; + expected[kDiscoverFeedExperiments] = group_list1; + expected["Trial1"] = group_list2; + + feedwire::Response response = EmptyWireResponse(); + auto* exp1 = response.mutable_feed_response() + ->mutable_feed_response_metadata() + ->mutable_chrome_feed_response_metadata() + ->add_experiments(); + exp1->set_experiment_id("ID1"); + auto* exp2 = response.mutable_feed_response() + ->mutable_feed_response_metadata() + ->mutable_chrome_feed_response_metadata() + ->add_experiments(); + exp2->set_trial_name("Trial1"); + exp2->set_experiment_id("ID2"); + + RefreshResponseData refresh = TranslateWireResponse(response); + ASSERT_TRUE(refresh.experiments.has_value()); + + EXPECT_EQ(refresh.experiments.value(), expected); +} + +TEST_F(ProtocolTranslatorTest, ExperimentsAreTranslatedIDTaggingDisabled) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndDisableFeature(kFeedExperimentIDTagging); + Experiments expected; + std::vector<std::string> group_list{"Group1"}; + expected["Trial1"] = group_list; + + feedwire::Response response = EmptyWireResponse(); + auto* exp1 = response.mutable_feed_response() + ->mutable_feed_response_metadata() + ->mutable_chrome_feed_response_metadata() + ->add_experiments(); + exp1->set_trial_name("Trial1"); + exp1->set_group_name("Group1"); + + auto* exp2 = response.mutable_feed_response() + ->mutable_feed_response_metadata() + ->mutable_chrome_feed_response_metadata() + ->add_experiments(); + exp2->set_experiment_id("EXP_ID_NOT_TRANSLATED"); + auto* exp3 = response.mutable_feed_response() + ->mutable_feed_response_metadata() + ->mutable_chrome_feed_response_metadata() + ->add_experiments(); + exp3->set_trial_name("Trial_NOT_TRANSLATED"); + exp3->set_experiment_id("EXP_ID_NOT_TRANSLATED"); + + RefreshResponseData refresh = TranslateWireResponse(response); + ASSERT_TRUE(refresh.experiments.has_value()); + + EXPECT_EQ(refresh.experiments.value(), expected); +} + +TEST_F(ProtocolTranslatorTest, ExperimentsAreNotTranslatedGroupAndIDMissing) { + feedwire::Response response = EmptyWireResponse(); + auto* exp1 = response.mutable_feed_response() + ->mutable_feed_response_metadata() + ->mutable_chrome_feed_response_metadata() + ->add_experiments(); + exp1->set_trial_name("Trial1"); + + RefreshResponseData refresh = TranslateWireResponse(response); + ASSERT_FALSE(refresh.experiments.has_value()); +} + +TEST_F(ProtocolTranslatorTest, MissingResponseVersion) { feedwire::Response response = EmptyWireResponse(); response.set_response_version(feedwire::Response::UNKNOWN_RESPONSE_VERSION); EXPECT_FALSE(TranslateWireResponse(response).model_update_request); } -TEST(ProtocolTranslatorTest, TranslateContent) { +TEST_F(ProtocolTranslatorTest, TranslateContent) { feedwire::DataOperation wire_operation = MakeDataOperationWithContent(feedwire::DataOperation::UPDATE_OR_APPEND); absl::optional<feedstore::DataOperation> translated = @@ -239,14 +328,14 @@ translated->content().prefetch_metadata(0).uri()); } -TEST(ProtocolTranslatorTest, TranslateContentFailsWhenMissingContent) { +TEST_F(ProtocolTranslatorTest, TranslateContentFailsWhenMissingContent) { feedwire::DataOperation wire_operation = MakeDataOperationWithContent(feedwire::DataOperation::UPDATE_OR_APPEND); wire_operation.mutable_feature()->clear_content(); EXPECT_FALSE(TranslateDataOperation(wire_operation)); } -TEST(ProtocolTranslatorTest, TranslateRenderData) { +TEST_F(ProtocolTranslatorTest, TranslateRenderData) { feedwire::Response wire_response = EmptyWireResponse(); *wire_response.mutable_feed_response()->add_data_operation() = MakeDataOperationWithRenderData( @@ -259,7 +348,7 @@ translated.model_update_request->shared_states[0].shared_state_data()); } -TEST(ProtocolTranslatorTest, TranslateContentLifetime) { +TEST_F(ProtocolTranslatorTest, TranslateContentLifetime) { feedwire::Response wire_response = EmptyWireResponse(); feedwire::ContentLifetime* content_lifetime = wire_response.mutable_feed_response() @@ -275,13 +364,13 @@ content_lifetime->invalid_age_ms()); } -TEST(ProtocolTranslatorTest, TranslateMissingContentLifetime) { +TEST_F(ProtocolTranslatorTest, TranslateMissingContentLifetime) { feedwire::Response wire_response = EmptyWireResponse(); RefreshResponseData translated = TranslateWireResponse(wire_response); EXPECT_FALSE(translated.content_lifetime.has_value()); } -TEST(ProtocolTranslatorTest, TranslateRenderDataFailsWithUnknownType) { +TEST_F(ProtocolTranslatorTest, TranslateRenderDataFailsWithUnknownType) { feedwire::Response wire_response = EmptyWireResponse(); feedwire::DataOperation wire_operation = MakeDataOperationWithRenderData( feedwire::DataOperation::UPDATE_OR_APPEND); @@ -294,19 +383,19 @@ ASSERT_EQ(0ul, translated.model_update_request->shared_states.size()); } -TEST(ProtocolTranslatorTest, RenderDataOperationCanOnlyComeFromFullResponse) { +TEST_F(ProtocolTranslatorTest, RenderDataOperationCanOnlyComeFromFullResponse) { EXPECT_FALSE(TranslateDataOperation(MakeDataOperationWithRenderData( feedwire::DataOperation::UPDATE_OR_APPEND))); } -TEST(ProtocolTranslatorTest, TranslateOperationFailsWithNoPayload) { +TEST_F(ProtocolTranslatorTest, TranslateOperationFailsWithNoPayload) { feedwire::DataOperation wire_operation = MakeDataOperationWithContent(feedwire::DataOperation::UPDATE_OR_APPEND); wire_operation.clear_feature(); EXPECT_FALSE(TranslateDataOperation(wire_operation)); } -TEST(ProtocolTranslatorTest, TranslateOperationWithoutContentId) { +TEST_F(ProtocolTranslatorTest, TranslateOperationWithoutContentId) { feedwire::DataOperation update_operation = MakeDataOperationWithContent(feedwire::DataOperation::UPDATE_OR_APPEND); update_operation.clear_metadata(); @@ -323,13 +412,13 @@ EXPECT_TRUE(TranslateDataOperation(clear_operation)); } -TEST(ProtocolTranslatorTest, TranslateOperationFailsWithUnknownOperation) { +TEST_F(ProtocolTranslatorTest, TranslateOperationFailsWithUnknownOperation) { feedwire::DataOperation wire_operation = MakeDataOperation(feedwire::DataOperation::UNKNOWN_OPERATION); EXPECT_FALSE(TranslateDataOperation(wire_operation)); } -TEST(ProtocolTranslatorTest, TranslateRealResponse) { +TEST_F(ProtocolTranslatorTest, TranslateRealResponse) { // Tests how proto translation works on a real response from the server. // // The response will periodically need to be updated as changes are made to @@ -765,7 +854,7 @@ EXPECT_EQ(want, ss.str()); } -TEST(TranslateDismissData, Success) { +TEST_F(ProtocolTranslatorTest, TranslateDismissData) { feedpacking::DismissData input; *input.add_data_operations() = MakeDataOperation(feedwire::DataOperation::CLEAR_ALL);
diff --git a/components/feed/core/v2/public/types.h b/components/feed/core/v2/public/types.h index 74feddd17..b8da4b2 100644 --- a/components/feed/core/v2/public/types.h +++ b/components/feed/core/v2/public/types.h
@@ -8,6 +8,7 @@ #include <iosfwd> #include <map> #include <string> +#include <vector> #include "base/strings/string_piece.h" #include "base/time/time.h" @@ -72,9 +73,9 @@ using SurfaceId = base::IdTypeU32<class SurfaceIdClass>; using ImageFetchId = base::IdTypeU32<class ImageFetchIdClass>; -// A map of trial names (key) to group names (value) that is +// A map of trial names (key) and list of group names/IDs (value) // sent from the server. -typedef std::map<std::string, std::string> Experiments; +typedef std::map<std::string, std::vector<std::string>> Experiments; struct NetworkResponseInfo { NetworkResponseInfo();
diff --git a/components/feed/feed_feature_list.cc b/components/feed/feed_feature_list.cc index b40d02ba..49bced3 100644 --- a/components/feed/feed_feature_list.cc +++ b/components/feed/feed_feature_list.cc
@@ -195,5 +195,8 @@ const base::FeatureParam<double> kSliceVisibleCoverageThreshold{ &kClientGoodVisits, "slice_coverage_threshold", 0.25f}; +BASE_FEATURE(kFeedExperimentIDTagging, + "FeedExperimentIDTagging", + base::FEATURE_ENABLED_BY_DEFAULT); } // namespace feed
diff --git a/components/feed/feed_feature_list.h b/components/feed/feed_feature_list.h index a3be964..61d66cd1 100644 --- a/components/feed/feed_feature_list.h +++ b/components/feed/feed_feature_list.h
@@ -170,6 +170,9 @@ // visits. extern const base::FeatureParam<double> kSliceVisibleCoverageThreshold; +// When enabled, allow tagging experiments with only an experiment ID. +BASE_DECLARE_FEATURE(kFeedExperimentIDTagging); + } // namespace feed #endif // COMPONENTS_FEED_FEED_FEATURE_LIST_H_
diff --git a/components/omnibox/browser/autocomplete_match.h b/components/omnibox/browser/autocomplete_match.h index 5555410..3d20a2e 100644 --- a/components/omnibox/browser/autocomplete_match.h +++ b/components/omnibox/browser/autocomplete_match.h
@@ -664,6 +664,8 @@ GURL image_url; // Optional entity id for entity suggestions. Empty string means no entity ID. + // This is not meant for display, but internal use only. The actual UI display + // is controlled by the `type` and `image_url`. std::string entity_id; // Optional override to use for types that specify an icon sub-type.
diff --git a/components/omnibox/browser/autocomplete_result.cc b/components/omnibox/browser/autocomplete_result.cc index 7203846..f22245d7 100644 --- a/components/omnibox/browser/autocomplete_result.cc +++ b/components/omnibox/browser/autocomplete_result.cc
@@ -249,7 +249,8 @@ // `SetAllowedToBeDefault()` here is only intended to make // `allowed_to_be_default` more conservative (true -> false, not vice versa). static bool prevent_default_previous_matches = - OmniboxFieldTrial::kPreventDefaultPreviousMatches.Get(); + OmniboxFieldTrial::kAutocompleteStabilityPreventDefaultPreviousMatches + .Get(); for (auto& m : matches_) { if (!m.from_previous) continue; @@ -321,7 +322,8 @@ // Don't preserve suggestions that are not default-able; e.g., // typing 'xy' shouldn't preserve default 'xz.com/xy'. static bool prevent_default_previous_matches = - OmniboxFieldTrial::kPreventDefaultPreviousMatches.Get(); + OmniboxFieldTrial:: + kAutocompleteStabilityPreventDefaultPreviousMatches.Get(); return default_match_fields == GetMatchComparisonFields(match) && preserve_default_match->fill_into_edit == match.fill_into_edit && @@ -777,6 +779,13 @@ AutocompleteMatch non_entity_match_copy = *non_entity_it; top_match->duplicate_matches.erase(non_entity_it); + // When we spawn our non-entity match copy, we still want to preserve any + // entity ID that was provided by the server for logging purposes, even if + // we don't display it. + if (non_entity_match_copy.entity_id.empty()) { + non_entity_match_copy.entity_id = top_match->entity_id; + } + // Promote the non-entity match to the top, then immediately return, since // all our iterators are invalid after the insertion. matches->insert(matches->begin(), std::move(non_entity_match_copy));
diff --git a/components/omnibox/browser/autocomplete_result_unittest.cc b/components/omnibox/browser/autocomplete_result_unittest.cc index f39c987..bab90b0 100644 --- a/components/omnibox/browser/autocomplete_result_unittest.cc +++ b/components/omnibox/browser/autocomplete_result_unittest.cc
@@ -1551,6 +1551,9 @@ matches[0].duplicate_matches.push_back(matches.back()); matches.pop_back(); + // Simulate the top match having an `entity_id`. + matches[0].entity_id = "/m/012abc"; + AutocompleteInput input(u"f", metrics::OmniboxEventProto::OTHER, TestSchemeClassifier()); AutocompleteResult result; @@ -1566,6 +1569,8 @@ EXPECT_EQ(match->relevance, 900); EXPECT_TRUE(match->allowed_to_be_default_match); EXPECT_EQ(match->stripped_destination_url.spec(), "http://search/?q=foo"); + // Expect that the Entity's ID was merged over to the plain match equivalent. + EXPECT_EQ(match->entity_id, "/m/012abc"); match = result.match_at(1); // The search entity suggestion should be ranked higher than the higher @@ -1576,12 +1581,14 @@ EXPECT_EQ(match->relevance, 1000); EXPECT_TRUE(match->allowed_to_be_default_match); EXPECT_EQ(match->stripped_destination_url.spec(), "http://search/?q=foo"); + EXPECT_EQ(match->entity_id, "/m/012abc"); match = result.match_at(2); EXPECT_EQ(match->type, AutocompleteMatchType::SEARCH_SUGGEST); EXPECT_EQ(match->relevance, 1200); EXPECT_FALSE(match->allowed_to_be_default_match); EXPECT_EQ(match->stripped_destination_url.spec(), "http://search/?q=foo2"); + EXPECT_TRUE(match->entity_id.empty()); } TEST_F(AutocompleteResultTest,
diff --git a/components/omnibox/browser/base_search_provider.cc b/components/omnibox/browser/base_search_provider.cc index 6f7260c..f3d87e81 100644 --- a/components/omnibox/browser/base_search_provider.cc +++ b/components/omnibox/browser/base_search_provider.cc
@@ -383,6 +383,7 @@ match.keyword = template_url->keyword(); match.image_dominant_color = suggestion.image_dominant_color(); match.image_url = suggestion.image_url(); + match.entity_id = suggestion.entity_id(); match.contents = suggestion.match_contents(); match.contents_class = suggestion.match_contents_class(); match.suggestion_group_id = suggestion.suggestion_group_id();
diff --git a/components/omnibox/browser/omnibox_field_trial.cc b/components/omnibox/browser/omnibox_field_trial.cc index 8900cdb..2ab0c9e 100644 --- a/components/omnibox/browser/omnibox_field_trial.cc +++ b/components/omnibox/browser/omnibox_field_trial.cc
@@ -745,14 +745,15 @@ &omnibox::kPreserveDefault, "AutocompleteStabilityPreserveDefaultForAsyncUpdates", true); +const base::FeatureParam<bool> + kAutocompleteStabilityPreventDefaultPreviousMatches( + &omnibox::kPreserveDefault, + "AutocompleteStabilityPreventDefaultPreviousMatches", + false); const base::FeatureParam<bool> kAutocompleteStabilityDontCopyDoneProviders( &omnibox::kAutocompleteStability, "AutocompleteStabilityDontCopyDoneProviders", false); -const base::FeatureParam<bool> kPreventDefaultPreviousMatches( - &omnibox::kAutocompleteStability, - "AutocompleteStabilityPreventDefaultPreviousMatches", - false); const base::FeatureParam<bool> kAutocompleteStabilityAsyncProvidersFirst( &omnibox::kAutocompleteStability, "AutocompleteStabilityAsyncProvidersFirst",
diff --git a/components/omnibox/browser/omnibox_field_trial.h b/components/omnibox/browser/omnibox_field_trial.h index 5eb9e0f..861ef20 100644 --- a/components/omnibox/browser/omnibox_field_trial.h +++ b/components/omnibox/browser/omnibox_field_trial.h
@@ -492,14 +492,15 @@ // updates. True by default. extern const base::FeatureParam<bool> kAutocompleteStabilityPreserveDefaultForAsyncUpdates; +// If enabled, transferred matches from the previous input are not allowed to +// be default. +extern const base::FeatureParam<bool> + kAutocompleteStabilityPreventDefaultPreviousMatches; // Matches from the previous input are temporarily copied to carry over the // suggestions until the new input's suggestions are ready. If enabled, only // providers whose suggestions are pending have their old matches copied over. extern const base::FeatureParam<bool> kAutocompleteStabilityDontCopyDoneProviders; -// If enabled, transferred matches from the previous input are not allowed to -// be default. -extern const base::FeatureParam<bool> kPreventDefaultPreviousMatches; // Begin async providers before sync providers so their async requests can // happen in parallel. This effects only the search, history_url, document, and // on device head providers.
diff --git a/components/services/app_service/public/cpp/BUILD.gn b/components/services/app_service/public/cpp/BUILD.gn index 59f01f7..91ec1d7 100644 --- a/components/services/app_service/public/cpp/BUILD.gn +++ b/components/services/app_service/public/cpp/BUILD.gn
@@ -68,7 +68,10 @@ defines = [ "IS_APP_TYPES_IMPL" ] - public_deps = [ "//components/services/app_service/public/mojom" ] + public_deps = [ + "//components/services/app_service/public/mojom", + "//components/services/app_service/public/protos", + ] deps = [ ":icon_types",
diff --git a/components/services/app_service/public/cpp/app_launch_util.cc b/components/services/app_service/public/cpp/app_launch_util.cc index 760cad50..9b4689f4 100644 --- a/components/services/app_service/public/cpp/app_launch_util.cc +++ b/components/services/app_service/public/cpp/app_launch_util.cc
@@ -8,6 +8,87 @@ WindowInfo::WindowInfo(int64_t display_id) : display_id(display_id) {} +ApplicationLaunchSource ConvertLaunchSourceToProtoApplicationLaunchSource( + LaunchSource launch_source) { + switch (launch_source) { + case LaunchSource::kUnknown: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_UNKNOWN; + case LaunchSource::kFromAppListGrid: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_APP_LIST_GRID; + case LaunchSource::kFromAppListGridContextMenu: + return ApplicationLaunchSource:: + APPLICATION_LAUNCH_SOURCE_APP_LIST_GRID_CONTEXT_MENU; + case LaunchSource::kFromAppListQuery: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_APP_LIST_QUERY; + case LaunchSource::kFromAppListQueryContextMenu: + return ApplicationLaunchSource:: + APPLICATION_LAUNCH_SOURCE_APP_LIST_QUERY_CONTEXT_MENU; + case LaunchSource::kFromAppListRecommendation: + return ApplicationLaunchSource:: + APPLICATION_LAUNCH_SOURCE_APP_LIST_RECOMMENDATION; + case LaunchSource::kFromParentalControls: + return ApplicationLaunchSource:: + APPLICATION_LAUNCH_SOURCE_PARENTAL_CONTROLS; + case LaunchSource::kFromShelf: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_SHELF; + case LaunchSource::kFromFileManager: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_FILE_MANAGER; + case LaunchSource::kFromLink: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_LINK; + case LaunchSource::kFromOmnibox: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_OMNIBOX; + case LaunchSource::kFromChromeInternal: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_CHROME_INTERNAL; + case LaunchSource::kFromKeyboard: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_KEYBOARD; + case LaunchSource::kFromOtherApp: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_OTHER_APP; + case LaunchSource::kFromMenu: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_MENU; + case LaunchSource::kFromInstalledNotification: + return ApplicationLaunchSource:: + APPLICATION_LAUNCH_SOURCE_INSTALLED_NOTIFICATION; + case LaunchSource::kFromTest: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_TEST; + case LaunchSource::kFromArc: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_ARC; + case LaunchSource::kFromSharesheet: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_SHARESHEET; + case LaunchSource::kFromReleaseNotesNotification: + return ApplicationLaunchSource:: + APPLICATION_LAUNCH_SOURCE_RELEASE_NOTES_NOTIFICATION; + case LaunchSource::kFromFullRestore: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_FULL_RESTORE; + case LaunchSource::kFromSmartTextContextMenu: + return ApplicationLaunchSource:: + APPLICATION_LAUNCH_SOURCE_SMART_TEXT_CONTEXT_MENU; + case LaunchSource::kFromDiscoverTabNotification: + return ApplicationLaunchSource:: + APPLICATION_LAUNCH_SOURCE_DISCOVER_TAB_NOTIFICATION; + case LaunchSource::kFromManagementApi: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_MANAGEMENT_API; + case LaunchSource::kFromKiosk: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_KIOSK; + case LaunchSource::kFromCommandLine: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_COMMAND_LINE; + case LaunchSource::kFromBackgroundMode: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_BACKGROUND_MODE; + case LaunchSource::kFromNewTabPage: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_NEW_TAB_PAGE; + case LaunchSource::kFromIntentUrl: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_INTENT_URL; + case LaunchSource::kFromOsLogin: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_OS_LOGIN; + case LaunchSource::kFromProtocolHandler: + return ApplicationLaunchSource:: + APPLICATION_LAUNCH_SOURCE_PROTOCOL_HANDLER; + case LaunchSource::kFromUrlHandler: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_URL_HANDLER; + case LaunchSource::kFromLockScreen: + return ApplicationLaunchSource::APPLICATION_LAUNCH_SOURCE_LOCK_SCREEN; + } +} + LaunchSource ConvertMojomLaunchSourceToLaunchSource( apps::mojom::LaunchSource mojom_install_source) { switch (mojom_install_source) {
diff --git a/components/services/app_service/public/cpp/app_launch_util.h b/components/services/app_service/public/cpp/app_launch_util.h index 2583b7a..a60d60c 100644 --- a/components/services/app_service/public/cpp/app_launch_util.h +++ b/components/services/app_service/public/cpp/app_launch_util.h
@@ -6,6 +6,7 @@ #define COMPONENTS_SERVICES_APP_SERVICE_PUBLIC_CPP_APP_LAUNCH_UTIL_H_ #include "components/services/app_service/public/mojom/types.mojom.h" +#include "components/services/app_service/public/protos/app_types.pb.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/gfx/geometry/rect.h" @@ -88,6 +89,10 @@ using WindowInfoPtr = std::unique_ptr<WindowInfo>; +COMPONENT_EXPORT(APP_TYPES) +ApplicationLaunchSource ConvertLaunchSourceToProtoApplicationLaunchSource( + LaunchSource launch_source); + // TODO(crbug.com/1253250): Remove these functions after migrating to non-mojo // AppService. COMPONENT_EXPORT(APP_TYPES)
diff --git a/components/services/app_service/public/cpp/app_types.cc b/components/services/app_service/public/cpp/app_types.cc index 0c996ac0..1bf6520f 100644 --- a/components/services/app_service/public/cpp/app_types.cc +++ b/components/services/app_service/public/cpp/app_types.cc
@@ -107,6 +107,104 @@ return app; } +ApplicationType ConvertAppTypeToProtoApplicationType(AppType app_type) { + switch (app_type) { + case AppType::kUnknown: + return ApplicationType::APPLICATION_TYPE_UNKNOWN; + case AppType::kArc: + return ApplicationType::APPLICATION_TYPE_ARC; + case AppType::kBuiltIn: + return ApplicationType::APPLICATION_TYPE_BUILT_IN; + case AppType::kCrostini: + return ApplicationType::APPLICATION_TYPE_CROSTINI; + case AppType::kChromeApp: + return ApplicationType::APPLICATION_TYPE_CHROME_APP; + case AppType::kWeb: + return ApplicationType::APPLICATION_TYPE_WEB; + case AppType::kMacOs: + return ApplicationType::APPLICATION_TYPE_MAC_OS; + case AppType::kPluginVm: + return ApplicationType::APPLICATION_TYPE_PLUGIN_VM; + case AppType::kStandaloneBrowser: + return ApplicationType::APPLICATION_TYPE_STANDALONE_BROWSER; + case AppType::kRemote: + return ApplicationType::APPLICATION_TYPE_REMOTE; + case AppType::kBorealis: + return ApplicationType::APPLICATION_TYPE_BOREALIS; + case AppType::kSystemWeb: + return ApplicationType::APPLICATION_TYPE_SYSTEM_WEB; + case AppType::kStandaloneBrowserChromeApp: + return ApplicationType::APPLICATION_TYPE_STANDALONE_BROWSER_CHROME_APP; + case AppType::kExtension: + return ApplicationType::APPLICATION_TYPE_EXTENSION; + case AppType::kStandaloneBrowserExtension: + return ApplicationType::APPLICATION_TYPE_STANDALONE_BROWSER_EXTENSION; + } +} + +ApplicationInstallReason ConvertInstallReasonToProtoApplicationInstallReason( + InstallReason install_reason) { + switch (install_reason) { + case InstallReason::kUnknown: + return ApplicationInstallReason::APPLICATION_INSTALL_REASON_UNKNOWN; + case InstallReason::kSystem: + return ApplicationInstallReason::APPLICATION_INSTALL_REASON_SYSTEM; + case InstallReason::kPolicy: + return ApplicationInstallReason::APPLICATION_INSTALL_REASON_POLICY; + case InstallReason::kOem: + return ApplicationInstallReason::APPLICATION_INSTALL_REASON_OEM; + case InstallReason::kDefault: + return ApplicationInstallReason::APPLICATION_INSTALL_REASON_DEFAULT; + case InstallReason::kSync: + return ApplicationInstallReason::APPLICATION_INSTALL_REASON_SYNC; + case InstallReason::kUser: + return ApplicationInstallReason::APPLICATION_INSTALL_REASON_USER; + case InstallReason::kSubApp: + return ApplicationInstallReason::APPLICATION_INSTALL_REASON_SUB_APP; + case InstallReason::kKiosk: + return ApplicationInstallReason::APPLICATION_INSTALL_REASON_KIOSK; + case InstallReason::kCommandLine: + return ApplicationInstallReason::APPLICATION_INSTALL_REASON_COMMAND_LINE; + } +} + +ApplicationInstallSource ConvertInstallSourceToProtoApplicationInstallSource( + InstallSource install_source) { + switch (install_source) { + case InstallSource::kUnknown: + return ApplicationInstallSource::APPLICATION_INSTALL_SOURCE_UNKNOWN; + case InstallSource::kSystem: + return ApplicationInstallSource::APPLICATION_INSTALL_SOURCE_SYSTEM; + case InstallSource::kSync: + return ApplicationInstallSource::APPLICATION_INSTALL_SOURCE_SYNC; + case InstallSource::kPlayStore: + return ApplicationInstallSource::APPLICATION_INSTALL_SOURCE_PLAY_STORE; + case InstallSource::kChromeWebStore: + return ApplicationInstallSource:: + APPLICATION_INSTALL_SOURCE_CHROME_WEB_STORE; + case InstallSource::kBrowser: + return ApplicationInstallSource::APPLICATION_INSTALL_SOURCE_BROWSER; + } +} + +ApplicationUninstallSource +ConvertUninstallSourceToProtoApplicationUninstallSource( + UninstallSource uninstall_source) { + switch (uninstall_source) { + case UninstallSource::kUnknown: + return ApplicationUninstallSource::APPLICATION_UNINSTALL_SOURCE_UNKNOWN; + case UninstallSource::kAppList: + return ApplicationUninstallSource::APPLICATION_UNINSTALL_SOURCE_APP_LIST; + case UninstallSource ::kAppManagement: + return ApplicationUninstallSource:: + APPLICATION_UNINSTALL_SOURCE_APP_MANAGEMENT; + case UninstallSource ::kShelf: + return ApplicationUninstallSource::APPLICATION_UNINSTALL_SOURCE_SHELF; + case UninstallSource ::kMigration: + return ApplicationUninstallSource::APPLICATION_UNINSTALL_SOURCE_MIGRATION; + } +} + AppType ConvertMojomAppTypToAppType(apps::mojom::AppType mojom_app_type) { switch (mojom_app_type) { case apps::mojom::AppType::kUnknown:
diff --git a/components/services/app_service/public/cpp/app_types.h b/components/services/app_service/public/cpp/app_types.h index 65b20f9..20e475a9 100644 --- a/components/services/app_service/public/cpp/app_types.h +++ b/components/services/app_service/public/cpp/app_types.h
@@ -18,6 +18,7 @@ #include "components/services/app_service/public/cpp/run_on_os_login_types.h" #include "components/services/app_service/public/cpp/shortcut.h" #include "components/services/app_service/public/mojom/types.mojom.h" +#include "components/services/app_service/public/protos/app_types.pb.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace apps { @@ -231,6 +232,22 @@ using AppPtr = std::unique_ptr<App>; +COMPONENT_EXPORT(APP_TYPES) +ApplicationType ConvertAppTypeToProtoApplicationType(AppType app_type); + +COMPONENT_EXPORT(APP_TYPES) +ApplicationInstallReason ConvertInstallReasonToProtoApplicationInstallReason( + InstallReason install_reason); + +COMPONENT_EXPORT(APP_TYPES) +ApplicationInstallSource ConvertInstallSourceToProtoApplicationInstallSource( + InstallSource install_source); + +COMPONENT_EXPORT(APP_TYPES) +ApplicationUninstallSource +ConvertUninstallSourceToProtoApplicationUninstallSource( + UninstallSource uninstall_source); + // TODO(crbug.com/1253250): Remove these functions after migrating to non-mojo // AppService. COMPONENT_EXPORT(APP_TYPES)
diff --git a/components/viz/common/quads/render_pass_io.cc b/components/viz/common/quads/render_pass_io.cc index 7e58782..37f5c65 100644 --- a/components/viz/common/quads/render_pass_io.cc +++ b/components/viz/common/quads/render_pass_io.cc
@@ -141,12 +141,10 @@ return dict; } -bool PointFromDict(const base::Value& dict, gfx::Point* point) { +bool PointFromDict(const base::Value::Dict& dict, gfx::Point* point) { DCHECK(point); - if (!dict.is_dict()) - return false; - absl::optional<int> x = dict.FindIntKey("x"); - absl::optional<int> y = dict.FindIntKey("y"); + absl::optional<int> x = dict.FindInt("x"); + absl::optional<int> y = dict.FindInt("y"); if (!x || !y) { return false; } @@ -164,14 +162,12 @@ return dict; } -bool SkColor4fFromDict(const base::Value& dict, SkColor4f* color) { +bool SkColor4fFromDict(const base::Value::Dict& dict, SkColor4f* color) { DCHECK(color); - if (!dict.is_dict()) - return false; - absl::optional<double> red = dict.FindDoubleKey("red"); - absl::optional<double> green = dict.FindDoubleKey("green"); - absl::optional<double> blue = dict.FindDoubleKey("blue"); - absl::optional<double> alpha = dict.FindDoubleKey("alpha"); + absl::optional<double> red = dict.FindDouble("red"); + absl::optional<double> green = dict.FindDouble("green"); + absl::optional<double> blue = dict.FindDouble("blue"); + absl::optional<double> alpha = dict.FindDouble("alpha"); if (!red || !green || !blue || !alpha) return false; color->fR = static_cast<float>(red.value()); @@ -183,13 +179,13 @@ // Many quads now store color as an SkColor4f, but older logs will still store // SkColors (which are ints). For backward compatibility's sake, read either. -bool ColorFromDict(const base::Value& dict, +bool ColorFromDict(const base::Value::Dict& dict, base::StringPiece key, SkColor4f* output_color) { - const base::Value* color_key = dict.FindDictKey(key); + const base::Value::Dict* color_key = dict.FindDict(key); SkColor4f color_4f; if (!color_key || !SkColor4fFromDict(*color_key, &color_4f)) { - absl::optional<int> color_int = dict.FindIntKey(key); + absl::optional<int> color_int = dict.FindInt(key); if (!color_int) return false; color_4f = SkColor4f::FromColor(static_cast<SkColor>(color_int.value())); @@ -482,16 +478,14 @@ return list; } -bool ShapeRectsFromList(const base::Value& list, +bool ShapeRectsFromList(const base::Value::List& list, cc::FilterOperation::ShapeRects* shape) { DCHECK(shape); - if (!list.is_list()) - return false; - size_t size = list.GetList().size(); + size_t size = list.size(); cc::FilterOperation::ShapeRects data; data.resize(size); for (size_t ii = 0; ii < size; ++ii) { - const base::Value& dict_value = list.GetList()[ii]; + const base::Value& dict_value = list[ii]; if (!dict_value.is_dict()) return false; if (!RectFromDict(dict_value.GetDict(), &data[ii])) @@ -588,24 +582,24 @@ return dict; } -bool FilterOperationFromDict(const base::Value& dict, +bool FilterOperationFromDict(const base::Value& dict_value, cc::FilterOperation* out) { DCHECK(out); - if (!dict.is_dict()) { + if (!dict_value.is_dict()) { return false; } - absl::optional<int> type = dict.FindIntKey("type"); - absl::optional<double> amount = dict.FindDoubleKey("amount"); - absl::optional<double> outer_threshold = - dict.FindDoubleKey("outer_threshold"); - const base::Value* drop_shadow_offset = - dict.FindDictKey("drop_shadow_offset"); - const std::string* image_filter = dict.FindStringKey("image_filter"); - const base::Value::List* matrix = dict.GetDict().FindList("matrix"); - absl::optional<int> zoom_inset = dict.FindIntKey("zoom_inset"); - const base::Value* shape = dict.FindListKey("shape"); - absl::optional<int> blur_tile_mode = dict.FindIntKey("blur_tile_mode"); + const base::Value::Dict& dict = dict_value.GetDict(); + absl::optional<int> type = dict.FindInt("type"); + absl::optional<double> amount = dict.FindDouble("amount"); + absl::optional<double> outer_threshold = dict.FindDouble("outer_threshold"); + const base::Value::Dict* drop_shadow_offset = + dict.FindDict("drop_shadow_offset"); + const std::string* image_filter = dict.FindString("image_filter"); + const base::Value::List* matrix = dict.FindList("matrix"); + absl::optional<int> zoom_inset = dict.FindInt("zoom_inset"); + const base::Value::List* shape = dict.FindList("shape"); + absl::optional<int> blur_tile_mode = dict.FindInt("blur_tile_mode"); cc::FilterOperation filter; @@ -1017,15 +1011,12 @@ return dict; } -absl::optional<SurfaceId> SurfaceIdFromDict(const base::Value& dict) { - if (!dict.is_dict()) { - return absl::nullopt; - } - absl::optional<int> client_id = dict.FindIntKey("client_id"); - absl::optional<int> sink_id = dict.FindIntKey("sink_id"); - absl::optional<int> parent_seq = dict.FindIntKey("parent_seq"); - absl::optional<int> child_seq = dict.FindIntKey("child_seq"); - const base::Value* embed_token_value = dict.FindKey("embed_token"); +absl::optional<SurfaceId> SurfaceIdFromDict(const base::Value::Dict& dict) { + absl::optional<int> client_id = dict.FindInt("client_id"); + absl::optional<int> sink_id = dict.FindInt("sink_id"); + absl::optional<int> parent_seq = dict.FindInt("parent_seq"); + absl::optional<int> child_seq = dict.FindInt("child_seq"); + const base::Value* embed_token_value = dict.Find("embed_token"); if (!client_id || !sink_id || !parent_seq || !child_seq || !embed_token_value) return absl::nullopt; @@ -1046,12 +1037,10 @@ return dict; } -absl::optional<SurfaceRange> SurfaceRangeFromDict(const base::Value& dict) { - if (!dict.is_dict()) { - return absl::nullopt; - } - const base::Value* start_dict = dict.FindDictKey("start"); - const base::Value* end_dict = dict.FindDictKey("end"); +absl::optional<SurfaceRange> SurfaceRangeFromDict( + const base::Value::Dict& dict) { + const base::Value::Dict* start_dict = dict.FindDict("start"); + const base::Value::Dict* end_dict = dict.FindDict("end"); if (!end_dict) return absl::nullopt; absl::optional<SurfaceId> start = @@ -1459,7 +1448,7 @@ return false; SkColor4f t_color; - if (!ColorFromDict(dict, "color", &t_color)) + if (!ColorFromDict(dict.GetDict(), "color", &t_color)) return false; draw_quad->SetAll(common.shared_quad_state, common.rect, common.visible_rect, @@ -1468,28 +1457,30 @@ return true; } -bool SurfaceDrawQuadFromDict(const base::Value& dict, +bool SurfaceDrawQuadFromDict(const base::Value& dict_value, const DrawQuadCommon& common, SurfaceDrawQuad* draw_quad) { DCHECK(draw_quad); - if (!dict.is_dict()) + if (!dict_value.is_dict()) return false; - const base::Value* surface_range_dict = dict.FindDictKey("surface_range"); + const base::Value::Dict& dict = dict_value.GetDict(); + const base::Value::Dict* surface_range_dict = dict.FindDict("surface_range"); if (!surface_range_dict) return false; absl::optional<SurfaceRange> surface_range = SurfaceRangeFromDict(*surface_range_dict); - absl::optional<bool> stretch_content = dict.FindBoolKey("stretch_content"); - absl::optional<bool> is_reflection = dict.FindBoolKey("is_reflection"); - absl::optional<bool> allow_merge = dict.FindBoolKey("allow_merge"); + absl::optional<bool> stretch_content = dict.FindBool("stretch_content"); + absl::optional<bool> is_reflection = dict.FindBool("is_reflection"); + absl::optional<bool> allow_merge = dict.FindBool("allow_merge"); if (!surface_range || !stretch_content || !is_reflection || !allow_merge) return false; SkColor4f t_default_background_color; if (!ColorFromDict(dict, "default_background_color", - &t_default_background_color)) + &t_default_background_color)) { return false; + } draw_quad->SetAll(common.shared_quad_state, common.rect, common.visible_rect, common.needs_blending, *surface_range, @@ -1538,7 +1529,7 @@ if (!PointFFromDict(*uv_top_left, &t_uv_top_left) || !PointFFromDict(*uv_bottom_right, &t_uv_bottom_right) || !SizeFromDict(*resource_size_in_pixels, &t_resource_size_in_pixels) || - !ColorFromDict(dict_value, "background_color", &t_background_color)) { + !ColorFromDict(dict, "background_color", &t_background_color)) { return false; } float t_vertex_opacity[4]; @@ -2287,7 +2278,8 @@ return false; } for (auto& referenced_surface_dict : referenced_surfaces->GetList()) { - auto referenced_surface = SurfaceRangeFromDict(referenced_surface_dict); + auto referenced_surface = + SurfaceRangeFromDict(referenced_surface_dict.GetDict()); if (!referenced_surface) { return false; } @@ -2328,7 +2320,7 @@ } for (const auto& frame_data_dict : list.GetList()) { FrameData frame_data; - auto* surface_id_dict = frame_data_dict.FindDictKey("surface_id"); + auto* surface_id_dict = frame_data_dict.GetDict().FindDict("surface_id"); if (!surface_id_dict) { return false; }
diff --git a/components/viz/host/BUILD.gn b/components/viz/host/BUILD.gn index 4c07be5..a6ea4322 100644 --- a/components/viz/host/BUILD.gn +++ b/components/viz/host/BUILD.gn
@@ -108,5 +108,6 @@ ":host", "//base/test:test_support", "//components/viz/test:test_support", + "//ui/gfx:test_support", ] }
diff --git a/components/viz/host/hit_test/hit_test_query_fuzzer.cc b/components/viz/host/hit_test/hit_test_query_fuzzer.cc index 7c750de..f4a8a01 100644 --- a/components/viz/host/hit_test/hit_test_query_fuzzer.cc +++ b/components/viz/host/hit_test/hit_test_query_fuzzer.cc
@@ -12,6 +12,7 @@ #include "base/command_line.h" #include "components/viz/host/hit_test/hit_test_query.h" +#include "ui/gfx/geometry/test/fuzzer_util.h" namespace { @@ -40,14 +41,8 @@ fuzz->ConsumeIntegral<int>(), fuzz->ConsumeIntegral<int>()); int32_t child_count = depth < kMaxDepthAllowed ? fuzz->ConsumeIntegralInRange(0, 10) : 0; - gfx::Transform transform; - if (fuzz->ConsumeBool() && fuzz->remaining_bytes() >= sizeof(transform)) { - std::vector<uint8_t> matrix_bytes = - fuzz->ConsumeBytes<uint8_t>(sizeof(gfx::Transform)); - memcpy(&transform, matrix_bytes.data(), matrix_bytes.size()); - } - regions->emplace_back(frame_sink_id, flags, rect, transform, child_count, - reasons); + regions->emplace_back(frame_sink_id, flags, rect, + gfx::ConsumeTransform(*fuzz), child_count, reasons); // Always add the first frame sink id, because the root needs to be in the // list of FrameSinkId. if (regions->size() == 1 || fuzz->ConsumeBool())
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn index f8ceaa5..52059e57 100644 --- a/components/viz/service/BUILD.gn +++ b/components/viz/service/BUILD.gn
@@ -623,6 +623,7 @@ ":service", "//base/test:test_support", "//components/viz/test:test_support", + "//ui/gfx:test_support", ] }
diff --git a/components/viz/service/display/draw_polygon_unittest.cc b/components/viz/service/display/draw_polygon_unittest.cc index 9c32973..0f785d05 100644 --- a/components/viz/service/display/draw_polygon_unittest.cc +++ b/components/viz/service/display/draw_polygon_unittest.cc
@@ -682,14 +682,14 @@ &back_polygon, &is_coplanar); EXPECT_FALSE(is_coplanar); - EXPECT_TRUE(front_polygon != nullptr); - EXPECT_TRUE(back_polygon != nullptr); - - for (auto point : front_polygon->points()) { - EXPECT_TRUE(std::isfinite(point.x())); - EXPECT_TRUE(std::isfinite(point.y())); - EXPECT_TRUE(std::isfinite(point.z())); - } + // After crrev.com/c/3914178, this test no longer produces the exact original + // situation of crbug.com/1264787 which had one front_polygon point with + // almost zero distance to the plane of splitting-polygon. Now with better + // precision in gfx::Transform, the front_polygon point becomes one of the + // back_polygon points. It's hard to reproduce the original situation, but we + // can still check all points have finite coordinates. + EXPECT_TRUE(front_polygon == nullptr); + ASSERT_TRUE(back_polygon != nullptr); for (auto point : back_polygon->points()) { EXPECT_TRUE(std::isfinite(point.x()));
diff --git a/components/viz/service/frame_sinks/video_capture/video_capture_overlay.cc b/components/viz/service/frame_sinks/video_capture/video_capture_overlay.cc index ad8b68c..785d74b8 100644 --- a/components/viz/service/frame_sinks/video_capture/video_capture_overlay.cc +++ b/components/viz/service/frame_sinks/video_capture/video_capture_overlay.cc
@@ -399,8 +399,8 @@ for (int row = 0; row < blit_size.height(); ++row, src += src_stride, under_weight += src_stride, dst += dst_stride) { for (int col = 0; col < blit_size.width(); ++col) { - dst[col] = ToClamped255( - std::fma(From255(dst[col]), under_weight[col], src[col])); + dst[col] = base::saturated_cast<uint8_t>( + dst[col] * under_weight[col] + 255.0f * src[col] + 0.5f); } } };
diff --git a/components/viz/service/hit_test/hit_test_manager_fuzzer.cc b/components/viz/service/hit_test/hit_test_manager_fuzzer.cc index 111f7d6..82e3be9 100644 --- a/components/viz/service/hit_test/hit_test_manager_fuzzer.cc +++ b/components/viz/service/hit_test/hit_test_manager_fuzzer.cc
@@ -18,6 +18,7 @@ #include "components/viz/service/hit_test/hit_test_manager.h" #include "components/viz/test/compositor_frame_helpers.h" #include "components/viz/test/test_latest_local_surface_id_lookup_delegate.h" +#include "ui/gfx/geometry/test/fuzzer_util.h" namespace { @@ -28,16 +29,6 @@ 1, std::numeric_limits<uint32_t>::max()); } -gfx::Transform GetNextTransform(FuzzedDataProvider* fuzz) { - gfx::Transform transform; - if (fuzz->ConsumeBool() && fuzz->remaining_bytes() >= sizeof(transform)) { - std::vector<uint8_t> matrix_bytes = - fuzz->ConsumeBytes<uint8_t>(sizeof(gfx::Transform)); - memcpy(&transform, matrix_bytes.data(), matrix_bytes.size()); - } - return transform; -} - void SubmitHitTestRegionList( FuzzedDataProvider* fuzz, viz::TestLatestLocalSurfaceIdLookupDelegate* delegate, @@ -70,7 +61,7 @@ hit_test_region.rect = gfx::Rect(fuzz->ConsumeIntegral<int>(), fuzz->ConsumeIntegral<int>(), fuzz->ConsumeIntegral<int>(), fuzz->ConsumeIntegral<int>()); - hit_test_region.transform = GetNextTransform(fuzz); + hit_test_region.transform = gfx::ConsumeTransform(*fuzz); if (fuzz->ConsumeBool() && (hit_test_region.flags & viz::HitTestRegionFlags::kHitTestChildSurface)) { @@ -121,7 +112,7 @@ hit_test_region_list->bounds = gfx::Rect(fuzz->ConsumeIntegral<int>(), fuzz->ConsumeIntegral<int>(), fuzz->ConsumeIntegral<int>(), fuzz->ConsumeIntegral<int>()); - hit_test_region_list->transform = GetNextTransform(fuzz); + hit_test_region_list->transform = gfx::ConsumeTransform(*fuzz); uint32_t child_count = fuzz->ConsumeIntegral<uint32_t>(); AddHitTestRegion(fuzz, &hit_test_region_list->regions, child_count,
diff --git a/components/webapps/browser/installable/installable_manager_unittest.cc b/components/webapps/browser/installable/installable_manager_unittest.cc index 43e024b..fcbced5 100644 --- a/components/webapps/browser/installable/installable_manager_unittest.cc +++ b/components/webapps/browser/installable/installable_manager_unittest.cc
@@ -331,20 +331,7 @@ EXPECT_EQ(NO_ERROR_DETECTED, GetErrorCode()); } -class InstallableManagerUnitTest_WindowControlsOverlay - : public InstallableManagerUnitTest { - public: - InstallableManagerUnitTest_WindowControlsOverlay() { - scoped_feature_list_.InitWithFeatures( - {features::kWebAppWindowControlsOverlay}, {}); - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; -}; - -TEST_F(InstallableManagerUnitTest_WindowControlsOverlay, - SupportWindowControlsOverlay) { +TEST_F(InstallableManagerUnitTest, SupportWindowControlsOverlay) { blink::mojom::ManifestPtr manifest = GetValidManifest(); manifest->display_override.push_back(
diff --git a/content/browser/browser_interface_binders.cc b/content/browser/browser_interface_binders.cc index ba1ffe3..9670a9c 100644 --- a/content/browser/browser_interface_binders.cc +++ b/content/browser/browser_interface_binders.cc
@@ -281,8 +281,7 @@ RenderFrameHostImpl* host, mojo::PendingReceiver<blink::mojom::QuotaManagerHost> receiver) { host->GetStoragePartition()->GetQuotaContext()->BindQuotaManagerHost( - host->GetProcess()->GetID(), host->GetRoutingID(), host->storage_key(), - std::move(receiver)); + host->storage_key(), std::move(receiver)); } void BindNativeIOHost(
diff --git a/content/browser/first_party_sets/first_party_sets_handler_impl.cc b/content/browser/first_party_sets/first_party_sets_handler_impl.cc index d8f12e3..c6a061e1 100644 --- a/content/browser/first_party_sets/first_party_sets_handler_impl.cc +++ b/content/browser/first_party_sets/first_party_sets_handler_impl.cc
@@ -210,25 +210,6 @@ sets_loader_->SetComponentSets(std::move(sets_file)); } -void FirstPartySetsHandlerImpl::ResetForTesting() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - initialized_ = false; - enabled_ = GetContentClient()->browser()->IsFirstPartySetsEnabled(); - embedder_will_provide_public_sets_ = - GetContentClient()->browser()->WillProvidePublicFirstPartySets(); - - // Initializes the `sets_loader_` member with a callback to SetCompleteSets - // and the result of content::GetFirstPartySetsOverrides. - sets_loader_ = std::make_unique<FirstPartySetsLoader>( - base::BindOnce(&FirstPartySetsHandlerImpl::SetCompleteSets, - // base::Unretained(this) is safe here because - // this is a static singleton. - base::Unretained(this))); - on_sets_ready_callbacks_.clear(); - global_sets_ = absl::nullopt; - db_helper_.Reset(); -} - void FirstPartySetsHandlerImpl::GetPersistedGlobalSetsForTesting( const std::string& browser_context_id, base::OnceCallback<void(absl::optional<net::GlobalFirstPartySets>)>
diff --git a/content/browser/first_party_sets/first_party_sets_handler_impl.h b/content/browser/first_party_sets/first_party_sets_handler_impl.h index f464f126..8dad661 100644 --- a/content/browser/first_party_sets/first_party_sets_handler_impl.h +++ b/content/browser/first_party_sets/first_party_sets_handler_impl.h
@@ -115,7 +115,6 @@ bool IsEnabled() const override; void SetPublicFirstPartySets(const base::Version& version, base::File sets_file) override; - void ResetForTesting() override; absl::optional<net::FirstPartySetEntry> FindEntry( const net::SchemefulSite& site, const net::FirstPartySetsContextConfig& config) const override;
diff --git a/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc b/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc index 93dc9983..e5b7f1e 100644 --- a/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc +++ b/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc
@@ -152,12 +152,12 @@ {kAdditionsField, 0, kPrimaryField})); } -class FirstPartySetsHandlerImplTest : public ::testing::Test { +class FirstPartySetsHandlerImplEnabledTest : public ::testing::Test { public: - explicit FirstPartySetsHandlerImplTest(bool embedder_will_provide_public_sets) + explicit FirstPartySetsHandlerImplEnabledTest() : handler_(FirstPartySetsHandlerImpl::CreateForTesting( /*enabled=*/true, - embedder_will_provide_public_sets)) { + /*embedder_will_provide_public_sets=*/true)) { CHECK(scoped_dir_.CreateUniqueTempDir()); CHECK(PathExists(scoped_dir_.GetPath())); } @@ -204,18 +204,13 @@ FirstPartySetsHandlerImpl handler_; }; -class FirstPartySetsHandlerImplWithoutPublicSetsTest - : public FirstPartySetsHandlerImplTest { - public: - FirstPartySetsHandlerImplWithoutPublicSetsTest() - : FirstPartySetsHandlerImplTest( - /*embedder_will_provide_public_sets=*/false) {} -}; - -TEST_F(FirstPartySetsHandlerImplWithoutPublicSetsTest, EmptyDBPath) { +TEST_F(FirstPartySetsHandlerImplEnabledTest, EmptyDBPath) { net::SchemefulSite example(GURL("https://example.test")); net::SchemefulSite associated(GURL("https://associatedsite1.test")); + handler().SetPublicFirstPartySets(base::Version("0.0.1"), + WritePublicSetsFile("")); + // Empty `user_data_dir` will fail to load persisted sets, but that will not // prevent `on_sets_ready` from being invoked. handler().Init( @@ -234,14 +229,6 @@ example, net::SiteType::kAssociated, 0)))); } -class FirstPartySetsHandlerImplEnabledTest - : public FirstPartySetsHandlerImplTest { - public: - FirstPartySetsHandlerImplEnabledTest() - : FirstPartySetsHandlerImplTest( - /*embedder_will_provide_public_sets=*/true) {} -}; - TEST_F(FirstPartySetsHandlerImplEnabledTest, ClearSiteDataOnChangedSetsForContext_FeatureNotEnabled) { base::HistogramTester histogram;
diff --git a/content/browser/quota/quota_context.cc b/content/browser/quota/quota_context.cc index 194fee5..d44d43d 100644 --- a/content/browser/quota/quota_context.cc +++ b/content/browser/quota/quota_context.cc
@@ -15,7 +15,6 @@ #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/content_browser_client.h" -#include "content/public/browser/quota_permission_context.h" #include "content/public/common/content_client.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "storage/browser/quota/quota_manager.h" @@ -41,21 +40,16 @@ base::BindRepeating(&QuotaChangeDispatcher::MaybeDispatchEvents, quota_change_dispatcher_), std::move(special_storage_policy), - std::move(get_settings_function))), - permission_context_( - GetContentClient()->browser()->CreateQuotaPermissionContext()) {} + std::move(get_settings_function))) {} void QuotaContext::BindQuotaManagerHost( - int process_id, - int render_frame_id, const blink::StorageKey& storage_key, mojo::PendingReceiver<blink::mojom::QuotaManagerHost> receiver) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); io_thread_->PostTask( FROM_HERE, base::BindOnce(&QuotaContext::BindQuotaManagerHostOnIOThread, - this, process_id, render_frame_id, storage_key, - std::move(receiver))); + this, storage_key, std::move(receiver))); } QuotaContext::~QuotaContext() { @@ -63,16 +57,13 @@ } void QuotaContext::BindQuotaManagerHostOnIOThread( - int process_id, - int render_frame_id, const blink::StorageKey& storage_key, mojo::PendingReceiver<blink::mojom::QuotaManagerHost> receiver) { DCHECK_CURRENTLY_ON(BrowserThread::IO); // The quota manager currently runs on the I/O thread. auto host = std::make_unique<QuotaManagerHost>( - process_id, render_frame_id, storage_key, quota_manager_.get(), - permission_context_.get(), quota_change_dispatcher_); + storage_key, quota_manager_.get(), quota_change_dispatcher_); auto* host_ptr = host.get(); receivers_.Add(host_ptr, std::move(receiver), std::move(host)); }
diff --git a/content/browser/quota/quota_context.h b/content/browser/quota/quota_context.h index 633d9e0..dc8e1d4 100644 --- a/content/browser/quota/quota_context.h +++ b/content/browser/quota/quota_context.h
@@ -11,7 +11,6 @@ #include "base/memory/scoped_refptr.h" #include "base/sequence_checker.h" #include "content/browser/quota/quota_change_dispatcher.h" -#include "content/public/browser/quota_permission_context.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "storage/browser/quota/quota_settings.h" @@ -35,7 +34,6 @@ namespace content { class QuotaManagerHost; -class QuotaPermissionContext; // Owns the Quota sub-system for a StoragePartition. // @@ -59,8 +57,6 @@ // Must be called from the UI thread. void BindQuotaManagerHost( - int process_id, - int render_frame_id, const blink::StorageKey& storage_key, mojo::PendingReceiver<blink::mojom::QuotaManagerHost> receiver); @@ -74,8 +70,6 @@ ~QuotaContext(); void BindQuotaManagerHostOnIOThread( - int process_id, - int render_frame_id, const blink::StorageKey& storage_key, mojo::PendingReceiver<blink::mojom::QuotaManagerHost> receiver); @@ -90,9 +84,6 @@ // This is not const because of OverrideQuotaManagerForTesting(). scoped_refptr<storage::QuotaManager> quota_manager_; - // Owning reference for the QuotaPermissionContext. - const scoped_refptr<QuotaPermissionContext> permission_context_; - // Only accessed on the IO thread. mojo::ReceiverSet<blink::mojom::QuotaManagerHost, std::unique_ptr<QuotaManagerHost>>
diff --git a/content/browser/quota/quota_manager_host.cc b/content/browser/quota/quota_manager_host.cc index 4f537cd..adc7eb7 100644 --- a/content/browser/quota/quota_manager_host.cc +++ b/content/browser/quota/quota_manager_host.cc
@@ -12,38 +12,21 @@ #include "base/bind.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" -#include "base/numerics/safe_conversions.h" #include "content/browser/quota/quota_change_dispatcher.h" -#include "content/public/browser/browser_task_traits.h" -#include "content/public/browser/browser_thread.h" -#include "content/public/browser/content_browser_client.h" -#include "content/public/browser/render_process_host.h" -#include "content/public/browser/storage_partition.h" -#include "content/public/common/content_client.h" -#include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "storage/browser/quota/quota_manager.h" #include "third_party/blink/public/common/storage_key/storage_key.h" #include "third_party/blink/public/mojom/quota/quota_types.mojom.h" -#include "url/origin.h" namespace content { QuotaManagerHost::QuotaManagerHost( - int process_id, - int render_frame_id, const blink::StorageKey& storage_key, storage::QuotaManager* quota_manager, - QuotaPermissionContext* permission_context, scoped_refptr<QuotaChangeDispatcher> quota_change_dispatcher) - : process_id_(process_id), - render_frame_id_(render_frame_id), - storage_key_(storage_key), + : storage_key_(storage_key), quota_manager_(quota_manager), - permission_context_(permission_context), quota_change_dispatcher_(std::move(quota_change_dispatcher)) { DCHECK(quota_manager); - // TODO(sashab): Work out the conditions for permission_context to be set and - // add a DCHECK for it here. } void QuotaManagerHost::AddChangeListener( @@ -57,52 +40,13 @@ } void QuotaManagerHost::QueryStorageUsageAndQuota( - blink::mojom::StorageType storage_type, QueryStorageUsageAndQuotaCallback callback) { quota_manager_->GetUsageAndQuotaWithBreakdown( - storage_key_, storage_type, + storage_key_, blink::mojom::StorageType::kTemporary, base::BindOnce(&QuotaManagerHost::DidQueryStorageUsageAndQuota, weak_factory_.GetWeakPtr(), std::move(callback))); } -void QuotaManagerHost::RequestStorageQuota( - blink::mojom::StorageType storage_type, - uint64_t requested_size, - blink::mojom::QuotaManagerHost::RequestStorageQuotaCallback callback) { - if (storage_type != blink::mojom::StorageType::kTemporary && - storage_type != blink::mojom::StorageType::kPersistent) { - mojo::ReportBadMessage("Unsupported storage type specified."); - return; - } - - if (render_frame_id_ == MSG_ROUTING_NONE) { - mojo::ReportBadMessage( - "Requests may show permission UI and are not allowed from workers."); - return; - } - - if (storage_key_.origin().opaque()) { - mojo::ReportBadMessage("Opaque origins may not request storage quota."); - return; - } - - DCHECK(storage_type == blink::mojom::StorageType::kTemporary || - storage_type == blink::mojom::StorageType::kPersistent); - if (storage_type == blink::mojom::StorageType::kPersistent) { - quota_manager_->GetUsageAndQuotaForWebApps( - storage_key_, storage_type, - base::BindOnce(&QuotaManagerHost::DidGetPersistentUsageAndQuota, - weak_factory_.GetWeakPtr(), storage_type, requested_size, - std::move(callback))); - } else { - quota_manager_->GetUsageAndQuotaForWebApps( - storage_key_, storage_type, - base::BindOnce(&QuotaManagerHost::DidGetTemporaryUsageAndQuota, - weak_factory_.GetWeakPtr(), requested_size, - std::move(callback))); - } -} - void QuotaManagerHost::DidQueryStorageUsageAndQuota( QueryStorageUsageAndQuotaCallback callback, blink::mojom::QuotaStatusCode status, @@ -112,84 +56,6 @@ std::move(callback).Run(status, usage, quota, std::move(usage_breakdown)); } -void QuotaManagerHost::DidGetPersistentUsageAndQuota( - blink::mojom::StorageType storage_type, - uint64_t requested_quota, - RequestStorageQuotaCallback callback, - blink::mojom::QuotaStatusCode status, - int64_t current_usage, - int64_t current_quota) { - if (status != blink::mojom::QuotaStatusCode::kOk) { - std::move(callback).Run(status, 0, 0); - return; - } - - // If we have enough quota for the requested storage, we can just let it go. - // Convert the requested size from uint64_t to int64_t since the quota backend - // requires int64_t values. - // TODO(nhiroki): The backend should accept uint64_t values. - int64_t requested_quota_signed = - base::saturated_cast<int64_t>(requested_quota); - if (quota_manager_->IsStorageUnlimited(storage_key_, storage_type) || - requested_quota_signed <= current_quota) { - std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk, current_usage, - requested_quota); - return; - } - - // Otherwise we need to consult with the permission context and possibly show - // a prompt. - DCHECK(permission_context_); - StorageQuotaParams params; - params.render_frame_id = render_frame_id_; - params.origin_url = storage_key_.origin().GetURL(); - params.storage_type = storage_type; - params.requested_size = requested_quota; - - permission_context_->RequestQuotaPermission( - params, process_id_, - base::BindOnce(&QuotaManagerHost::DidGetPermissionResponse, - weak_factory_.GetWeakPtr(), requested_quota, current_usage, - current_quota, std::move(callback))); -} - -void QuotaManagerHost::DidGetPermissionResponse( - uint64_t requested_quota, - int64_t current_usage, - int64_t current_quota, - RequestStorageQuotaCallback callback, - QuotaPermissionContext::QuotaPermissionResponse response) { - // If user didn't allow the new quota, just return the current quota. - if (response != QuotaPermissionContext::QUOTA_PERMISSION_RESPONSE_ALLOW) { - std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk, current_usage, - current_quota); - return; - } - - // Otherwise, return the new quota. - quota_manager_->SetPersistentHostQuota( - storage_key_.origin().host(), requested_quota, - base::BindOnce(&QuotaManagerHost::DidSetHostQuota, - weak_factory_.GetWeakPtr(), current_usage, - std::move(callback))); -} - -void QuotaManagerHost::DidSetHostQuota(int64_t current_usage, - RequestStorageQuotaCallback callback, - blink::mojom::QuotaStatusCode status, - int64_t new_quota) { - std::move(callback).Run(status, current_usage, new_quota); -} - -void QuotaManagerHost::DidGetTemporaryUsageAndQuota( - int64_t requested_quota, - RequestStorageQuotaCallback callback, - blink::mojom::QuotaStatusCode status, - int64_t usage, - int64_t quota) { - std::move(callback).Run(status, usage, std::min(requested_quota, quota)); -} - QuotaManagerHost::~QuotaManagerHost() = default; } // namespace content
diff --git a/content/browser/quota/quota_manager_host.h b/content/browser/quota/quota_manager_host.h index 0965ccb1..b6289a2c0 100644 --- a/content/browser/quota/quota_manager_host.h +++ b/content/browser/quota/quota_manager_host.h
@@ -9,7 +9,6 @@ #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "content/browser/quota/quota_change_dispatcher.h" -#include "content/public/browser/quota_permission_context.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "storage/browser/quota/quota_manager.h" #include "third_party/blink/public/mojom/quota/quota_manager_host.mojom.h" @@ -23,7 +22,6 @@ } namespace content { -class QuotaPermissionContext; // Implements the Quota (Storage) API for a single StorageKey. // @@ -38,14 +36,10 @@ // is likely to change when QuotaManager moves to the Storage Service. class QuotaManagerHost : public blink::mojom::QuotaManagerHost { public: - // The owner must guarantee that `quota_manager` and `permission_context` - // outlive this instance. + // The owner must guarantee that `quota_manager` outlives this instance. QuotaManagerHost( - int process_id, - int render_frame_id, const blink::StorageKey& storage_key, storage::QuotaManager* quota_manager, - QuotaPermissionContext* permission_context, scoped_refptr<QuotaChangeDispatcher> quota_change_dispatcher); QuotaManagerHost(const QuotaManagerHost&) = delete; @@ -58,11 +52,7 @@ mojo::PendingRemote<blink::mojom::QuotaChangeListener> mojo_listener, AddChangeListenerCallback callback) override; void QueryStorageUsageAndQuota( - blink::mojom::StorageType storage_type, QueryStorageUsageAndQuotaCallback callback) override; - void RequestStorageQuota(blink::mojom::StorageType storage_type, - uint64_t requested_size, - RequestStorageQuotaCallback callback) override; private: void DidQueryStorageUsageAndQuota(QueryStorageUsageAndQuotaCallback callback, @@ -70,35 +60,6 @@ int64_t usage, int64_t quota, blink::mojom::UsageBreakdownPtr); - void DidGetPersistentUsageAndQuota(blink::mojom::StorageType storage_type, - uint64_t requested_quota, - RequestStorageQuotaCallback callback, - blink::mojom::QuotaStatusCode status, - int64_t usage, - int64_t quota); - void DidGetPermissionResponse( - uint64_t requested_quota, - int64_t current_usage, - int64_t current_quota, - RequestStorageQuotaCallback callback, - QuotaPermissionContext::QuotaPermissionResponse response); - void DidSetHostQuota(int64_t current_usage, - RequestStorageQuotaCallback callback, - blink::mojom::QuotaStatusCode status, - int64_t new_quota); - void DidGetTemporaryUsageAndQuota(int64_t requested_quota, - RequestStorageQuotaCallback callback, - blink::mojom::QuotaStatusCode status, - int64_t usage, - int64_t quota); - - // The ID of the renderer process connected to this host. - const int process_id_; - - // The ID of the RenderFrame connected to this host. - // - // MSG_ROUTING_NONE if this host is connected to a worker. - const int render_frame_id_; // The storage key of the frame or worker connected to this host. const blink::StorageKey storage_key_; @@ -108,12 +69,6 @@ // the QuotaManager is guaranteed to outlive this QuotaManagerHost. const raw_ptr<storage::QuotaManager> quota_manager_; - // Raw pointer use is safe because the QuotaContext that indirectly owns this - // QuotaManagerHost owner holds a reference to the QuotaPermissionContext. - // Therefore the QuotaPermissionContext is guaranteed to outlive this - // QuotaManagerHost. - const raw_ptr<QuotaPermissionContext> permission_context_; - scoped_refptr<QuotaChangeDispatcher> quota_change_dispatcher_; base::WeakPtrFactory<QuotaManagerHost> weak_factory_{this};
diff --git a/content/browser/renderer_host/input/input_router_impl.cc b/content/browser/renderer_host/input/input_router_impl.cc index 16fba23f..5d8839d 100644 --- a/content/browser/renderer_host/input/input_router_impl.cc +++ b/content/browser/renderer_host/input/input_router_impl.cc
@@ -583,8 +583,8 @@ blink::mojom::WidgetInputHandler::DispatchEventCallback callback) { TRACE_EVENT1("input", "InputRouterImpl::FilterAndSendWebInputEvent", "type", WebInputEvent::GetName(input_event.GetType())); - TRACE_EVENT("input,benchmark,devtools.timeline", "LatencyInfo.Flow", - [&latency_info](perfetto::EventContext ctx) { + TRACE_EVENT("input,benchmark,devtools.timeline,latencyInfo", + "LatencyInfo.Flow", [&latency_info](perfetto::EventContext ctx) { ChromeLatencyInfo* info = ctx.event()->set_chrome_latency_info(); info->set_trace_id(latency_info.trace_id());
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index a0de2c6..564ddcea3 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -2016,7 +2016,7 @@ mojo::PendingReceiver<blink::mojom::QuotaManagerHost> receiver) { DCHECK_CURRENTLY_ON(BrowserThread::UI); storage_partition_impl_->GetQuotaContext()->BindQuotaManagerHost( - GetID(), MSG_ROUTING_NONE, storage_key, std::move(receiver)); + storage_key, std::move(receiver)); } void RenderProcessHostImpl::CreateLockManager(
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc index 860e005..24ac27e 100644 --- a/content/browser/web_contents/web_contents_impl_browsertest.cc +++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -5175,12 +5175,6 @@ class WebContentsImplBrowserTestWindowControlsOverlay : public WebContentsImplBrowserTest { public: - void SetUp() override { - scoped_feature_list_.InitAndEnableFeature( - features::kWebAppWindowControlsOverlay); - WebContentsImplBrowserTest::SetUp(); - } - void ValidateTitlebarAreaCSSValue(const std::string& name, int expected_result) { SCOPED_TRACE(name); @@ -5246,9 +5240,6 @@ TitleWatcher title_watcher(web_contents, u"ongeometrychange"); std::ignore = title_watcher.WaitAndGetTitle(); } - - private: - base::test::ScopedFeatureList scoped_feature_list_; }; IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTestWindowControlsOverlay,
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc index 49473c7..27d79e28 100644 --- a/content/child/runtime_features.cc +++ b/content/child/runtime_features.cc
@@ -325,8 +325,6 @@ {"TopicsAPI", features::kPrivacySandboxAdsAPIsOverride, kSetOnlyIfOverridden}, {"WebAppTabStrip", features::kDesktopPWAsTabStrip}, - {"WebAppWindowControlsOverlay", - features::kWebAppWindowControlsOverlay}, {"WebAuthenticationConditionalUI", features::kWebAuthConditionalUI}, {"WGIGamepadTriggerRumble", features::kEnableWindowsGamingInputDataFetcher},
diff --git a/content/public/browser/first_party_sets_handler.h b/content/public/browser/first_party_sets_handler.h index 3cdcbe4..9dbbcf2e 100644 --- a/content/public/browser/first_party_sets_handler.h +++ b/content/public/browser/first_party_sets_handler.h
@@ -136,9 +136,6 @@ virtual void SetPublicFirstPartySets(const base::Version& version, base::File sets_file) = 0; - // Resets the state on the instance for testing. - virtual void ResetForTesting() = 0; - // Looks up `site` in the global First-Party Sets and `config` to find its // associated FirstPartySetEntry. //
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index e8a63ee..de02f6c 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -1184,11 +1184,6 @@ // Enables future V8 VM features BASE_FEATURE(kV8VmFuture, "V8VmFuture", base::FEATURE_DISABLED_BY_DEFAULT); -// Enable window controls overlays for desktop PWAs -BASE_FEATURE(kWebAppWindowControlsOverlay, - "WebAppWindowControlsOverlay", - base::FEATURE_ENABLED_BY_DEFAULT); - // Enable WebAssembly baseline compilation (Liftoff). BASE_FEATURE(kWebAssemblyBaseline, "WebAssemblyBaseline",
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h index 844f254..d8069b46 100644 --- a/content/public/common/content_features.h +++ b/content/public/common/content_features.h
@@ -249,7 +249,6 @@ CONTENT_EXPORT BASE_DECLARE_FEATURE(kVerifyDidCommitParams); CONTENT_EXPORT BASE_DECLARE_FEATURE(kVideoPlaybackQuality); CONTENT_EXPORT BASE_DECLARE_FEATURE(kV8VmFuture); -CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebAppWindowControlsOverlay); CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebAssemblyBaseline); CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebAssemblyCodeProtection); #if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(ARCH_CPU_X86_64)
diff --git a/device/bluetooth/BUILD.gn b/device/bluetooth/BUILD.gn index bd92e2ce..bd08baf 100644 --- a/device/bluetooth/BUILD.gn +++ b/device/bluetooth/BUILD.gn
@@ -446,6 +446,10 @@ "floss/bluetooth_low_energy_scan_session_floss.h", "floss/bluetooth_pairing_floss.cc", "floss/bluetooth_pairing_floss.h", + "floss/bluetooth_remote_gatt_characteristic_floss.cc", + "floss/bluetooth_remote_gatt_characteristic_floss.h", + "floss/bluetooth_remote_gatt_descriptor_floss.cc", + "floss/bluetooth_remote_gatt_descriptor_floss.h", "floss/bluetooth_remote_gatt_service_floss.cc", "floss/bluetooth_remote_gatt_service_floss.h", "floss/bluetooth_socket_floss.cc",
diff --git a/device/bluetooth/floss/bluetooth_adapter_floss.cc b/device/bluetooth/floss/bluetooth_adapter_floss.cc index b3fb67c..c370daeb 100644 --- a/device/bluetooth/floss/bluetooth_adapter_floss.cc +++ b/device/bluetooth/floss/bluetooth_adapter_floss.cc
@@ -331,6 +331,12 @@ return NumScanningDiscoverySessions() > 0; } +std::unique_ptr<BluetoothDeviceFloss> +BluetoothAdapterFloss::CreateBluetoothDeviceFloss(FlossDeviceId device) { + return std::make_unique<BluetoothDeviceFloss>(this, device, ui_task_runner_, + socket_thread_); +} + void BluetoothAdapterFloss::OnMethodResponse(base::OnceClosure callback, ErrorCallback error_callback, DBusResult<Void> ret) { @@ -591,8 +597,7 @@ BLUETOOTH_LOG(EVENT) << __func__ << device_found; - auto device_floss = base::WrapUnique(new BluetoothDeviceFloss( - this, device_found, ui_task_runner_, socket_thread_)); + auto device_floss = CreateBluetoothDeviceFloss(device_found); std::string canonical_address = device::CanonicalizeBluetoothAddress(device_floss->GetAddress()); @@ -643,8 +648,7 @@ DCHECK(FlossDBusManager::Get()); DCHECK(IsPresent()); - auto device_floss = base::WrapUnique(new BluetoothDeviceFloss( - this, device_cleared, ui_task_runner_, socket_thread_)); + auto device_floss = CreateBluetoothDeviceFloss(device_cleared); std::string canonical_address = device::CanonicalizeBluetoothAddress(device_floss->GetAddress()); if (base::Contains(devices_, canonical_address)) { @@ -963,30 +967,73 @@ } void BluetoothAdapterFloss::ScanResultReceived(ScanResult scan_result) { - device::BluetoothDevice* device = new BluetoothDeviceFloss( - this, - FlossDeviceId({.address = scan_result.address, .name = scan_result.name}), - ui_task_runner_, socket_thread_); + BLUETOOTH_LOG(DEBUG) << __func__ << ": " << scan_result.address; + + auto device = CreateBluetoothDeviceFloss(FlossDeviceId( + {.address = scan_result.address, .name = scan_result.name})); + + std::string canonical_address = + device::CanonicalizeBluetoothAddress(device->GetAddress()); + if (base::Contains(devices_, canonical_address)) { + BLUETOOTH_LOG(DEBUG) << __func__ << ": Already seen device, skipping: " + << scan_result.address; + return; + } + + // Take copy of pointer before moving ownership. + BluetoothDeviceFloss* device_ptr = device.get(); + devices_.emplace(canonical_address, std::move(device)); device::BluetoothDevice::ServiceDataMap service_data_map; for (const auto& [uuid, bytes] : scan_result.service_data) { service_data_map[device::BluetoothUUID(uuid)] = bytes; } - device->UpdateAdvertisementData(scan_result.rssi, scan_result.flags, - scan_result.service_uuids, - scan_result.tx_power, service_data_map, - device::BluetoothDevice::ManufacturerDataMap( - scan_result.manufacturer_data.begin(), - scan_result.manufacturer_data.end())); + device_ptr->UpdateAdvertisementData( + scan_result.rssi, scan_result.flags, scan_result.service_uuids, + scan_result.tx_power, service_data_map, + device::BluetoothDevice::ManufacturerDataMap( + scan_result.manufacturer_data.begin(), + scan_result.manufacturer_data.end())); for (auto& observer : observers_) - observer.DeviceAdvertisementReceived(this, device, scan_result.rssi, + observer.DeviceAdvertisementReceived(this, device_ptr, scan_result.rssi, scan_result.adv_data); // All scanners share scan results for (const auto& [key, scanner] : scanners_) { - scanner->OnDeviceFound(device); + scanner->OnDeviceFound(device_ptr); + } +} + +void BluetoothAdapterFloss::ScanResultLost(ScanResult scan_result) { + // TODO(b/217274013): This needs to be wired once filters are in place and + // API has been defined on daemon + BLUETOOTH_LOG(DEBUG) << __func__ << ": " << scan_result.address; + + auto device = CreateBluetoothDeviceFloss(FlossDeviceId( + {.address = scan_result.address, .name = scan_result.name})); + std::string canonical_address = + device::CanonicalizeBluetoothAddress(device->GetAddress()); + if (!base::Contains(devices_, canonical_address)) { + BLUETOOTH_LOG(EVENT) << __func__ + << ": Device lost but never previously found: " + << scan_result.address; + return; + } + + BluetoothDeviceFloss* device_ptr = device.get(); + BluetoothDeviceFloss* found_ptr = + static_cast<BluetoothDeviceFloss*>(GetDevice(device->GetAddress())); + + // Only remove devices from devices_ that are not paired or connected. + if (!found_ptr || (!found_ptr->IsPaired() && !found_ptr->IsConnected())) { + devices_.erase(canonical_address); + } + + // All scanners share scan results + for (const auto& [key, scanner] : scanners_) { + scanner->OnDeviceLost(device_ptr); } }
diff --git a/device/bluetooth/floss/bluetooth_adapter_floss.h b/device/bluetooth/floss/bluetooth_adapter_floss.h index b272272..2f3f3c0 100644 --- a/device/bluetooth/floss/bluetooth_adapter_floss.h +++ b/device/bluetooth/floss/bluetooth_adapter_floss.h
@@ -138,6 +138,7 @@ uint8_t scanner_id, GattStatus status) override; void ScanResultReceived(ScanResult scan_result) override; + void ScanResultLost(ScanResult scan_result) override; protected: // BluetoothAdapter: @@ -152,6 +153,10 @@ // supported. void Init(); + // Helper function to create a Floss device + std::unique_ptr<BluetoothDeviceFloss> CreateBluetoothDeviceFloss( + FlossDeviceId device); + // Handle responses to most method calls void OnMethodResponse(base::OnceClosure callback, ErrorCallback error_callback,
diff --git a/device/bluetooth/floss/bluetooth_floss_unittest.cc b/device/bluetooth/floss/bluetooth_floss_unittest.cc index ccaf162..92dc9d5a 100644 --- a/device/bluetooth/floss/bluetooth_floss_unittest.cc +++ b/device/bluetooth/floss/bluetooth_floss_unittest.cc
@@ -620,6 +620,11 @@ EXPECT_EQ(1, delegate.sessions_started_); EXPECT_TRUE(base::Contains(delegate.devices_found_, kTestDeviceAddr)); + // Check that the scanned device is in the devices_ map so clients can + // access the device. + BluetoothDevice* device = adapter_->GetDevice(kTestDeviceAddr); + EXPECT_NE(nullptr, device); + adapter_->Shutdown(); EXPECT_EQ(1, delegate.sessions_invalidated_); }
diff --git a/device/bluetooth/floss/bluetooth_gatt_service_floss.cc b/device/bluetooth/floss/bluetooth_gatt_service_floss.cc index 32fb4cc..f98d1fb 100644 --- a/device/bluetooth/floss/bluetooth_gatt_service_floss.cc +++ b/device/bluetooth/floss/bluetooth_gatt_service_floss.cc
@@ -4,13 +4,21 @@ #include "device/bluetooth/floss/bluetooth_gatt_service_floss.h" +#include "base/containers/contains.h" +#include "device/bluetooth/floss/floss_dbus_manager.h" +#include "device/bluetooth/floss/floss_gatt_client.h" + namespace floss { BluetoothGattServiceFloss::BluetoothGattServiceFloss( BluetoothAdapterFloss* adapter) - : adapter_(adapter) {} + : adapter_(adapter) { + FlossDBusManager::Get()->GetGattClient()->AddObserver(this); +} -BluetoothGattServiceFloss::~BluetoothGattServiceFloss() = default; +BluetoothGattServiceFloss::~BluetoothGattServiceFloss() { + FlossDBusManager::Get()->GetGattClient()->RemoveObserver(this); +} BluetoothAdapterFloss* BluetoothGattServiceFloss::GetAdapter() const { return adapter_; @@ -24,4 +32,67 @@ // TODO(b/193686564) - Translate remote service gatt errors to correct values. return GattErrorCode::kUnknown; } + +void BluetoothGattServiceFloss::AddObserverForHandle( + int32_t handle, + FlossGattClientObserver* observer) { + DCHECK(!base::Contains(observer_by_handle_, handle)); + DCHECK(observer); + + if (observer) + observer_by_handle_[handle] = observer; +} + +void BluetoothGattServiceFloss::RemoveObserverForHandle(int32_t handle) { + DCHECK(base::Contains(observer_by_handle_, handle)); + + observer_by_handle_.erase(handle); +} + +void BluetoothGattServiceFloss::GattCharacteristicRead( + std::string address, + GattStatus status, + int32_t handle, + const std::vector<uint8_t>& data) { + if (base::Contains(observer_by_handle_, handle)) { + observer_by_handle_[handle]->GattCharacteristicRead(address, status, handle, + data); + } +} + +void BluetoothGattServiceFloss::GattCharacteristicWrite(std::string address, + GattStatus status, + int32_t handle) { + if (base::Contains(observer_by_handle_, handle)) { + observer_by_handle_[handle]->GattCharacteristicWrite(address, status, + handle); + } +} +void BluetoothGattServiceFloss::GattDescriptorRead( + std::string address, + GattStatus status, + int32_t handle, + const std::vector<uint8_t>& data) { + if (base::Contains(observer_by_handle_, handle)) { + observer_by_handle_[handle]->GattDescriptorRead(address, status, handle, + data); + } +} + +void BluetoothGattServiceFloss::GattDescriptorWrite(std::string address, + GattStatus status, + int32_t handle) { + if (base::Contains(observer_by_handle_, handle)) { + observer_by_handle_[handle]->GattDescriptorWrite(address, status, handle); + } +} + +void BluetoothGattServiceFloss::GattNotify(std::string address, + int32_t handle, + const std::vector<uint8_t>& data) { + if (base::Contains(observer_by_handle_, handle)) { + observer_by_handle_[handle]->GattNotify(address, handle, data); + } +} + } // namespace floss
diff --git a/device/bluetooth/floss/bluetooth_gatt_service_floss.h b/device/bluetooth/floss/bluetooth_gatt_service_floss.h index 23392db8dc..c6c3871 100644 --- a/device/bluetooth/floss/bluetooth_gatt_service_floss.h +++ b/device/bluetooth/floss/bluetooth_gatt_service_floss.h
@@ -4,6 +4,8 @@ #ifndef DEVICE_BLUETOOTH_FLOSS_BLUETOOTH_GATT_SERVICE_FLOSS_H_ #define DEVICE_BLUETOOTH_FLOSS_BLUETOOTH_GATT_SERVICE_FLOSS_H_ +#include <map> + #include "device/bluetooth/bluetooth_gatt_service.h" #include "device/bluetooth/floss/floss_gatt_client.h" @@ -13,7 +15,8 @@ // Subclass of |BluetoothGattService| for platforms that use Floss. class DEVICE_BLUETOOTH_EXPORT BluetoothGattServiceFloss - : public device::BluetoothGattService { + : public device::BluetoothGattService, + public FlossGattClientObserver { public: BluetoothGattServiceFloss(const BluetoothGattServiceFloss&) = delete; BluetoothGattServiceFloss& operator=(const BluetoothGattServiceFloss&) = @@ -26,10 +29,41 @@ static device::BluetoothGattService::GattErrorCode GattStatusToServiceError( const GattStatus status); + // Adds an observer for a specific handle. This observer will only get + // callbacks invoked for that specific handle. + void AddObserverForHandle(int32_t handle, FlossGattClientObserver* observer); + + // Removes the observer for a specific handle. + void RemoveObserverForHandle(int32_t handle); + + // FlossGattClientObserver overrides. + void GattCharacteristicRead(std::string address, + GattStatus status, + int32_t handle, + const std::vector<uint8_t>& data) override; + void GattCharacteristicWrite(std::string address, + GattStatus status, + int32_t handle) override; + void GattDescriptorRead(std::string address, + GattStatus status, + int32_t handle, + const std::vector<uint8_t>& data) override; + void GattDescriptorWrite(std::string address, + GattStatus status, + int32_t handle) override; + void GattNotify(std::string address, + int32_t handle, + const std::vector<uint8_t>& data) override; + protected: explicit BluetoothGattServiceFloss(BluetoothAdapterFloss* adapter); ~BluetoothGattServiceFloss() override; + // Cache of observers tied to a specific handle. When callbacks are observed + // for a specific handle within this GATT service, it is dispatched here to + // that specific observer. + std::map<int32_t, raw_ptr<FlossGattClientObserver>> observer_by_handle_; + private: // The adapter associated with (and which indirectly owns) this service. raw_ptr<BluetoothAdapterFloss> adapter_;
diff --git a/device/bluetooth/floss/bluetooth_remote_gatt_characteristic_floss.cc b/device/bluetooth/floss/bluetooth_remote_gatt_characteristic_floss.cc new file mode 100644 index 0000000..801c493 --- /dev/null +++ b/device/bluetooth/floss/bluetooth_remote_gatt_characteristic_floss.cc
@@ -0,0 +1,262 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#include "device/bluetooth/floss/bluetooth_remote_gatt_characteristic_floss.h" + +#include "base/memory/ptr_util.h" +#include "base/notreached.h" +#include "device/bluetooth/bluetooth_gatt_service.h" +#include "device/bluetooth/bluetooth_remote_gatt_descriptor.h" +#include "device/bluetooth/floss/bluetooth_gatt_service_floss.h" +#include "device/bluetooth/floss/bluetooth_remote_gatt_descriptor_floss.h" +#include "device/bluetooth/floss/bluetooth_remote_gatt_service_floss.h" +#include "device/bluetooth/floss/floss_dbus_manager.h" +#include "device/bluetooth/floss/floss_gatt_client.h" + +namespace floss { + +// static +std::unique_ptr<BluetoothRemoteGattCharacteristicFloss> +BluetoothRemoteGattCharacteristicFloss::Create( + BluetoothRemoteGattServiceFloss* service, + GattCharacteristic* characteristic) { + return base::WrapUnique( + new BluetoothRemoteGattCharacteristicFloss(service, characteristic)); +} + +BluetoothRemoteGattCharacteristicFloss::BluetoothRemoteGattCharacteristicFloss( + BluetoothRemoteGattServiceFloss* service, + GattCharacteristic* characteristic) + : characteristic_(characteristic), service_(service) { + DCHECK(service); + DCHECK(characteristic); + + service_->AddObserverForHandle(characteristic_->instance_id, this); + + for (GattDescriptor& d : characteristic_->descriptors) { + AddDescriptor( + BluetoothRemoteGattDescriptorFloss::Create(service_, this, &d)); + } +} + +BluetoothRemoteGattCharacteristicFloss:: + ~BluetoothRemoteGattCharacteristicFloss() { + service_->RemoveObserverForHandle(characteristic_->instance_id); +} + +std::string BluetoothRemoteGattCharacteristicFloss::GetIdentifier() const { + return service_->GetIdentifier() + GetUUID().canonical_value(); +} + +device::BluetoothUUID BluetoothRemoteGattCharacteristicFloss::GetUUID() const { + return characteristic_->uuid; +} + +BluetoothRemoteGattCharacteristicFloss::Properties +BluetoothRemoteGattCharacteristicFloss::GetProperties() const { + return characteristic_->properties; +} + +BluetoothRemoteGattCharacteristicFloss::Permissions +BluetoothRemoteGattCharacteristicFloss::GetPermissions() const { + return characteristic_->permissions; +} + +const std::vector<uint8_t>& BluetoothRemoteGattCharacteristicFloss::GetValue() + const { + return cached_data_; +} + +device::BluetoothRemoteGattService* +BluetoothRemoteGattCharacteristicFloss::GetService() const { + return static_cast<device::BluetoothRemoteGattService*>(service_.get()); +} + +bool BluetoothRemoteGattCharacteristicFloss::IsNotifying() const { + return has_notify_session_; +} + +void BluetoothRemoteGattCharacteristicFloss::ReadRemoteCharacteristic( + ValueCallback callback) { + DCHECK_GE(num_of_reads_in_progress_, 0); + ++num_of_reads_in_progress_; + + AuthRequired auth = GetAuthForRead(); + + FlossDBusManager::Get()->GetGattClient()->ReadCharacteristic( + base::BindOnce( + &BluetoothRemoteGattCharacteristicFloss::OnReadCharacteristic, + weak_ptr_factory_.GetWeakPtr(), std::move(callback)), + service_->GetDevice()->GetAddress(), characteristic_->instance_id, auth); +} + +void BluetoothRemoteGattCharacteristicFloss::WriteRemoteCharacteristic( + const std::vector<uint8_t>& value, + device::BluetoothRemoteGattCharacteristic::WriteType write_type, + base::OnceClosure callback, + ErrorCallback error_callback) { + floss::WriteType gatt_write_type = floss::WriteType::kWriteNoResponse; + if (write_type == + device::BluetoothRemoteGattCharacteristic::WriteType::kWithResponse) { + gatt_write_type = floss::WriteType::kWrite; + } + + WriteRemoteCharacteristicImpl(value, gatt_write_type, std::move(callback), + std::move(error_callback)); +} + +void BluetoothRemoteGattCharacteristicFloss:: + DeprecatedWriteRemoteCharacteristic(const std::vector<uint8_t>& value, + base::OnceClosure callback, + ErrorCallback error_callback) { + WriteRemoteCharacteristicImpl(value, floss::WriteType::kWriteNoResponse, + std::move(callback), std::move(error_callback)); +} + +#if BUILDFLAG(IS_CHROMEOS) +void BluetoothRemoteGattCharacteristicFloss::PrepareWriteRemoteCharacteristic( + const std::vector<uint8_t>& value, + base::OnceClosure callback, + ErrorCallback error_callback) { + WriteRemoteCharacteristicImpl(value, floss::WriteType::kWritePrepare, + std::move(callback), std::move(error_callback)); +} +#endif // BUILDFLAG(IS_CHROMEOS) + +void BluetoothRemoteGattCharacteristicFloss::WriteRemoteCharacteristicImpl( + const std::vector<uint8_t>& value, + floss::WriteType write_type, + base::OnceClosure callback, + ErrorCallback error_callback) { + AuthRequired auth = GetAuthForWrite(); + + FlossDBusManager::Get()->GetGattClient()->WriteCharacteristic( + base::BindOnce( + &BluetoothRemoteGattCharacteristicFloss::OnWriteCharacteristic, + weak_ptr_factory_.GetWeakPtr(), std::move(callback), + std::move(error_callback)), + service_->GetDevice()->GetAddress(), characteristic_->instance_id, + write_type, auth, value); +} + +void BluetoothRemoteGattCharacteristicFloss::GattCharacteristicRead( + std::string address, + GattStatus status, + int32_t handle, + const std::vector<uint8_t>& data) { + if (handle != characteristic_->instance_id || + address != service_->GetDevice()->GetAddress()) { + return; + } + + --num_of_reads_in_progress_; + DCHECK_GE(num_of_reads_in_progress_, 0); + + if (status == GattStatus::kSuccess) { + cached_data_ = data; + std::move(pending_read_callback_) + .Run(/*error_code=*/absl::nullopt, cached_data_); + } else { + std::move(pending_read_callback_) + .Run(BluetoothGattServiceFloss::GattStatusToServiceError(status), {}); + } +} + +void BluetoothRemoteGattCharacteristicFloss::GattCharacteristicWrite( + std::string address, + GattStatus status, + int32_t handle) { + if (handle != characteristic_->instance_id || + address != service_->GetDevice()->GetAddress()) { + return; + } + + auto [callback, error_callback] = std::move(pending_write_callbacks_); + + if (status == GattStatus::kSuccess) { + std::move(callback).Run(); + } else { + std::move(error_callback) + .Run(BluetoothGattServiceFloss::GattStatusToServiceError(status)); + } +} + +void BluetoothRemoteGattCharacteristicFloss::OnReadCharacteristic( + ValueCallback callback, + DBusResult<Void> result) { + if (!result.has_value()) { + --num_of_reads_in_progress_; + DCHECK_GE(num_of_reads_in_progress_, 0); + + std::move(callback).Run( + /*error_code=*/BluetoothGattServiceFloss::GattErrorCode::kFailed, {}); + return; + } + + pending_read_callback_ = std::move(callback); +} + +void BluetoothRemoteGattCharacteristicFloss::OnWriteCharacteristic( + base::OnceClosure callback, + ErrorCallback error_callback, + DBusResult<Void> result) { + if (!result.has_value()) { + std::move(error_callback) + .Run(/*error_code=*/BluetoothGattServiceFloss::GattErrorCode::kFailed); + return; + } + + pending_write_callbacks_ = + std::make_pair(std::move(callback), std::move(error_callback)); +} + +void BluetoothRemoteGattCharacteristicFloss::SubscribeToNotifications( + device::BluetoothRemoteGattDescriptor* ccc_descriptor, +#if BUILDFLAG(IS_CHROMEOS) + NotificationType notification_type, +#endif // BUILDFLAG(IS_CHROMEOS) + base::OnceClosure callback, + ErrorCallback error_callback) { + NOTIMPLEMENTED(); +} + +void BluetoothRemoteGattCharacteristicFloss::UnsubscribeFromNotifications( + device::BluetoothRemoteGattDescriptor* ccc_descriptor, + base::OnceClosure callback, + ErrorCallback error_callback) { + NOTIMPLEMENTED(); +} + +AuthRequired BluetoothRemoteGattCharacteristicFloss::GetAuthForRead() const { + AuthRequired auth = AuthRequired::kNoAuth; + Properties props = GetProperties(); + + if (props & PROPERTY_READ_ENCRYPTED_AUTHENTICATED) { + auth = AuthRequired::kReqMitm; + } else if (props & PROPERTY_READ_ENCRYPTED) { + auth = AuthRequired::kNoMitm; + } + + return auth; +} + +AuthRequired BluetoothRemoteGattCharacteristicFloss::GetAuthForWrite() const { + AuthRequired auth = AuthRequired::kNoAuth; + Properties props = GetProperties(); + + if (props & PROPERTY_WRITE_ENCRYPTED_AUTHENTICATED) { + auth = AuthRequired::kReqMitm; + if (props & PROPERTY_AUTHENTICATED_SIGNED_WRITES) { + auth = AuthRequired::kSignedReqMitm; + } + } else if (props & PROPERTY_WRITE_ENCRYPTED) { + auth = AuthRequired::kNoMitm; + if (props & PROPERTY_AUTHENTICATED_SIGNED_WRITES) { + auth = AuthRequired::kSignedNoMitm; + } + } + + return auth; +} + +} // namespace floss
diff --git a/device/bluetooth/floss/bluetooth_remote_gatt_characteristic_floss.h b/device/bluetooth/floss/bluetooth_remote_gatt_characteristic_floss.h new file mode 100644 index 0000000..8732ae4f --- /dev/null +++ b/device/bluetooth/floss/bluetooth_remote_gatt_characteristic_floss.h
@@ -0,0 +1,149 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#ifndef DEVICE_BLUETOOTH_FLOSS_BLUETOOTH_REMOTE_GATT_CHARACTERISTIC_FLOSS_H_ +#define DEVICE_BLUETOOTH_FLOSS_BLUETOOTH_REMOTE_GATT_CHARACTERISTIC_FLOSS_H_ + +#include "device/bluetooth/bluetooth_remote_gatt_characteristic.h" +#include "device/bluetooth/floss/floss_dbus_client.h" +#include "device/bluetooth/floss/floss_gatt_client.h" + +namespace device { +class BluetoothRemoteGattDescriptor; +} + +namespace floss { + +class BluetoothRemoteGattServiceFloss; + +class BluetoothRemoteGattCharacteristicFloss + : public device::BluetoothRemoteGattCharacteristic, + public FlossGattClientObserver { + public: + // Construct remote characteristic. + static std::unique_ptr<BluetoothRemoteGattCharacteristicFloss> Create( + BluetoothRemoteGattServiceFloss* service, + GattCharacteristic* characteristic); + + BluetoothRemoteGattCharacteristicFloss( + const BluetoothRemoteGattCharacteristicFloss&) = delete; + BluetoothRemoteGattCharacteristicFloss& operator=( + const BluetoothRemoteGattCharacteristicFloss&) = delete; + + ~BluetoothRemoteGattCharacteristicFloss() override; + + // device::BluetoothGattCharacteristic overrides. + std::string GetIdentifier() const override; + device::BluetoothUUID GetUUID() const override; + Properties GetProperties() const override; + Permissions GetPermissions() const override; + + // device::BluetoothRemoteGattCharacteristic overrides. + const std::vector<uint8_t>& GetValue() const override; + device::BluetoothRemoteGattService* GetService() const override; + bool IsNotifying() const override; + void ReadRemoteCharacteristic(ValueCallback callback) override; + void WriteRemoteCharacteristic( + const std::vector<uint8_t>& value, + device::BluetoothRemoteGattCharacteristic::WriteType write_type, + base::OnceClosure callback, + ErrorCallback error_callback) override; + // While this function should be deprecated, it is still called in many + // places. This simply calls |WriteRemoteCharacteristic| with a default value + // for |WriteType| to make it easy to remove in the future. + void DeprecatedWriteRemoteCharacteristic( + const std::vector<uint8_t>& value, + base::OnceClosure callback, + ErrorCallback error_callback) override; +#if BUILDFLAG(IS_CHROMEOS) + void PrepareWriteRemoteCharacteristic(const std::vector<uint8_t>& value, + base::OnceClosure callback, + ErrorCallback error_callback) override; +#endif // BUILDFLAG(IS_CHROMEOS) + + // floss::FlossGattClientObserver overrides. + void GattCharacteristicRead(std::string address, + GattStatus status, + int32_t handle, + const std::vector<uint8_t>& data) override; + + void GattCharacteristicWrite(std::string address, + GattStatus status, + int32_t handle) override; + + // Authentication required to read this characteristic and its descriptors. + AuthRequired GetAuthForRead() const; + + // Authentication required to write to this characteristic and its + // descriptors. + AuthRequired GetAuthForWrite() const; + + protected: + // Additional BluetoothRemoteGattCharacteristic overrides. +#if BUILDFLAG(IS_CHROMEOS) + void SubscribeToNotifications( + device::BluetoothRemoteGattDescriptor* ccc_descriptor, + NotificationType notification_type, + base::OnceClosure callback, + ErrorCallback error_callback) override; +#else + void SubscribeToNotifications( + device::BluetoothRemoteGattDescriptor* ccc_descriptor, + base::OnceClosure callback, + ErrorCallback error_callback) override; +#endif // BUILDFLAG(IS_CHROMEOS) + void UnsubscribeFromNotifications( + device::BluetoothRemoteGattDescriptor* ccc_descriptor, + base::OnceClosure callback, + ErrorCallback error_callback) override; + + // Common impl for various writes calls. + void WriteRemoteCharacteristicImpl(const std::vector<uint8_t>& value, + floss::WriteType write_type, + base::OnceClosure callback, + ErrorCallback error_callback); + + // Handle result of calling |ReadRemoteCharacteristic|. + void OnReadCharacteristic(ValueCallback callback, DBusResult<Void> result); + // Handle result of calling |WriteRemoteCharacteristic|. + void OnWriteCharacteristic(base::OnceClosure callback, + ErrorCallback error_callback, + DBusResult<Void> result); + + private: + friend class BluetoothRemoteGattServiceFloss; + + BluetoothRemoteGattCharacteristicFloss( + BluetoothRemoteGattServiceFloss* service, + GattCharacteristic* characteristic); + + // Cached data from the last read that was done. + std::vector<uint8_t> cached_data_; + + // Characteristic represented by this class. The contents are owned by the + // |service_| so we keep a pointer to it only here. + raw_ptr<GattCharacteristic> characteristic_; + + // True if there exists a notify session on this handle. + bool has_notify_session_ = false; + + // Number of gatt read requests in progress. + int num_of_reads_in_progress_; + + // Callback for pending |ReadRemoteCharacteristic|. + ValueCallback pending_read_callback_; + + // Callback for pending |WriteRemoteCharacteristic|. + std::pair<base::OnceClosure, ErrorCallback> pending_write_callbacks_; + + // Service which this characteristic belongs to. We can keep a raw_ptr<> here + // because the Service linked here owns a unique_ptr<> to this class instance + // so the lifetime of the two objects are tied together. + raw_ptr<BluetoothRemoteGattServiceFloss> service_; + + base::WeakPtrFactory<BluetoothRemoteGattCharacteristicFloss> + weak_ptr_factory_{this}; +}; +} // namespace floss + +#endif // DEVICE_BLUETOOTH_FLOSS_BLUETOOTH_REMOTE_GATT_CHARACTERISTIC_FLOSS_H_
diff --git a/device/bluetooth/floss/bluetooth_remote_gatt_descriptor_floss.cc b/device/bluetooth/floss/bluetooth_remote_gatt_descriptor_floss.cc new file mode 100644 index 0000000..35438dd2 --- /dev/null +++ b/device/bluetooth/floss/bluetooth_remote_gatt_descriptor_floss.cc
@@ -0,0 +1,189 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "device/bluetooth/floss/bluetooth_remote_gatt_descriptor_floss.h" + +#include <memory> + +#include "base/memory/ptr_util.h" +#include "device/bluetooth/floss/bluetooth_adapter_floss.h" +#include "device/bluetooth/floss/bluetooth_remote_gatt_characteristic_floss.h" +#include "device/bluetooth/floss/bluetooth_remote_gatt_service_floss.h" +#include "device/bluetooth/floss/floss_dbus_manager.h" +#include "device/bluetooth/floss/floss_gatt_client.h" + +namespace floss { + +// static +std::unique_ptr<BluetoothRemoteGattDescriptorFloss> +BluetoothRemoteGattDescriptorFloss::Create( + BluetoothRemoteGattServiceFloss* service, + BluetoothRemoteGattCharacteristicFloss* characteristic, + GattDescriptor* descriptor) { + return base::WrapUnique(new BluetoothRemoteGattDescriptorFloss( + service, characteristic, descriptor)); +} + +BluetoothRemoteGattDescriptorFloss::BluetoothRemoteGattDescriptorFloss( + BluetoothRemoteGattServiceFloss* service, + BluetoothRemoteGattCharacteristicFloss* characteristic, + GattDescriptor* descriptor) + : characteristic_(characteristic), + descriptor_(descriptor), + service_(service) { + DCHECK(service); + DCHECK(characteristic); + DCHECK(descriptor); + + service_->AddObserverForHandle(descriptor_->instance_id, this); +} + +BluetoothRemoteGattDescriptorFloss::~BluetoothRemoteGattDescriptorFloss() { + service_->RemoveObserverForHandle(descriptor_->instance_id); +} + +std::string BluetoothRemoteGattDescriptorFloss::GetIdentifier() const { + return characteristic_->GetIdentifier() + GetUUID().canonical_value(); +} + +device::BluetoothUUID BluetoothRemoteGattDescriptorFloss::GetUUID() const { + return descriptor_->uuid; +} + +const std::vector<uint8_t>& BluetoothRemoteGattDescriptorFloss::GetValue() + const { + return cached_data_; +} + +device::BluetoothRemoteGattCharacteristic* +BluetoothRemoteGattDescriptorFloss::GetCharacteristic() const { + return static_cast<device::BluetoothRemoteGattCharacteristic*>( + characteristic_.get()); +} + +device::BluetoothRemoteGattCharacteristic::Permissions +BluetoothRemoteGattDescriptorFloss::GetPermissions() const { + return descriptor_->permissions; +} + +void BluetoothRemoteGattDescriptorFloss::ReadRemoteDescriptor( + ValueCallback callback) { + DCHECK_GE(num_of_reads_in_progress_, 0); + ++num_of_reads_in_progress_; + + AuthRequired auth = characteristic_->GetAuthForRead(); + + FlossDBusManager::Get()->GetGattClient()->ReadDescriptor( + base::BindOnce(&BluetoothRemoteGattDescriptorFloss::OnReadDescriptor, + weak_ptr_factory_.GetWeakPtr(), std::move(callback)), + service_->GetDevice()->GetAddress(), descriptor_->instance_id, auth); +} + +void BluetoothRemoteGattDescriptorFloss::WriteRemoteDescriptor( + const std::vector<uint8_t>& new_value, + base::OnceClosure callback, + ErrorCallback error_callback) { + AuthRequired auth = characteristic_->GetAuthForWrite(); + + FlossDBusManager::Get()->GetGattClient()->WriteDescriptor( + base::BindOnce(&BluetoothRemoteGattDescriptorFloss::OnWriteDescriptor, + weak_ptr_factory_.GetWeakPtr(), std::move(callback), + std::move(error_callback)), + service_->GetDevice()->GetAddress(), descriptor_->instance_id, auth, + new_value); +} + +void BluetoothRemoteGattDescriptorFloss::GattDescriptorRead( + std::string address, + GattStatus status, + int32_t handle, + const std::vector<uint8_t>& data) { + if (handle != descriptor_->instance_id || + address != service_->GetDevice()->GetAddress()) { + return; + } + + --num_of_reads_in_progress_; + DCHECK_GE(num_of_reads_in_progress_, 0); + + if (status == GattStatus::kSuccess) { + cached_data_ = data; + std::move(pending_read_callback_) + .Run(/*error_code=*/absl::nullopt, cached_data_); + + NotifyValueChanged(); + } else { + std::move(pending_read_callback_) + .Run(BluetoothGattServiceFloss::GattStatusToServiceError(status), {}); + } +} + +void BluetoothRemoteGattDescriptorFloss::GattDescriptorWrite( + std::string address, + GattStatus status, + int32_t handle) { + if (handle != descriptor_->instance_id || + address != service_->GetDevice()->GetAddress()) { + return; + } + + auto [callback, error_callback] = std::move(pending_write_callbacks_); + + if (status == GattStatus::kSuccess) { + std::move(callback).Run(); + } else { + std::move(error_callback) + .Run(BluetoothGattServiceFloss::GattStatusToServiceError(status)); + } +} + +void BluetoothRemoteGattDescriptorFloss::GattNotify( + std::string address, + int32_t handle, + const std::vector<uint8_t>& data) { + if (handle != descriptor_->instance_id || + address != service_->GetDevice()->GetAddress()) { + return; + } + + cached_data_ = data; + NotifyValueChanged(); +} + +void BluetoothRemoteGattDescriptorFloss::OnReadDescriptor( + ValueCallback callback, + DBusResult<Void> result) { + if (!result.has_value()) { + --num_of_reads_in_progress_; + DCHECK_GE(num_of_reads_in_progress_, 0); + + std::move(callback).Run(BluetoothGattServiceFloss::GattErrorCode::kFailed, + {}); + return; + } + + pending_read_callback_ = std::move(callback); +} + +void BluetoothRemoteGattDescriptorFloss::OnWriteDescriptor( + base::OnceClosure callback, + ErrorCallback error_callback, + DBusResult<Void> result) { + if (!result.has_value()) { + std::move(error_callback) + .Run(BluetoothGattServiceFloss::GattErrorCode::kFailed); + return; + } + + pending_write_callbacks_ = + std::make_pair(std::move(callback), std::move(error_callback)); +} + +void BluetoothRemoteGattDescriptorFloss::NotifyValueChanged() { + DCHECK(service_->GetAdapter()); + + service_->GetAdapter()->NotifyGattDescriptorValueChanged(this, cached_data_); +} + +} // namespace floss
diff --git a/device/bluetooth/floss/bluetooth_remote_gatt_descriptor_floss.h b/device/bluetooth/floss/bluetooth_remote_gatt_descriptor_floss.h new file mode 100644 index 0000000..43552e63 --- /dev/null +++ b/device/bluetooth/floss/bluetooth_remote_gatt_descriptor_floss.h
@@ -0,0 +1,109 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#ifndef DEVICE_BLUETOOTH_FLOSS_BLUETOOTH_REMOTE_GATT_DESCRIPTOR_FLOSS_H_ +#define DEVICE_BLUETOOTH_FLOSS_BLUETOOTH_REMOTE_GATT_DESCRIPTOR_FLOSS_H_ + +#include <memory> + +#include "base/memory/raw_ptr.h" +#include "base/memory/weak_ptr.h" +#include "device/bluetooth/bluetooth_remote_gatt_characteristic.h" +#include "device/bluetooth/bluetooth_remote_gatt_descriptor.h" +#include "device/bluetooth/floss/floss_gatt_client.h" +#include "device/bluetooth/public/cpp/bluetooth_uuid.h" + +namespace floss { + +class BluetoothRemoteGattCharacteristicFloss; +class BluetoothRemoteGattServiceFloss; +struct GattDescriptor; + +class BluetoothRemoteGattDescriptorFloss + : public device::BluetoothRemoteGattDescriptor, + public FlossGattClientObserver { + public: + // Construct remote descriptor. + static std::unique_ptr<BluetoothRemoteGattDescriptorFloss> Create( + BluetoothRemoteGattServiceFloss* service, + BluetoothRemoteGattCharacteristicFloss* characteristic, + GattDescriptor* descriptor); + + BluetoothRemoteGattDescriptorFloss( + const BluetoothRemoteGattDescriptorFloss&) = delete; + BluetoothRemoteGattDescriptorFloss& operator=( + const BluetoothRemoteGattDescriptorFloss&) = delete; + + ~BluetoothRemoteGattDescriptorFloss() override; + + // device::BluetoothRemoteGattDescriptor overrides. + std::string GetIdentifier() const override; + device::BluetoothUUID GetUUID() const override; + const std::vector<uint8_t>& GetValue() const override; + device::BluetoothRemoteGattCharacteristic* GetCharacteristic() const override; + device::BluetoothRemoteGattCharacteristic::Permissions GetPermissions() + const override; + void ReadRemoteDescriptor(ValueCallback callback) override; + void WriteRemoteDescriptor(const std::vector<uint8_t>& new_value, + base::OnceClosure callback, + ErrorCallback error_callback) override; + + // FlossGattClientObserver overrides. + void GattDescriptorRead(std::string address, + GattStatus status, + int32_t handle, + const std::vector<uint8_t>& data) override; + void GattDescriptorWrite(std::string address, + GattStatus status, + int32_t handle) override; + void GattNotify(std::string address, + int32_t handle, + const std::vector<uint8_t>& data) override; + + private: + BluetoothRemoteGattDescriptorFloss( + BluetoothRemoteGattServiceFloss* service, + BluetoothRemoteGattCharacteristicFloss* characteristic, + GattDescriptor* descriptor); + + // Handle result of calling |ReadRemoteDescriptor|. + void OnReadDescriptor(ValueCallback callback, DBusResult<Void> result); + + // Handle result of calling |WriteRemoteCharacateristic|. + void OnWriteDescriptor(base::OnceClosure callback, + ErrorCallback error_callback, + DBusResult<Void> result); + + // Send notifications to observer on adapter. + void NotifyValueChanged(); + + // Cached data from the last read that was done. + std::vector<uint8_t> cached_data_; + + // Characteristic which this descriptor belongs to. + raw_ptr<BluetoothRemoteGattCharacteristicFloss> characteristic_; + + // Descriptor represented by this class. The contents are owned by the + // parent service so we keep a pointer to it only here. + raw_ptr<GattDescriptor> descriptor_; + + // Number of gatt read requests in progress. + int num_of_reads_in_progress_; + + // Callback for pending |ReadRemoteDescriptor|. + ValueCallback pending_read_callback_; + + // Callback for pending |WriteRemoteDescriptor|. + std::pair<base::OnceClosure, ErrorCallback> pending_write_callbacks_; + + // Service where this descriptor belongs. The |service_| pointer owns this + // descriptor so we can keep a pointer to it safely. + raw_ptr<BluetoothRemoteGattServiceFloss> service_; + + base::WeakPtrFactory<BluetoothRemoteGattDescriptorFloss> weak_ptr_factory_{ + this}; +}; + +} // namespace floss + +#endif // DEVICE_BLUETOOTH_FLOSS_BLUETOOTH_REMOTE_GATT_DESCRIPTOR_FLOSS_H_
diff --git a/device/bluetooth/floss/bluetooth_remote_gatt_service_floss.cc b/device/bluetooth/floss/bluetooth_remote_gatt_service_floss.cc index 682dc97..9f4dfe8 100644 --- a/device/bluetooth/floss/bluetooth_remote_gatt_service_floss.cc +++ b/device/bluetooth/floss/bluetooth_remote_gatt_service_floss.cc
@@ -5,6 +5,7 @@ #include "base/memory/ptr_util.h" #include "device/bluetooth/floss/bluetooth_device_floss.h" +#include "device/bluetooth/floss/bluetooth_remote_gatt_characteristic_floss.h" namespace floss { @@ -27,7 +28,9 @@ primary_(primary), remote_service_(remote_service), device_(device) { - // TODO(b/193685841) - Iterate characteristics + for (GattCharacteristic& c : remote_service_.characteristics) { + AddCharacteristic(BluetoothRemoteGattCharacteristicFloss::Create(this, &c)); + } } BluetoothRemoteGattServiceFloss::~BluetoothRemoteGattServiceFloss() = default;
diff --git a/device/bluetooth/floss/floss_gatt_client.cc b/device/bluetooth/floss/floss_gatt_client.cc index 8667ddb..51f5f4ce 100644 --- a/device/bluetooth/floss/floss_gatt_client.cc +++ b/device/bluetooth/floss/floss_gatt_client.cc
@@ -280,20 +280,30 @@ remote_device, handle, auth_required, data); } -void FlossGattClient::RegisterForNotification(ResponseCallback<Void> callback, - const std::string& remote_device, - const int32_t handle) { +void FlossGattClient::RegisterForNotification( + ResponseCallback<GattStatus> callback, + const std::string& remote_device, + const int32_t handle) { const bool enable_notification = true; - CallGattMethod<Void>(std::move(callback), gatt::kRegisterForNotification, - client_id_, remote_device, handle, enable_notification); + CallGattMethod<Void>( + base::BindOnce(&FlossGattClient::OnRegisterNotificationResponse, + weak_ptr_factory_.GetWeakPtr(), std::move(callback), + enable_notification), + gatt::kRegisterForNotification, client_id_, remote_device, handle, + enable_notification); } -void FlossGattClient::UnregisterNotification(ResponseCallback<Void> callback, - const std::string& remote_device, - const int32_t handle) { +void FlossGattClient::UnregisterNotification( + ResponseCallback<GattStatus> callback, + const std::string& remote_device, + const int32_t handle) { const bool enable_notification = false; - CallGattMethod<Void>(std::move(callback), gatt::kRegisterForNotification, - client_id_, remote_device, handle, enable_notification); + CallGattMethod<Void>( + base::BindOnce(&FlossGattClient::OnRegisterNotificationResponse, + weak_ptr_factory_.GetWeakPtr(), std::move(callback), + enable_notification), + gatt::kRegisterForNotification, client_id_, remote_device, handle, + enable_notification); } void FlossGattClient::ReadRemoteRssi(ResponseCallback<Void> callback, @@ -511,4 +521,19 @@ } } +// TODO(b/193685841) - Floss currently doesn't emit a callback when +// a notification registers. Once a callback is available, we should report that +// via the callback here instead. +void FlossGattClient::OnRegisterNotificationResponse( + ResponseCallback<GattStatus> callback, + bool is_registering, + DBusResult<Void> result) { + if (!result.has_value()) { + std::move(callback).Run(GattStatus::kError); + return; + } + + std::move(callback).Run(GattStatus::kSuccess); +} + } // namespace floss
diff --git a/device/bluetooth/floss/floss_gatt_client.h b/device/bluetooth/floss/floss_gatt_client.h index 80bbbc8..a148720 100644 --- a/device/bluetooth/floss/floss_gatt_client.h +++ b/device/bluetooth/floss/floss_gatt_client.h
@@ -294,12 +294,12 @@ const std::vector<uint8_t> data); // Register for updates on a specific characteristic. - virtual void RegisterForNotification(ResponseCallback<Void> callback, + virtual void RegisterForNotification(ResponseCallback<GattStatus> callback, const std::string& remote_device, const int32_t handle); // Unregister for updates on a specific characteristic. - virtual void UnregisterNotification(ResponseCallback<Void> callback, + virtual void UnregisterNotification(ResponseCallback<GattStatus> callback, const std::string& remote_device, const int32_t handle); @@ -366,6 +366,10 @@ GattStatus status) override; void GattServiceChanged(std::string address) override; + void OnRegisterNotificationResponse(ResponseCallback<GattStatus> callback, + bool is_registering, + DBusResult<Void> result); + // Managed by FlossDBusManager - we keep local pointer to access object proxy. base::raw_ptr<dbus::Bus> bus_ = nullptr;
diff --git a/device/bluetooth/floss/floss_lescan_client.h b/device/bluetooth/floss/floss_lescan_client.h index 5d85703..eed346d6 100644 --- a/device/bluetooth/floss/floss_lescan_client.h +++ b/device/bluetooth/floss/floss_lescan_client.h
@@ -73,6 +73,9 @@ // A scan result has been received virtual void ScanResultReceived(ScanResult scan_result) {} + + // A scan result has been lost + virtual void ScanResultLost(ScanResult scan_result) {} }; // Low-level interface to Floss's LE Scan API.
diff --git a/docs/testing/gtest_flake_tips.md b/docs/testing/gtest_flake_tips.md index 5077c81..c3fb734 100644 --- a/docs/testing/gtest_flake_tips.md +++ b/docs/testing/gtest_flake_tips.md
@@ -51,6 +51,25 @@ patch with the debug logging and flaky test enabled to try running the bot to reproduce the flake with more information. +Another good solution is to use +*Swarming* -- which will let you mimic bot conditions to better reproduce flakes +that actually occur on CQ bots. + +### Swarming +For a more detailed dive into swarming you can follow this +[link](https://chromium.googlesource.com/chromium/src/+/master/docs/workflow/debugging-with-swarming.md#authenticating). + +As an example, suppose we have built Chrome using the GN args from +above into a directory `out/linux-rel`, then we can simply run this command +within the `chromium/src` directory: + +``` +tools/run-swarmed.py out/linux-rel browser_tests -- --gtest_filter="*<YOUR_TEST_NAME_HERE>*" --gtest_repeat=20 --gtest_also_run_disabled_tests +``` + +This allows us to quickly iterate over errors using logs to reproduce flakes and +even fix them! + >TODO: Add more tips for reproducing flaky tests ## Debugging the flaky test @@ -73,6 +92,9 @@ destroyed before JS may read their values (e.g. [flaky PaymentAppBrowserTest](https://chromium.googlesource.com/chromium/src/+/6089f3480c5036c73464661b3b1b6b82807b56a3)). +For browsertest flakes that involve dialogs or widgets, make sure that test +objects are not destroyed because focus is lost on the dialog (e.g [flaky AccessCodeCastHandlerBrowserTest](https://chromium-review.googlesource.com/c/chromium/src/+/3951132)). + ## Preventing similar flakes Once you understand the problem and have a fix for the test, think about how the @@ -82,4 +104,4 @@ [flake_portal_occurrences]: images/flake_portal_occurrences.png [flaky_build_step]: images/flaky_build_step.png -[bot_gn_args]: images/bot_gn_args.png \ No newline at end of file +[bot_gn_args]: images/bot_gn_args.png
diff --git a/docs/testing/web_test_expectations.md b/docs/testing/web_test_expectations.md index 3f3b2008..e51d0c09 100644 --- a/docs/testing/web_test_expectations.md +++ b/docs/testing/web_test_expectations.md
@@ -105,36 +105,25 @@ [tryserver.blink](https://ci.chromium.org/p/chromium/g/tryserver.blink/builders). In addition, this will also trigger the CQ try builders that run blink web tests. linux-rel, mac-rel and win10_chromium_x64_rel_ng. - * Optionally one can choose to trigger only blink try bots alone. - Run the tool with the option - - `blink_tool.py rebaseline-cl --use-blink-try-bots-only` - * If you would like to rebaseline for flag specific builders, use the flag-specific option. - Rebaseline for highdpi and disable-layout-ng are - supported for now. For example, to rebaseline for highdpi, use - `blink_tool.py rebaseline-cl --flag-specific=highdpi`. This will trigger - only the highdpi try builder. Since this is an experimental builder at this time, - this will not be triggered with the default or '--use-blink-try-bots-only' options. - * If you need to trigger all the builders including supported flag-specific builders, run the - tool with desired options multiple times. There is no need to wait for the builders - triggered with default option to finish before triggering the flag specific - builders and vice versa. 3. Wait for all try jobs to finish. 4. Run `blink_tool.py rebaseline-cl` again to fetch new baselines. By default, this will download new baselines for any failing tests in the blink try jobs and CQ try bots. - * Again, there is an option to use only blink try jobs results for rebaselining. - (Run `blink_tool.py rebaseline-cl --help` for more specific options.) - * To rebaseline for flag-specific builders (using highdpi as an example again), runs - - `blink_tool.py rebaseline-cl --flag-specific=highdpi` which will download baselines - for any failures in the highdpi run only. We suggest running flag-specific rebaseline - after non-flag-specific rebaseline as baseline optimization is not - implemented for flag-specific rebaseline yet. 5. Commit the new baselines and upload a new patch. This way, the new baselines can be reviewed along with the changes, which helps the reviewer verify that the new baselines are correct. It also means that there is no period of time when the web test results are ignored. +#### Handle bot timeouts + +When a change will cause many tests to fail, the try jobs may exit early because +the number of failures exceeds the limit, or the try jobs may timeout because +more time is needed for the retries. Rebaseline based on such results are not +suggested. The solution is to temporarily increase the number of shards in +[test_suite_exceptions.pyl](https://source.chromium.org/chromium/chromium/src/+/main:testing/buildbot/test_suite_exceptions.pyl) in your CL. +Change the values back to its original value before sending the CL to CQ. + #### Options The tests which `blink_tool.py rebaseline-cl` tries to download new baselines for
diff --git a/extensions/browser/event_listener_map.cc b/extensions/browser/event_listener_map.cc index e74d743..72f9018 100644 --- a/extensions/browser/event_listener_map.cc +++ b/extensions/browser/event_listener_map.cc
@@ -30,10 +30,17 @@ const std::string& extension_id, content::RenderProcessHost* process, std::unique_ptr<base::DictionaryValue> filter) { - return base::WrapUnique( - new EventListener(event_name, extension_id, GURL(), process, false, - blink::mojom::kInvalidServiceWorkerVersionId, - kMainThreadId, std::move(filter))); + // The process parameter is nullptr when creating lazy listener. + // TODO(richardzh): Update lazy listener creation to either calling + // ForExtensionServiceWorker instead, or update this method signature to add a + // BrowserContext parameter. + content::BrowserContext* browser_context = + process ? process->GetBrowserContext() : nullptr; + + return base::WrapUnique(new EventListener( + event_name, extension_id, GURL(), process, browser_context, false, + blink::mojom::kInvalidServiceWorkerVersionId, kMainThreadId, + std::move(filter))); } // static @@ -48,26 +55,33 @@ // we dispatched events to processes more intelligently this could be avoided. return base::WrapUnique(new EventListener( event_name, ExtensionId(), url::Origin::Create(listener_url).GetURL(), - process, false, blink::mojom::kInvalidServiceWorkerVersionId, - kMainThreadId, std::move(filter))); + process, process->GetBrowserContext(), false, + blink::mojom::kInvalidServiceWorkerVersionId, kMainThreadId, + std::move(filter))); } std::unique_ptr<EventListener> EventListener::ForExtensionServiceWorker( const std::string& event_name, const std::string& extension_id, content::RenderProcessHost* process, + content::BrowserContext* browser_context, const GURL& service_worker_scope, int64_t service_worker_version_id, int worker_thread_id, std::unique_ptr<base::DictionaryValue> filter) { return base::WrapUnique(new EventListener( - event_name, extension_id, service_worker_scope, process, true, - service_worker_version_id, worker_thread_id, std::move(filter))); + event_name, extension_id, service_worker_scope, process, browser_context, + true, service_worker_version_id, worker_thread_id, std::move(filter))); } EventListener::~EventListener() {} bool EventListener::Equals(const EventListener* other) const { + // TODO(richardzh): compare browser_context_. We are making a change with two + // steps here. The first step is simply add the browser_context_ member. The + // next step is to compare this member and create separate lazy listeners for + // regular and incognito(split) context. + // We don't check matcher_id equality because we want a listener with a // filter that hasn't been added to EventFilter to match one that is // equivalent but has. @@ -86,10 +100,10 @@ if (filter_) filter_copy = base::DictionaryValue::From( base::Value::ToUniquePtrValue(filter_->Clone())); - return base::WrapUnique( - new EventListener(event_name_, extension_id_, listener_url_, process_, - is_for_service_worker_, service_worker_version_id_, - worker_thread_id_, std::move(filter_copy))); + return base::WrapUnique(new EventListener( + event_name_, extension_id_, listener_url_, process_, browser_context_, + is_for_service_worker_, service_worker_version_id_, worker_thread_id_, + std::move(filter_copy))); } bool EventListener::IsLazy() const { @@ -107,14 +121,11 @@ process_ = nullptr; } -content::BrowserContext* EventListener::GetBrowserContext() const { - return process_ ? process_->GetBrowserContext() : nullptr; -} - EventListener::EventListener(const std::string& event_name, const std::string& extension_id, const GURL& listener_url, content::RenderProcessHost* process, + content::BrowserContext* browser_context, bool is_for_service_worker, int64_t service_worker_version_id, int worker_thread_id, @@ -123,6 +134,7 @@ extension_id_(extension_id), listener_url_(listener_url), process_(process), + browser_context_(browser_context), is_for_service_worker_(is_for_service_worker), service_worker_version_id_(service_worker_version_id), worker_thread_id_(worker_thread_id), @@ -284,11 +296,12 @@ } void EventListenerMap::LoadUnfilteredWorkerListeners( + content::BrowserContext* browser_context, const ExtensionId& extension_id, const std::set<std::string>& event_names) { for (const auto& name : event_names) { AddListener(EventListener::ForExtensionServiceWorker( - name, extension_id, nullptr, + name, extension_id, nullptr, browser_context, // TODO(lazyboy): We need to store correct scopes of each worker into // ExtensionPrefs for events. This currently assumes all workers are // registered in the '/' scope. https://crbug.com/773103. @@ -298,6 +311,7 @@ } void EventListenerMap::LoadFilteredLazyListeners( + content::BrowserContext* browser_context, const std::string& extension_id, bool is_for_service_worker, const DictionaryValue& filtered) { @@ -312,7 +326,7 @@ static_cast<const base::DictionaryValue*>(&filter_value); if (is_for_service_worker) { AddListener(EventListener::ForExtensionServiceWorker( - item.first, extension_id, nullptr, + item.first, extension_id, nullptr, browser_context, // TODO(lazyboy): We need to store correct scopes of each worker // into ExtensionPrefs for events. This currently assumes all // workers are registered in the '/' scope.
diff --git a/extensions/browser/event_listener_map.h b/extensions/browser/event_listener_map.h index cfe5fb0d..0073399 100644 --- a/extensions/browser/event_listener_map.h +++ b/extensions/browser/event_listener_map.h
@@ -70,6 +70,7 @@ const std::string& event_name, const std::string& extension_id, content::RenderProcessHost* process, + content::BrowserContext* browser_context, const GURL& service_worker_scope, int64_t service_worker_version_id, int worker_thread_id, @@ -95,14 +96,11 @@ // Modifies this listener to be a lazy listener, clearing process references. void MakeLazy(); - // Returns the browser context associated with the listener, or NULL if - // IsLazy. - content::BrowserContext* GetBrowserContext() const; - const std::string& event_name() const { return event_name_; } const std::string& extension_id() const { return extension_id_; } const GURL& listener_url() const { return listener_url_; } content::RenderProcessHost* process() const { return process_; } + content::BrowserContext* browser_context() const { return browser_context_; } base::DictionaryValue* filter() const { return filter_.get(); } EventFilter::MatcherID matcher_id() const { return matcher_id_; } void set_matcher_id(EventFilter::MatcherID id) { matcher_id_ = id; } @@ -116,6 +114,7 @@ const std::string& extension_id, const GURL& listener_url, content::RenderProcessHost* process, + content::BrowserContext* browser_context, bool is_for_service_worker, int64_t service_worker_version_id, int worker_thread_id, @@ -125,6 +124,7 @@ const std::string extension_id_; const GURL listener_url_; raw_ptr<content::RenderProcessHost> process_ = nullptr; + raw_ptr<content::BrowserContext> browser_context_ = nullptr; const bool is_for_service_worker_ = false; @@ -219,7 +219,8 @@ void LoadUnfilteredLazyListeners(const std::string& extension_id, const std::set<std::string>& event_names); // Similar as above, but applies to extension service workers. - void LoadUnfilteredWorkerListeners(const std::string& extension_id, + void LoadUnfilteredWorkerListeners(content::BrowserContext* browser_context, + const std::string& extension_id, const std::set<std::string>& event_names); // Adds filtered lazy listeners as described their serialised descriptions. @@ -227,7 +228,8 @@ // listeners. // |filtered| contains a map from event names to filters, each pairing // defining a lazy filtered listener. - void LoadFilteredLazyListeners(const std::string& extension_id, + void LoadFilteredLazyListeners(content::BrowserContext* browser_context, + const std::string& extension_id, bool is_for_service_worker, const base::DictionaryValue& filtered);
diff --git a/extensions/browser/event_listener_map_unittest.cc b/extensions/browser/event_listener_map_unittest.cc index 17db493..48977ac 100644 --- a/extensions/browser/event_listener_map_unittest.cc +++ b/extensions/browser/event_listener_map_unittest.cc
@@ -109,7 +109,7 @@ bool is_for_service_worker) { if (is_for_service_worker) { return EventListener::ForExtensionServiceWorker( - event_name, extension_id, nullptr, + event_name, extension_id, nullptr, process_->GetBrowserContext(), Extension::GetBaseURLFromExtensionId(extension_id), GetWorkerVersionId(true), GetWorkerThreadId(true), std::move(filter)); } @@ -159,8 +159,10 @@ const std::string& event_name, content::RenderProcessHost* process, std::unique_ptr<base::DictionaryValue> filter) { + content::BrowserContext* browser_context = + process ? process->GetBrowserContext() : nullptr; return EventListener::ForExtensionServiceWorker( - event_name, extension_id, process, + event_name, extension_id, process, browser_context, Extension::GetBaseURLFromExtensionId(extension_id), GetWorkerVersionId(false), GetWorkerThreadId(false), std::move(filter)); } @@ -168,7 +170,7 @@ void EventListenerMapTest::TestUnfilteredEventsGoToAllListeners( const EventListenerConstructor& constructor) { listeners_->AddListener(constructor.Run( - kEvent1Name, nullptr, std::make_unique<base::DictionaryValue>())); + kEvent1Name, process_.get(), std::make_unique<base::DictionaryValue>())); std::unique_ptr<Event> event(CreateNamedEvent(kEvent1Name)); ASSERT_EQ(1u, listeners_->GetEventListeners(*event).size()); } @@ -272,16 +274,20 @@ void EventListenerMapTest::TestRemovingByProcess( const EventListenerConstructor& constructor) { listeners_->AddListener(constructor.Run( - kEvent1Name, nullptr, CreateHostSuffixFilter("google.com"))); + kEvent1Name, process_.get(), CreateHostSuffixFilter("google.com"))); listeners_->AddListener(constructor.Run( - kEvent1Name, process_.get(), CreateHostSuffixFilter("google.com"))); + kEvent2Name, process_.get(), CreateHostSuffixFilter("google.com"))); listeners_->RemoveListenersForProcess(process_.get()); - std::unique_ptr<Event> event(CreateNamedEvent(kEvent1Name)); - event->filter_info->url = GURL("http://www.google.com"); - ASSERT_EQ(1u, listeners_->GetEventListeners(*event).size()); + std::unique_ptr<Event> event1(CreateNamedEvent(kEvent1Name)); + event1->filter_info->url = GURL("http://www.google.com"); + ASSERT_EQ(0u, listeners_->GetEventListeners(*event1).size()); + + std::unique_ptr<Event> event2(CreateNamedEvent(kEvent2Name)); + event2->filter_info->url = GURL("http://www.google.com"); + ASSERT_EQ(0u, listeners_->GetEventListeners(*event2).size()); } TEST_F(EventListenerMapTest, TestRemovingByProcessForExtension) { @@ -302,18 +308,22 @@ void EventListenerMapTest::TestRemovingByListener( const EventListenerConstructor& constructor) { listeners_->AddListener(constructor.Run( - kEvent1Name, nullptr, CreateHostSuffixFilter("google.com"))); + kEvent1Name, process_.get(), CreateHostSuffixFilter("google.com"))); listeners_->AddListener(constructor.Run( - kEvent1Name, process_.get(), CreateHostSuffixFilter("google.com"))); + kEvent2Name, process_.get(), CreateHostSuffixFilter("google.com"))); std::unique_ptr<EventListener> listener(constructor.Run( kEvent1Name, process_.get(), CreateHostSuffixFilter("google.com"))); listeners_->RemoveListener(listener.get()); - std::unique_ptr<Event> event(CreateNamedEvent(kEvent1Name)); - event->filter_info->url = GURL("http://www.google.com"); - ASSERT_EQ(1u, listeners_->GetEventListeners(*event).size()); + std::unique_ptr<Event> event1(CreateNamedEvent(kEvent1Name)); + event1->filter_info->url = GURL("http://www.google.com"); + ASSERT_EQ(0u, listeners_->GetEventListeners(*event1).size()); + + std::unique_ptr<Event> event2(CreateNamedEvent(kEvent2Name)); + event2->filter_info->url = GURL("http://www.google.com"); + ASSERT_EQ(1u, listeners_->GetEventListeners(*event2).size()); } TEST_F(EventListenerMapTest, TestRemovingByListenerForExtension) { @@ -400,12 +410,12 @@ void EventListenerMapTest::TestAddExistingUnfilteredListener( const EventListenerConstructor& constructor) { bool first_add = listeners_->AddListener(constructor.Run( - kEvent1Name, nullptr, std::make_unique<base::DictionaryValue>())); + kEvent1Name, process_.get(), std::make_unique<base::DictionaryValue>())); bool second_add = listeners_->AddListener(constructor.Run( - kEvent1Name, nullptr, std::make_unique<base::DictionaryValue>())); + kEvent1Name, process_.get(), std::make_unique<base::DictionaryValue>())); std::unique_ptr<EventListener> listener(constructor.Run( - kEvent1Name, nullptr, std::make_unique<base::DictionaryValue>())); + kEvent1Name, process_.get(), std::make_unique<base::DictionaryValue>())); bool first_remove = listeners_->RemoveListener(listener.get()); bool second_remove = listeners_->RemoveListener(listener.get()); @@ -481,6 +491,7 @@ if (is_for_service_worker) { return EventListener::ForExtensionServiceWorker( kEvent1Name, kExt1Id, lazy ? nullptr : process_.get(), + process_->GetBrowserContext(), Extension::GetBaseURLFromExtensionId(kExt1Id), GetWorkerVersionId(lazy), GetWorkerThreadId(lazy), std::move(filter)); } @@ -522,8 +533,8 @@ DictionaryValue filtered_listeners; filtered_listeners.Set(kEvent1Name, std::move(filter_list)); - listeners_->LoadFilteredLazyListeners(kExt1Id, is_for_service_worker, - filtered_listeners); + listeners_->LoadFilteredLazyListeners( + browser_context(), kExt1Id, is_for_service_worker, filtered_listeners); // Matching filters. for (const TestCase& test_case : kTestCases) { @@ -557,8 +568,10 @@ // kEvent1Name should be associated with a list, not a dictionary. filtered_listeners.Set(kEvent1Name, CreateHostSuffixFilter("google.com")); - listeners_->LoadFilteredLazyListeners(kExt1Id, false, filtered_listeners); - listeners_->LoadFilteredLazyListeners(kExt1Id, true, filtered_listeners); + listeners_->LoadFilteredLazyListeners(browser_context(), kExt1Id, false, + filtered_listeners); + listeners_->LoadFilteredLazyListeners(browser_context(), kExt1Id, true, + filtered_listeners); std::unique_ptr<Event> event( CreateEvent(kEvent1Name, GURL("http://www.google.com")));
diff --git a/extensions/browser/event_router.cc b/extensions/browser/event_router.cc index c22d5092..92c0f274 100644 --- a/extensions/browser/event_router.cc +++ b/extensions/browser/event_router.cc
@@ -341,9 +341,15 @@ const std::string& extension_id, const GURL& worker_scope_url, const std::string& event_name) { + // TODO(richardzh): Passing in browser context from the process. + // Browser context is added to listener object in order to separate lazy + // listeners for regular and incognito(split) context. The first step adds + // browser context member to EventListener object. The next step is to + // assign correct browser context and use it to create both lazy + // listeners. std::unique_ptr<EventListener> listener = EventListener::ForExtensionServiceWorker( - event_name, extension_id, nullptr, worker_scope_url, + event_name, extension_id, nullptr, browser_context_, worker_scope_url, // Lazy listener, without worker version id and thread id. blink::mojom::kInvalidServiceWorkerVersionId, kMainThreadId, nullptr); AddLazyEventListenerImpl(std::move(listener), @@ -442,9 +448,15 @@ const std::string& extension_id, const GURL& worker_scope_url, const std::string& event_name) { + // TODO(richardzh): Passing in browser context from the process. + // Browser context is added to listener object in order to separate lazy + // listeners for regular and incognito(split) context. The first step adds + // browser context member to EventListener object. The next step is to + // assign correct browser context and use it to create both lazy + // listeners. std::unique_ptr<EventListener> listener = EventListener::ForExtensionServiceWorker( - event_name, extension_id, nullptr, worker_scope_url, + event_name, extension_id, nullptr, browser_context_, worker_scope_url, // Lazy listener, without worker version id and thread id. blink::mojom::kInvalidServiceWorkerVersionId, kMainThreadId, nullptr); RemoveLazyEventListenerImpl(std::move(listener), @@ -505,8 +517,9 @@ int64_t service_worker_version_id, int worker_thread_id) { listeners_.AddListener(EventListener::ForExtensionServiceWorker( - event_name, extension_id, process, service_worker_scope, - service_worker_version_id, worker_thread_id, nullptr)); + event_name, extension_id, process, process->GetBrowserContext(), + service_worker_scope, service_worker_version_id, worker_thread_id, + nullptr)); } void EventRouter::RemoveEventListener(const std::string& event_name, @@ -526,8 +539,9 @@ int worker_thread_id) { std::unique_ptr<EventListener> listener = EventListener::ForExtensionServiceWorker( - event_name, extension_id, process, service_worker_scope, - service_worker_version_id, worker_thread_id, nullptr); + event_name, extension_id, process, process->GetBrowserContext(), + service_worker_scope, service_worker_version_id, worker_thread_id, + nullptr); listeners_.RemoveListener(listener.get()); } @@ -575,7 +589,7 @@ void EventRouter::OnListenerAdded(const EventListener* listener) { const EventListenerInfo details( listener->event_name(), listener->extension_id(), - listener->listener_url(), listener->GetBrowserContext(), + listener->listener_url(), listener->browser_context(), listener->worker_thread_id(), listener->service_worker_version_id(), listener->IsLazy()); std::string base_event_name = GetBaseEventName(listener->event_name()); @@ -597,7 +611,7 @@ void EventRouter::OnListenerRemoved(const EventListener* listener) { const EventListenerInfo details( listener->event_name(), listener->extension_id(), - listener->listener_url(), listener->GetBrowserContext(), + listener->listener_url(), listener->browser_context(), listener->worker_thread_id(), listener->service_worker_version_id(), listener->IsLazy()); std::string base_event_name = GetBaseEventName(listener->event_name()); @@ -650,13 +664,22 @@ std::unique_ptr<EventListener> lazy_listener; if (is_for_service_worker && param->is_extension_id()) { regular_listener = EventListener::ForExtensionServiceWorker( - event_name, param->get_extension_id(), process, sw_identifier->scope, + event_name, param->get_extension_id(), process, + process->GetBrowserContext(), sw_identifier->scope, sw_identifier->version_id, sw_identifier->thread_id, base::DictionaryValue::From( base::Value::ToUniquePtrValue(filter.Clone()))); if (add_lazy_listener) { + // TODO(richardzh): take browser context from the process instead of the + // regular browser context attached to the event router. Browser context + // is introduced to listener in order to separate lazy listeners for + // regular and incognito(split) context. The first step is adding the + // browser context as a member of EventListener object. The next step is + // to assign correct browser context and use it to create both lazy + // listeners. lazy_listener = EventListener::ForExtensionServiceWorker( - event_name, param->get_extension_id(), nullptr, sw_identifier->scope, + event_name, param->get_extension_id(), nullptr, browser_context_, + sw_identifier->scope, // Lazy listener, without worker version id and thread id. blink::mojom::kInvalidServiceWorkerVersionId, kMainThreadId, base::DictionaryValue::From( @@ -706,7 +729,8 @@ std::unique_ptr<EventListener> listener; if (is_for_service_worker && param->is_extension_id()) { listener = EventListener::ForExtensionServiceWorker( - event_name, param->get_extension_id(), process, sw_identifier->scope, + event_name, param->get_extension_id(), process, + process->GetBrowserContext(), sw_identifier->scope, sw_identifier->version_id, sw_identifier->thread_id, base::DictionaryValue::From( base::Value::ToUniquePtrValue(filter.Clone()))); @@ -1268,6 +1292,10 @@ void EventRouter::OnExtensionLoaded(content::BrowserContext* browser_context, const Extension* extension) { + // TODO(richardzh): revisit here once we create separate lazy listeners for + // regular and incognito(split) context. How do we ensure lazy listeners and + // regular listeners are loaded for both browser context. + // Add all registered lazy listeners to our cache. std::set<std::string> registered_events = GetRegisteredEvents(extension->id(), RegisteredEventType::kLazy); @@ -1275,19 +1303,20 @@ std::set<std::string> registered_worker_events = GetRegisteredEvents(extension->id(), RegisteredEventType::kServiceWorker); - listeners_.LoadUnfilteredWorkerListeners(extension->id(), + listeners_.LoadUnfilteredWorkerListeners(browser_context, extension->id(), registered_worker_events); const DictionaryValue* filtered_events = GetFilteredEvents(extension->id(), RegisteredEventType::kLazy); if (filtered_events) - listeners_.LoadFilteredLazyListeners( - extension->id(), false /* is_for_service_worker */, *filtered_events); + listeners_.LoadFilteredLazyListeners(browser_context, extension->id(), + false /* is_for_service_worker */, + *filtered_events); const DictionaryValue* filtered_worker_events = GetFilteredEvents(extension->id(), RegisteredEventType::kServiceWorker); if (filtered_worker_events) - listeners_.LoadFilteredLazyListeners(extension->id(), + listeners_.LoadFilteredLazyListeners(browser_context, extension->id(), true /* is_for_service_worker */, *filtered_worker_events); }
diff --git a/extensions/browser/event_router_unittest.cc b/extensions/browser/event_router_unittest.cc index d7ce4572..5ec5087 100644 --- a/extensions/browser/event_router_unittest.cc +++ b/extensions/browser/event_router_unittest.cc
@@ -102,8 +102,10 @@ const std::string& event_name, content::RenderProcessHost* process, std::unique_ptr<base::DictionaryValue> filter) { + content::BrowserContext* browser_context = + process ? process->GetBrowserContext() : nullptr; return EventListener::ForExtensionServiceWorker( - event_name, extension_id, process, + event_name, extension_id, process, browser_context, Extension::GetBaseURLFromExtensionId(extension_id), service_worker_version_id, worker_thread_id, std::move(filter)); } @@ -161,6 +163,21 @@ EventRouterTest(const EventRouterTest&) = delete; EventRouterTest& operator=(const EventRouterTest&) = delete; + void SetUp() override { + ExtensionsTest::SetUp(); + render_process_host_ = + std::make_unique<content::MockRenderProcessHost>(browser_context()); + } + + void TearDown() override { + render_process_host_.reset(); + ExtensionsTest::TearDown(); + } + + content::RenderProcessHost* render_process_host() const { + return render_process_host_.get(); + } + protected: // Tests adding and removing observers from EventRouter. void RunEventRouterObserverTest(const EventListenerConstructor& constructor); @@ -195,6 +212,8 @@ private: base::HistogramTester histogram_tester_; + + std::unique_ptr<content::RenderProcessHost> render_process_host_; }; class EventRouterFilterTest : public ExtensionsTest, @@ -279,8 +298,9 @@ void EventRouterTest::RunEventRouterObserverTest( const EventListenerConstructor& constructor) { EventRouter router(nullptr, nullptr); - std::unique_ptr<EventListener> listener = constructor.Run( - "event_name", nullptr, std::make_unique<base::DictionaryValue>()); + std::unique_ptr<EventListener> listener = + constructor.Run("event_name", render_process_host(), + std::make_unique<base::DictionaryValue>()); // Add/remove works without any observers. router.OnListenerAdded(listener.get()); @@ -315,8 +335,9 @@ // Adding a listener with a sub-event notifies the main observer with // proper details. matching_observer.Reset(); - std::unique_ptr<EventListener> sub_event_listener = constructor.Run( - "event_name/1", nullptr, std::make_unique<base::DictionaryValue>()); + std::unique_ptr<EventListener> sub_event_listener = + constructor.Run("event_name/1", render_process_host(), + std::make_unique<base::DictionaryValue>()); router.OnListenerAdded(sub_event_listener.get()); EXPECT_EQ(1, matching_observer.listener_added_count()); EXPECT_EQ(0, matching_observer.listener_removed_count()); @@ -349,9 +370,9 @@ TEST_F(EventRouterTest, MultipleEventRouterObserver) { EventRouter router(nullptr, nullptr); - std::unique_ptr<EventListener> listener = - EventListener::ForURL("event_name", GURL("http://google.com/path"), - nullptr, std::make_unique<base::DictionaryValue>()); + std::unique_ptr<EventListener> listener = EventListener::ForURL( + "event_name", GURL("http://google.com/path"), render_process_host(), + std::make_unique<base::DictionaryValue>()); // Add/remove works without any observers. router.OnListenerAdded(listener.get());
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc index f6f2673..dba9e970 100644 --- a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc +++ b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc
@@ -659,7 +659,7 @@ color_desc.resolveTarget = nullptr; color_desc.loadOp = wgpu::LoadOp::Clear; color_desc.storeOp = wgpu::StoreOp::Store; - color_desc.clearColor = {0, 255, 0, 255}; + color_desc.clearValue = {0, 255, 0, 255}; wgpu::RenderPassDescriptor renderPassDesc = {}; renderPassDesc.colorAttachmentCount = 1; @@ -877,7 +877,7 @@ color_desc.resolveTarget = nullptr; color_desc.loadOp = wgpu::LoadOp::Clear; color_desc.storeOp = wgpu::StoreOp::Discard; - color_desc.clearColor = {0, 255, 0, 255}; + color_desc.clearValue = {0, 255, 0, 255}; wgpu::RenderPassDescriptor renderPassDesc = {}; renderPassDesc.colorAttachmentCount = 1; @@ -1157,7 +1157,7 @@ color_desc.resolveTarget = nullptr; color_desc.loadOp = wgpu::LoadOp::Clear; color_desc.storeOp = wgpu::StoreOp::Store; - color_desc.clearColor = {0, 255, 0, 255}; + color_desc.clearValue = {0, 255, 0, 255}; wgpu::RenderPassDescriptor renderPassDesc = {}; renderPassDesc.colorAttachmentCount = 1; @@ -1196,7 +1196,7 @@ color_desc.resolveTarget = nullptr; color_desc.loadOp = wgpu::LoadOp::Clear; color_desc.storeOp = wgpu::StoreOp::Store; - color_desc.clearColor = {255, 0, 0, 255}; + color_desc.clearValue = {255, 0, 0, 255}; wgpu::RenderPassDescriptor renderPassDesc = {}; renderPassDesc.colorAttachmentCount = 1;
diff --git a/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory_unittest.cc b/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory_unittest.cc index b8e0cde..ab4a212 100644 --- a/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory_unittest.cc +++ b/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory_unittest.cc
@@ -189,7 +189,7 @@ color_desc.resolveTarget = nullptr; color_desc.loadOp = wgpu::LoadOp::Clear; color_desc.storeOp = wgpu::StoreOp::Store; - color_desc.clearColor = {0, 255, 0, 255}; + color_desc.clearValue = {0, 255, 0, 255}; wgpu::RenderPassDescriptor renderPassDesc = {}; renderPassDesc.colorAttachmentCount = 1;
diff --git a/gpu/command_buffer/service/shared_image/iosurface_image_backing_factory_unittest.cc b/gpu/command_buffer/service/shared_image/iosurface_image_backing_factory_unittest.cc index 41a4e050..0a5cd78 100644 --- a/gpu/command_buffer/service/shared_image/iosurface_image_backing_factory_unittest.cc +++ b/gpu/command_buffer/service/shared_image/iosurface_image_backing_factory_unittest.cc
@@ -349,7 +349,7 @@ color_desc.resolveTarget = nullptr; color_desc.loadOp = wgpu::LoadOp::Clear; color_desc.storeOp = wgpu::StoreOp::Store; - color_desc.clearColor = {0, 255, 0, 255}; + color_desc.clearValue = {0, 255, 0, 255}; wgpu::RenderPassDescriptor renderPassDesc = {}; renderPassDesc.colorAttachmentCount = 1; @@ -569,7 +569,7 @@ color_desc.resolveTarget = nullptr; color_desc.loadOp = wgpu::LoadOp::Clear; color_desc.storeOp = wgpu::StoreOp::Discard; - color_desc.clearColor = {0, 255, 0, 255}; + color_desc.clearValue = {0, 255, 0, 255}; wgpu::RenderPassDescriptor renderPassDesc = {}; renderPassDesc.colorAttachmentCount = 1;
diff --git a/infra/config/generated/builders/ci/chromeos-amd64-generic-cfi-thin-lto-rel/properties.json b/infra/config/generated/builders/ci/chromeos-amd64-generic-cfi-thin-lto-rel/properties.json index 0867f66..362b3bd 100644 --- a/infra/config/generated/builders/ci/chromeos-amd64-generic-cfi-thin-lto-rel/properties.json +++ b/infra/config/generated/builders/ci/chromeos-amd64-generic-cfi-thin-lto-rel/properties.json
@@ -28,7 +28,8 @@ }, "legacy_gclient_config": { "apply_configs": [ - "chromeos" + "chromeos", + "checkout_lacros_sdk" ], "config": "chromium" }
diff --git a/infra/config/generated/builders/ci/chromeos-kevin-rel/properties.json b/infra/config/generated/builders/ci/chromeos-kevin-rel/properties.json index 3a5821b..006eabf 100644 --- a/infra/config/generated/builders/ci/chromeos-kevin-rel/properties.json +++ b/infra/config/generated/builders/ci/chromeos-kevin-rel/properties.json
@@ -22,14 +22,16 @@ "target_arch": "arm", "target_bits": 32, "target_cros_boards": [ - "kevin" + "kevin", + "arm-generic" ], "target_platform": "chromeos" }, "legacy_gclient_config": { "apply_configs": [ "arm", - "chromeos" + "chromeos", + "checkout_lacros_sdk" ], "config": "chromium" }
diff --git a/infra/config/generated/builders/try/chromeos-amd64-generic-cfi-thin-lto-rel/properties.json b/infra/config/generated/builders/try/chromeos-amd64-generic-cfi-thin-lto-rel/properties.json index 3705294..52b59f7b 100644 --- a/infra/config/generated/builders/try/chromeos-amd64-generic-cfi-thin-lto-rel/properties.json +++ b/infra/config/generated/builders/try/chromeos-amd64-generic-cfi-thin-lto-rel/properties.json
@@ -28,7 +28,8 @@ }, "legacy_gclient_config": { "apply_configs": [ - "chromeos" + "chromeos", + "checkout_lacros_sdk" ], "config": "chromium" }
diff --git a/infra/config/generated/builders/try/chromeos-kevin-compile-rel/properties.json b/infra/config/generated/builders/try/chromeos-kevin-compile-rel/properties.json index 6e45ba5..6e2d3fc 100644 --- a/infra/config/generated/builders/try/chromeos-kevin-compile-rel/properties.json +++ b/infra/config/generated/builders/try/chromeos-kevin-compile-rel/properties.json
@@ -22,14 +22,16 @@ "target_arch": "arm", "target_bits": 32, "target_cros_boards": [ - "kevin" + "kevin", + "arm-generic" ], "target_platform": "chromeos" }, "legacy_gclient_config": { "apply_configs": [ "arm", - "chromeos" + "chromeos", + "checkout_lacros_sdk" ], "config": "chromium" }
diff --git a/infra/config/generated/builders/try/chromeos-kevin-rel/properties.json b/infra/config/generated/builders/try/chromeos-kevin-rel/properties.json index 40ef1d7..5f8aef07 100644 --- a/infra/config/generated/builders/try/chromeos-kevin-rel/properties.json +++ b/infra/config/generated/builders/try/chromeos-kevin-rel/properties.json
@@ -22,14 +22,16 @@ "target_arch": "arm", "target_bits": 32, "target_cros_boards": [ - "kevin" + "kevin", + "arm-generic" ], "target_platform": "chromeos" }, "legacy_gclient_config": { "apply_configs": [ "arm", - "chromeos" + "chromeos", + "checkout_lacros_sdk" ], "config": "chromium" }
diff --git a/infra/config/generated/cq-builders.md b/infra/config/generated/cq-builders.md index 5783e27..2fa4a79b 100644 --- a/infra/config/generated/cq-builders.md +++ b/infra/config/generated/cq-builders.md
@@ -514,7 +514,7 @@ * Experiment percentage: 5.0 * [linux-rel-inverse-fyi](https://ci.chromium.org/p/chromium/builders/try/linux-rel-inverse-fyi) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""linux-rel-inverse-fyi"")) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+""linux-rel-inverse-fyi"")) - * Experiment percentage: 25.0 + * Experiment percentage: 50.0 * [linux-rel-ml](https://ci.chromium.org/p/chromium/builders/try/linux-rel-ml) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""linux-rel-ml"")) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+""linux-rel-ml"")) * Experiment percentage: 5.0
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg index 7fef3e6b..56577cf 100644 --- a/infra/config/generated/luci/commit-queue.cfg +++ b/infra/config/generated/luci/commit-queue.cfg
@@ -2925,7 +2925,7 @@ } builders { name: "chromium/try/linux-rel-inverse-fyi" - experiment_percentage: 25 + experiment_percentage: 50 location_regexp: ".*" location_regexp_exclude: ".+/[+]/docs/.+" location_regexp_exclude: ".+/[+]/infra/config/.+"
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index c3b3c23..b9a4aa5 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -55865,6 +55865,10 @@ value: 100 } experiments { + key: "luci.buildbucket.omit_python2" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -64988,6 +64992,10 @@ value: 100 } experiments { + key: "luci.buildbucket.omit_python2" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -71747,6 +71755,10 @@ value: 100 } experiments { + key: "luci.buildbucket.omit_python2" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -75771,6 +75783,10 @@ value: 100 } experiments { + key: "luci.buildbucket.omit_python2" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -76515,6 +76531,10 @@ value: 100 } experiments { + key: "luci.buildbucket.omit_python2" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -76620,6 +76640,10 @@ value: 100 } experiments { + key: "luci.buildbucket.omit_python2" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -77677,6 +77701,10 @@ value: 100 } experiments { + key: "luci.buildbucket.omit_python2" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -84170,6 +84198,10 @@ value: 100 } experiments { + key: "luci.buildbucket.omit_python2" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -88215,6 +88247,10 @@ value: 100 } experiments { + key: "luci.buildbucket.omit_python2" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -90499,6 +90535,10 @@ value: 100 } experiments { + key: "luci.buildbucket.omit_python2" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 }
diff --git a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star index 17819ea..165aae27 100644 --- a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star +++ b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
@@ -153,6 +153,7 @@ config = "chromium", apply_configs = [ "chromeos", + "checkout_lacros_sdk", ], ), chromium_config = builder_config.chromium_config( @@ -410,6 +411,7 @@ apply_configs = [ "arm", "chromeos", + "checkout_lacros_sdk", ], ), chromium_config = builder_config.chromium_config( @@ -422,6 +424,7 @@ target_bits = 32, target_cros_boards = [ "kevin", + "arm-generic", ], target_platform = builder_config.target_platform.CHROMEOS, ),
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star index 7455608..6128124 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
@@ -705,7 +705,7 @@ use_clang_coverage = True, coverage_test_types = ["unit", "overall"], tryjob = try_.job( - experiment_percentage = 25, + experiment_percentage = 50, ), experiments = { "remove_src_checkout_experiment": 100,
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.tricium.star b/infra/config/subprojects/chromium/try/tryserver.chromium.tricium.star index 690e5681..cc09b2b 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.tricium.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.tricium.star
@@ -23,9 +23,6 @@ # Make each bot specify its own OS, since we have a variety of these in this # file. - - # TODO(crbug.com/1362440): remove this. - omit_python2 = False, ) consoles.list_view(
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index 3661a0e..861d56d 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -674,11 +674,6 @@ FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kMaxZeroSuggestMatches, kOmniboxMaxZPSMatchesVariations, "OmniboxMaxZPSVariations")}, -#if BUILDFLAG(DCHECK_IS_CONFIGURABLE) - {"dcheck-is-fatal", flag_descriptions::kDcheckIsFatalName, - flag_descriptions::kDcheckIsFatalDescription, flags_ui::kOsIos, - FEATURE_VALUE_TYPE(base::kDCheckIsFatalFeature)}, -#endif // BUILDFLAG(DCHECK_IS_CONFIGURABLE) {"autofill-use-mobile-label-disambiguation", flag_descriptions::kAutofillUseMobileLabelDisambiguationName, flag_descriptions::kAutofillUseMobileLabelDisambiguationDescription, @@ -1254,11 +1249,6 @@ flag_descriptions::kTFLiteLanguageDetectionIgnoreDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(translate::kTFLiteLanguageDetectionIgnoreEnabled)}, - {"app-store-rating-test-engaged-user", - flag_descriptions::kAppStoreRatingIgnoreEligibilityCheckTestName, - flag_descriptions::kAppStoreRatingIgnoreEligibilityCheckTestDescription, - flags_ui::kOsIos, - FEATURE_VALUE_TYPE(kAppStoreRatingIgnoreEligibilityCheckTest)}, {"keyboard-shortcuts-menu", flag_descriptions::kKeyboardShortcutsMenuName, flag_descriptions::kKeyboardShortcutsMenuDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(kKeyboardShortcutsMenu)}, @@ -1615,19 +1605,6 @@ std::vector<std::string> RegisterAllFeatureVariationParameters( flags_ui::FlagsStorage* flags_storage, base::FeatureList* feature_list) { - // Occasionally DCHECK crashes on canary can be very distuptive. An - // experimental flag was added to aid in temporarily disabling this for - // canary testers. -#if BUILDFLAG(DCHECK_IS_CONFIGURABLE) - if (experimental_flags::AreDCHECKCrashesDisabled()) { - std::vector<base::FeatureList::FeatureOverrideInfo> overrides; - overrides.push_back( - {std::cref(base::kDCheckIsFatalFeature), - base::FeatureList::OverrideState::OVERRIDE_DISABLE_FEATURE}); - feature_list->RegisterExtraFeatureOverrides(std::move(overrides)); - } -#endif // BUILDFLAG(DCHECK_IS_CONFIGURABLE) - return GetGlobalFlagsState().RegisterAllFeatureVariationParameters( flags_storage, feature_list); }
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index b56636e..eb4b587 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -21,12 +21,6 @@ "When enabled, App Store Rating promo will be presented to eligible " "users."; -const char kAppStoreRatingIgnoreEligibilityCheckTestName[] = - "Overrides App Store rating trigger requirements."; -const char kAppStoreRatingIgnoreEligibilityCheckTestDescription[] = - "Overrides the app store rating trigger requirements to show the prompt" - "on the next startup. Used for testing."; - const char kAutofillBrandingIOSName[] = "Autofill Branding on iOS"; const char kAutofillBrandingIOSDescription[] = "Adds the Chrome logo in the form input suggestions bar. Full color by " @@ -190,13 +184,6 @@ "When enabled use Crashpad to generate crash reports crash collection. " "When disabled use Breakpad. This flag takes two restarts to take effect"; -#if BUILDFLAG(DCHECK_IS_CONFIGURABLE) -const char kDcheckIsFatalName[] = "DCHECKs are fatal"; -const char kDcheckIsFatalDescription[] = - "By default Chrome will evaluate in this build, but only log failures, " - "rather than crashing. If enabled, DCHECKs will crash the calling process."; -#endif // BUILDFLAG(DCHECK_IS_CONFIGURABLE) - const char kDefaultBrowserFullscreenPromoExperimentName[] = "Default Browser Fullscreen modal experiment"; const char kDefaultBrowserFullscreenPromoExperimentDescription[] =
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index 46dd7ed..6066028 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -22,11 +22,6 @@ extern const char kAppStoreRatingName[]; extern const char kAppStoreRatingDescription[]; -// Title and description for the flag that overrides the App Store Rating -// trigger requirements. -extern const char kAppStoreRatingIgnoreEligibilityCheckTestName[]; -extern const char kAppStoreRatingIgnoreEligibilityCheckTestDescription[]; - // Title and description for the flag to enable Chrome branding on form input // suggestions. extern const char kAutofillBrandingIOSName[]; @@ -161,12 +156,6 @@ extern const char kCrashpadIOSName[]; extern const char kCrashpadIOSDescription[]; -#if BUILDFLAG(DCHECK_IS_CONFIGURABLE) -// Title and description for the flag to enable configurable DCHECKs. -extern const char kDcheckIsFatalName[]; -extern const char kDcheckIsFatalDescription[]; -#endif // BUILDFLAG(DCHECK_IS_CONFIGURABLE) - // Title and description for the flag to show a modified fullscreen modal promo // with a button that would send the users in the Settings.app to update the // default browser.
diff --git a/ios/chrome/browser/flags/system_flags.h b/ios/chrome/browser/flags/system_flags.h index 4e2abc4..5ddb08f 100644 --- a/ios/chrome/browser/flags/system_flags.h +++ b/ios/chrome/browser/flags/system_flags.h
@@ -69,9 +69,6 @@ // only once. bool MustClearApplicationGroupSandbox(); -// Whether the DCheckIsFatal feature should be disabled. -bool AreDCHECKCrashesDisabled(); - // Returns the name of the promo to be forced to display when the app is // launched or resumed. Returns empty string if no promo is to be forced // to display. Always returns nil for users in stable/beta.
diff --git a/ios/chrome/browser/flags/system_flags.mm b/ios/chrome/browser/flags/system_flags.mm index 95b0ed5..3d3e1e2a 100644 --- a/ios/chrome/browser/flags/system_flags.mm +++ b/ios/chrome/browser/flags/system_flags.mm
@@ -28,7 +28,6 @@ NSString* const kAlternateDiscoverFeedServerURL = @"AlternateDiscoverFeedServerURL"; -NSString* const kDisableDCHECKCrashes = @"DisableDCHECKCrashes"; NSString* const kEnableStartupCrash = @"EnableStartupCrash"; NSString* const kFirstRunForceEnabled = @"FirstRunForceEnabled"; NSString* const kOriginServerHost = @"AlternateOriginServerHost"; @@ -99,11 +98,6 @@ return [[NSUserDefaults standardUserDefaults] boolForKey:kEnableStartupCrash]; } -bool AreDCHECKCrashesDisabled() { - return - [[NSUserDefaults standardUserDefaults] boolForKey:kDisableDCHECKCrashes]; -} - bool MustClearApplicationGroupSandbox() { bool value = [[NSUserDefaults standardUserDefaults] boolForKey:kClearApplicationGroup];
diff --git a/ios/chrome/browser/resources/Settings.bundle/Experimental.plist b/ios/chrome/browser/resources/Settings.bundle/Experimental.plist index 490aded..9d2e6f9 100644 --- a/ios/chrome/browser/resources/Settings.bundle/Experimental.plist +++ b/ios/chrome/browser/resources/Settings.bundle/Experimental.plist
@@ -174,16 +174,6 @@ <key>Type</key> <string>PSToggleSwitchSpecifier</string> <key>Title</key> - <string>Disable DCHECK Crashes</string> - <key>Key</key> - <string>DisableDCHECKCrashes</string> - <key>DefaultValue</key> - <false/> - </dict> - <dict> - <key>Type</key> - <string>PSToggleSwitchSpecifier</string> - <key>Title</key> <string>Enable Memory Debugging</string> <key>Key</key> <string>EnableMemoryDebugging</string>
diff --git a/ios/chrome/browser/ui/app_store_rating/features.h b/ios/chrome/browser/ui/app_store_rating/features.h index 5b678fb..21c7ad07 100644 --- a/ios/chrome/browser/ui/app_store_rating/features.h +++ b/ios/chrome/browser/ui/app_store_rating/features.h
@@ -10,14 +10,7 @@ // Feature flag to enable the App Store Rating feature. BASE_DECLARE_FEATURE(kAppStoreRating); -// Feature flag to override the trigger requirements for the App Store Rating -// promo. This feature is enabled only during testing. -BASE_DECLARE_FEATURE(kAppStoreRatingIgnoreEligibilityCheckTest); - // Returns true if App Store Rating feature is enabled. bool IsAppStoreRatingEnabled(); -// Returns true if App Store Rating Test Engaged User feature is enabled. -bool IsAppStoreRatingTestEngagedUserEnabled(); - #endif // IOS_CHROME_BROWSER_UI_APP_STORE_RATING_FEATURES_H_
diff --git a/ios/chrome/browser/ui/app_store_rating/features.mm b/ios/chrome/browser/ui/app_store_rating/features.mm index 49d8768..2dcb8656 100644 --- a/ios/chrome/browser/ui/app_store_rating/features.mm +++ b/ios/chrome/browser/ui/app_store_rating/features.mm
@@ -15,17 +15,7 @@ "AppStoreRating", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kAppStoreRatingIgnoreEligibilityCheckTest, - "AppStoreRatingIgnoreEligibilityCheckTest", - base::FEATURE_DISABLED_BY_DEFAULT); - bool IsAppStoreRatingEnabled() { return IsFullscreenPromosManagerEnabled() && base::FeatureList::IsEnabled(kAppStoreRating); } - -bool IsAppStoreRatingTestEngagedUserEnabled() { - return IsAppStoreRatingEnabled() && - base::FeatureList::IsEnabled( - kAppStoreRatingIgnoreEligibilityCheckTest); -}
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 e82e1dc..d340dbbc 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 @@ -ddd5dc15f366da2e7d20e2a7eb20ec50c49d6546 \ No newline at end of file +de78627952cbbdcd7e5c993e290688fb14bbaaad \ 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 9786aa8..1970f78 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 @@ -6dd57a3338b1083c6ecd8f4b91102d799b120d3c \ No newline at end of file +db07561a21d72706a0bfc458eeedc5fe4d762f61 \ 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 6b3baa0..f09bac8 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 @@ -1b634bf8ffc6f5d5fb6ddd30fbe6e53ae3f1735b \ No newline at end of file +e17ca8648ba3e7663a63dafdaf715c4fccaca483 \ 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 77d3996a..877a5eb 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 @@ -8fccd02572ab4b90d3129f63b76e3bad12c1f1a2 \ No newline at end of file +a84d7be600de59c5682837a305a2157e04e21c35 \ 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 4014c41..3ff26c4 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 @@ -6c496d97c5beff3ddf1863302942fd91e599fb8c \ No newline at end of file +081d1b3fa30d6f65d13a1ab729fd176f4b8de4aa \ 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 0efb94b..05bb8c0a 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 @@ -0e5522ecc0c6769a1c5fcc67be50b5ee1ca1ac6a \ No newline at end of file +c4845ebdbf309558cd147981655e639bc9c20189 \ 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 c8ae38a..ca7f7c1 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 @@ -84700b4a510ff9e7d973625599eb1e058c9822ee \ No newline at end of file +d852e59cf2dc901d562bced5fc285bbd46d7eb28 \ 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 558dc3d..ed76315 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 @@ -24d395b416d14c2d867fdeb8e230f7525c5badd1 \ No newline at end of file +1c94f657e909ab22834f4a54cf59440ec9ea79ef \ 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 12c96a882..08802d9 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 @@ -f29afff47ff62becff21b6d88cb82e064c6d7744 \ No newline at end of file +e78403a04adea564e28718290811d2a13dc2c841 \ 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 85134682..d9db3c5 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 @@ -32d2ca9dbce7d689c5d2fffbc3aaf0b0caf8d835 \ No newline at end of file +2a2ef71034aa47953eb3e40ae06eb9b67eee7010 \ 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 4868dea..2467e59 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 @@ -e95061556bd04cb89cc6c95dabe208c526280798 \ No newline at end of file +42688a297ca67498b1318469d46b084b72102c8c \ 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 0d079f5d4..19638c2 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 @@ -4cc26410540e1d06bd214b18e3e3f9222fa5bb4b \ No newline at end of file +a0e1513a98633ffb5e070eb2510dab642082d9e8 \ 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 698e168..f5f039b 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 @@ -fcf1f6b9e0aaf9174c78a8f76eefdb7124be9d65 \ No newline at end of file +72f3572aecf505184f1194bc23dc5b9e4f46885c \ 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 4d9a58f..11d3f4c6 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 @@ -b26adf063d527df45584203d93fa4695bb963cf0 \ No newline at end of file +69019c1759cb2e54d2ca5c7eac320d0ee12f582b \ No newline at end of file
diff --git a/ios/web_view/internal/translate/cwv_translation_controller.mm b/ios/web_view/internal/translate/cwv_translation_controller.mm index baeccc3..a362e14 100644 --- a/ios/web_view/internal/translate/cwv_translation_controller.mm +++ b/ios/web_view/internal/translate/cwv_translation_controller.mm
@@ -4,24 +4,24 @@ #import "ios/web_view/internal/translate/cwv_translation_controller_internal.h" -#include <memory> -#include <string> +#import <memory> +#import <string> -#include "base/check_op.h" -#include "base/memory/ptr_util.h" -#include "base/notreached.h" -#include "base/strings/sys_string_conversions.h" -#include "base/time/time.h" -#include "components/translate/core/browser/translate_download_manager.h" +#import "base/check_op.h" +#import "base/memory/ptr_util.h" +#import "base/notreached.h" +#import "base/strings/sys_string_conversions.h" +#import "base/time/time.h" +#import "components/translate/core/browser/translate_download_manager.h" #import "ios/web/public/web_state.h" #import "ios/web/public/web_state_observer_bridge.h" #import "ios/web_view/internal/cwv_web_view_configuration_internal.h" #import "ios/web_view/internal/translate/cwv_translation_language_internal.h" #import "ios/web_view/internal/translate/web_view_translate_client.h" -#include "ios/web_view/internal/web_view_browser_state.h" +#import "ios/web_view/internal/web_view_browser_state.h" #import "ios/web_view/public/cwv_translation_controller_delegate.h" #import "ios/web_view/public/cwv_translation_policy.h" -#include "ui/base/l10n/l10n_util.h" +#import "ui/base/l10n/l10n_util.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/web_view/internal/translate/cwv_translation_controller_unittest.mm b/ios/web_view/internal/translate/cwv_translation_controller_unittest.mm index 2e69adb..aed4f3b7 100644 --- a/ios/web_view/internal/translate/cwv_translation_controller_unittest.mm +++ b/ios/web_view/internal/translate/cwv_translation_controller_unittest.mm
@@ -6,32 +6,32 @@ #import <Foundation/Foundation.h> -#include <memory> +#import <memory> -#include "base/strings/sys_string_conversions.h" -#include "components/language/core/browser/language_prefs.h" -#include "components/language/core/browser/pref_names.h" -#include "components/language/ios/browser/ios_language_detection_tab_helper.h" -#include "components/prefs/pref_registry_simple.h" -#include "components/prefs/testing_pref_service.h" -#include "components/translate/core/browser/mock_translate_ranker.h" -#include "components/translate/core/browser/translate_pref_names.h" -#include "components/translate/core/browser/translate_prefs.h" -#include "ios/web/public/test/fakes/fake_browser_state.h" -#include "ios/web/public/test/scoped_testing_web_client.h" -#include "ios/web/public/test/web_task_environment.h" -#include "ios/web/public/web_client.h" +#import "base/strings/sys_string_conversions.h" +#import "components/language/core/browser/language_prefs.h" +#import "components/language/core/browser/pref_names.h" +#import "components/language/ios/browser/ios_language_detection_tab_helper.h" +#import "components/prefs/pref_registry_simple.h" +#import "components/prefs/testing_pref_service.h" +#import "components/translate/core/browser/mock_translate_ranker.h" +#import "components/translate/core/browser/translate_pref_names.h" +#import "components/translate/core/browser/translate_prefs.h" +#import "ios/web/public/test/fakes/fake_browser_state.h" +#import "ios/web/public/test/scoped_testing_web_client.h" +#import "ios/web/public/test/web_task_environment.h" +#import "ios/web/public/web_client.h" #import "ios/web_view/internal/translate/cwv_translation_language_internal.h" #import "ios/web_view/internal/translate/web_view_translate_client.h" -#include "ios/web_view/internal/web_view_browser_state.h" +#import "ios/web_view/internal/web_view_browser_state.h" #import "ios/web_view/public/cwv_translation_controller_delegate.h" #import "ios/web_view/public/cwv_translation_policy.h" -#include "ios/web_view/test/test_with_locale_and_resources.h" -#include "testing/gtest/include/gtest/gtest.h" +#import "ios/web_view/test/test_with_locale_and_resources.h" +#import "testing/gtest/include/gtest/gtest.h" #import "testing/gtest_mac.h" -#include "testing/platform_test.h" +#import "testing/platform_test.h" #import "third_party/ocmock/OCMock/OCMock.h" -#include "third_party/ocmock/gtest_support.h" +#import "third_party/ocmock/gtest_support.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/web_view/internal/translate/cwv_translation_language.mm b/ios/web_view/internal/translate/cwv_translation_language.mm index 8d6bdb2..64406a2 100644 --- a/ios/web_view/internal/translate/cwv_translation_language.mm +++ b/ios/web_view/internal/translate/cwv_translation_language.mm
@@ -4,9 +4,9 @@ #import "ios/web_view/internal/translate/cwv_translation_language_internal.h" -#include <string> +#import <string> -#include "base/strings/sys_string_conversions.h" +#import "base/strings/sys_string_conversions.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/web_view/internal/translate/cwv_translation_language_unittest.mm b/ios/web_view/internal/translate/cwv_translation_language_unittest.mm index ccf8e50..77decf9 100644 --- a/ios/web_view/internal/translate/cwv_translation_language_unittest.mm +++ b/ios/web_view/internal/translate/cwv_translation_language_unittest.mm
@@ -6,10 +6,10 @@ #import <Foundation/Foundation.h> -#include "base/strings/sys_string_conversions.h" -#include "testing/gtest/include/gtest/gtest.h" +#import "base/strings/sys_string_conversions.h" +#import "testing/gtest/include/gtest/gtest.h" #import "testing/gtest_mac.h" -#include "testing/platform_test.h" +#import "testing/platform_test.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/web_view/internal/translate/cwv_translation_policy_unittest.mm b/ios/web_view/internal/translate/cwv_translation_policy_unittest.mm index a12af89..a82b86bf 100644 --- a/ios/web_view/internal/translate/cwv_translation_policy_unittest.mm +++ b/ios/web_view/internal/translate/cwv_translation_policy_unittest.mm
@@ -6,11 +6,11 @@ #import <Foundation/Foundation.h> -#include "base/strings/sys_string_conversions.h" +#import "base/strings/sys_string_conversions.h" #import "ios/web_view/internal/translate/cwv_translation_language_internal.h" -#include "testing/gtest/include/gtest/gtest.h" +#import "testing/gtest/include/gtest/gtest.h" #import "testing/gtest_mac.h" -#include "testing/platform_test.h" +#import "testing/platform_test.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/web_view/internal/translate/web_view_translate_client.mm b/ios/web_view/internal/translate/web_view_translate_client.mm index f712051..f976b66 100644 --- a/ios/web_view/internal/translate/web_view_translate_client.mm +++ b/ios/web_view/internal/translate/web_view_translate_client.mm
@@ -4,21 +4,21 @@ #import "ios/web_view/internal/translate/web_view_translate_client.h" -#include <vector> +#import <vector> -#include "base/check.h" -#include "base/notreached.h" -#include "components/infobars/core/infobar.h" -#include "components/language/core/browser/language_model_manager.h" -#include "components/language/core/browser/pref_names.h" -#include "components/translate/core/browser/page_translated_details.h" -#include "components/translate/core/browser/translate_infobar_delegate.h" -#include "components/translate/core/browser/translate_step.h" -#include "ios/web/public/browser_state.h" -#include "ios/web_view/internal/language/web_view_accept_languages_service_factory.h" -#include "ios/web_view/internal/language/web_view_language_model_manager_factory.h" -#include "ios/web_view/internal/translate/web_view_translate_ranker_factory.h" -#include "url/gurl.h" +#import "base/check.h" +#import "base/notreached.h" +#import "components/infobars/core/infobar.h" +#import "components/language/core/browser/language_model_manager.h" +#import "components/language/core/browser/pref_names.h" +#import "components/translate/core/browser/page_translated_details.h" +#import "components/translate/core/browser/translate_infobar_delegate.h" +#import "components/translate/core/browser/translate_step.h" +#import "ios/web/public/browser_state.h" +#import "ios/web_view/internal/language/web_view_accept_languages_service_factory.h" +#import "ios/web_view/internal/language/web_view_language_model_manager_factory.h" +#import "ios/web_view/internal/translate/web_view_translate_ranker_factory.h" +#import "url/gurl.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/web_view/internal/translate/web_view_translate_ranker_factory.mm b/ios/web_view/internal/translate/web_view_translate_ranker_factory.mm index cd9936e9..fb9fe28 100644 --- a/ios/web_view/internal/translate/web_view_translate_ranker_factory.mm +++ b/ios/web_view/internal/translate/web_view_translate_ranker_factory.mm
@@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ios/web_view/internal/translate/web_view_translate_ranker_factory.h" +#import "ios/web_view/internal/translate/web_view_translate_ranker_factory.h" -#include <utility> +#import <utility> -#include "base/no_destructor.h" -#include "components/keyed_service/core/keyed_service.h" -#include "components/keyed_service/ios/browser_state_dependency_manager.h" -#include "components/translate/core/browser/translate_ranker_impl.h" -#include "ios/web_view/internal/web_view_browser_state.h" +#import "base/no_destructor.h" +#import "components/keyed_service/core/keyed_service.h" +#import "components/keyed_service/ios/browser_state_dependency_manager.h" +#import "components/translate/core/browser/translate_ranker_impl.h" +#import "ios/web_view/internal/web_view_browser_state.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/web_view/internal/translate/web_view_translate_service.mm b/ios/web_view/internal/translate/web_view_translate_service.mm index 7f8a958..59f510e 100644 --- a/ios/web_view/internal/translate/web_view_translate_service.mm +++ b/ios/web_view/internal/translate/web_view_translate_service.mm
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ios/web_view/internal/translate/web_view_translate_service.h" +#import "ios/web_view/internal/translate/web_view_translate_service.h" -#include "base/bind.h" -#include "base/memory/ptr_util.h" -#include "base/no_destructor.h" -#include "components/translate/core/browser/translate_download_manager.h" -#include "ios/web_view/internal/app/application_context.h" +#import "base/bind.h" +#import "base/memory/ptr_util.h" +#import "base/no_destructor.h" +#import "components/translate/core/browser/translate_download_manager.h" +#import "ios/web_view/internal/app/application_context.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc index 8ea4923..f2dd9d7 100644 --- a/media/base/media_switches.cc +++ b/media/base/media_switches.cc
@@ -276,6 +276,11 @@ "overlay-fullscreen-video", base::FEATURE_ENABLED_BY_DEFAULT); +// Pauses muted (and uncaptured) playbacks in the background. +BASE_FEATURE(kPauseBackgroundMutedAudio, + "PauseBackgroundMutedAudio", + base::FEATURE_ENABLED_BY_DEFAULT); + // Enables user control over muting tab audio from the tab strip. BASE_FEATURE(kEnableTabMuting, "EnableTabMuting", @@ -364,11 +369,6 @@ "ExposeSwDecodersToWebRTC", base::FEATURE_DISABLED_BY_DEFAULT); -// Let video without audio be paused when it is playing in the background. -BASE_FEATURE(kBackgroundVideoPauseOptimization, - "BackgroundVideoPauseOptimization", - base::FEATURE_ENABLED_BY_DEFAULT); - // CDM host verification is enabled by default. Can be disabled for testing. // Has no effect if ENABLE_CDM_HOST_VERIFICATION buildflag is false. BASE_FEATURE(kCdmHostVerification,
diff --git a/media/base/media_switches.h b/media/base/media_switches.h index 88206de6..1db10b5 100644 --- a/media/base/media_switches.h +++ b/media/base/media_switches.h
@@ -123,7 +123,6 @@ MEDIA_EXPORT BASE_DECLARE_FEATURE(kAudioFocusLossSuspendMediaSession); MEDIA_EXPORT BASE_DECLARE_FEATURE(kAutoplayIgnoreWebAudio); MEDIA_EXPORT BASE_DECLARE_FEATURE(kAutoplayDisableSettings); -MEDIA_EXPORT BASE_DECLARE_FEATURE(kBackgroundVideoPauseOptimization); MEDIA_EXPORT BASE_DECLARE_FEATURE(kBresenhamCadence); MEDIA_EXPORT BASE_DECLARE_FEATURE(kCdmHostVerification); MEDIA_EXPORT BASE_DECLARE_FEATURE(kCdmProcessSiteIsolation); @@ -189,6 +188,7 @@ MEDIA_EXPORT BASE_DECLARE_FEATURE(kMultiPlaneVideoCaptureSharedImages); MEDIA_EXPORT BASE_DECLARE_FEATURE(kOpenscreenCastStreamingSession); MEDIA_EXPORT BASE_DECLARE_FEATURE(kOverlayFullscreenVideo); +MEDIA_EXPORT BASE_DECLARE_FEATURE(kPauseBackgroundMutedAudio); MEDIA_EXPORT BASE_DECLARE_FEATURE(kPictureInPicture); MEDIA_EXPORT BASE_DECLARE_FEATURE(kPlatformAudioEncoder); #if BUILDFLAG(ENABLE_PLATFORM_HEVC)
diff --git a/media/webrtc/helpers_unittests.cc b/media/webrtc/helpers_unittests.cc index 5f425e8a..26f86b5 100644 --- a/media/webrtc/helpers_unittests.cc +++ b/media/webrtc/helpers_unittests.cc
@@ -350,6 +350,61 @@ EXPECT_FALSE(config.gain_controller2.adaptive_digital.enabled); } +TEST(CreateWebRtcAudioProcessingModuleTest, + InputVolumeAdjustmentEnabledWithHybridAgc) { + ::base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures( + /*enabled_features=*/{features::kWebRtcAllowInputVolumeAdjustment, + features::kWebRtcHybridAgc}, + /*disabled_features=*/{}); + auto config = CreateApmGetConfig( + /*settings=*/{.automatic_gain_control = true, + .experimental_automatic_gain_control = true}); + EXPECT_TRUE(config.gain_controller1.enabled); + EXPECT_TRUE(config.gain_controller1.analog_gain_controller.enabled); +} + +TEST(CreateWebRtcAudioProcessingModuleTest, + InputVolumeAdjustmentEnabledWithAgc1) { + ::base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures( + /*enabled_features=*/{features::kWebRtcAllowInputVolumeAdjustment}, + /*disabled_features=*/{features::kWebRtcHybridAgc}); + auto config = CreateApmGetConfig( + /*settings=*/{.automatic_gain_control = true, + .experimental_automatic_gain_control = true}); + EXPECT_TRUE(config.gain_controller1.enabled); + EXPECT_TRUE(config.gain_controller1.analog_gain_controller.enabled); +} + +TEST(CreateWebRtcAudioProcessingModuleTest, + CanDisableInputVolumeAdjustmentWithHybridAgc) { + ::base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures( + /*enabled_features=*/{features::kWebRtcHybridAgc}, + /*disabled_features=*/{features::kWebRtcAllowInputVolumeAdjustment}); + auto config = CreateApmGetConfig( + /*settings=*/{.automatic_gain_control = true, + .experimental_automatic_gain_control = true}); + // Check that AGC1 is entirely disabled since, in the Hybrid AGC setup, AGC1 + // is only used for input volume adaptations. + EXPECT_FALSE(config.gain_controller1.enabled); +} + +TEST(CreateWebRtcAudioProcessingModuleTest, + CannotDisableInputVolumeAdjustmentWithAgc1) { + ::base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures( + /*enabled_features=*/{}, + /*disabled_features=*/{features::kWebRtcHybridAgc, + features::kWebRtcAllowInputVolumeAdjustment}); + auto config = CreateApmGetConfig( + /*settings=*/{.automatic_gain_control = true, + .experimental_automatic_gain_control = true}); + EXPECT_TRUE(config.gain_controller1.enabled); + EXPECT_TRUE(config.gain_controller1.analog_gain_controller.enabled); +} + TEST(CreateWebRtcAudioProcessingModuleTest, VerifyNoiseSuppressionSettings) { for (bool noise_suppressor_enabled : {true, false}) { SCOPED_TRACE(noise_suppressor_enabled);
diff --git a/media/webrtc/webrtc_features.cc b/media/webrtc/webrtc_features.cc index 60ce42ff..00650a9 100644 --- a/media/webrtc/webrtc_features.cc +++ b/media/webrtc/webrtc_features.cc
@@ -55,6 +55,7 @@ "WebRtcAnalogAgcStartupMinVolume", base::FEATURE_DISABLED_BY_DEFAULT); +// TODO(crbug.com/1375239): Inactivate the flag gradually before deleting it. // When disabled, any WebRTC Audio Processing Module input volume recommendation // is ignored and no adjustment takes place. BASE_FEATURE(kWebRtcAllowInputVolumeAdjustment,
diff --git a/testing/scripts/run_finch_smoke_tests_android.py b/testing/scripts/run_finch_smoke_tests_android.py index 8eed0bd5..397cc2a 100755 --- a/testing/scripts/run_finch_smoke_tests_android.py +++ b/testing/scripts/run_finch_smoke_tests_android.py
@@ -542,8 +542,8 @@ full_activity_name, '-d', url]) - logger.info('Waiting 10 seconds') - time.sleep(10) + logger.info('Waiting 5 seconds') + time.sleep(5) def _wait_for_local_state_file(self, local_state_file): """Wait for local state file to be generated"""
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 8b928949..43a3a78 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -3686,33 +3686,6 @@ "disable_features": [ "NtpShoppingTasksModule" ] - }, - { - "name": "Recipes_SAPIV2_20220415", - "params": { - "NtpModulesLoadTimeoutMillisecondsParam": "3000", - "use_sapi_v2": "true" - }, - "enable_features": [ - "NtpModulesLoadTimeoutMilliseconds", - "NtpRecipeTasksModule" - ], - "disable_features": [ - "NtpShoppingTasksModule" - ] - }, - { - "name": "Recipes_SAPIV2_Control_20220415", - "params": { - "NtpModulesLoadTimeoutMillisecondsParam": "3000" - }, - "enable_features": [ - "NtpModulesLoadTimeoutMilliseconds", - "NtpRecipeTasksModule" - ], - "disable_features": [ - "NtpShoppingTasksModule" - ] } ] } @@ -3748,32 +3721,6 @@ ] } ], - "DesktopOmniboxDomainSuggestions": [ - { - "platforms": [ - "chromeos", - "chromeos_lacros", - "fuchsia", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "params": { - "DomainSuggestionsMaxMatchesPerDomain": "2", - "DomainSuggestionsMinInputLength": "4", - "DomainSuggestionsVisitCapPerVisit": "2", - "DomainSuggestionsVisitThreshold": "4" - }, - "enable_features": [ - "OmniboxDomainSuggestions" - ] - } - ] - } - ], "DesktopOmniboxPostAutocompletion": [ { "platforms": [ @@ -3880,6 +3827,33 @@ ] } ], + "DesktopOmnibox_HistoryQuickProviderSpecificity": [ + { + "platforms": [ + "chromeos", + "chromeos_lacros", + "fuchsia", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "DomainSuggestionsMaxMatchesPerDomain": "2", + "DomainSuggestionsMinInputLength": "4", + "DomainSuggestionsVisitCapPerVisit": "2", + "DomainSuggestionsVisitThreshold": "4" + }, + "enable_features": [ + "OmniboxDomainSuggestions", + "OmniboxHistoryQuickProviderSpecificityScoreCountUniqueHosts" + ] + } + ] + } + ], "DesktopReadingListAddFromDialog": [ { "platforms": [ @@ -9526,24 +9500,6 @@ ] } ], - "ShareButtonInTopToolbar": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "params": { - "minimum_width": "360" - }, - "enable_features": [ - "ShareButtonInTopToolbar" - ] - } - ] - } - ], "ShareCrowButton": [ { "platforms": [
diff --git a/third_party/blink/public/mojom/quota/quota_manager_host.mojom b/third_party/blink/public/mojom/quota/quota_manager_host.mojom index 8f61c6f7..8c9293e 100644 --- a/third_party/blink/public/mojom/quota/quota_manager_host.mojom +++ b/third_party/blink/public/mojom/quota/quota_manager_host.mojom
@@ -29,25 +29,9 @@ // Retrieves the origin's current usage and quota. // // This method can be called from frames and workers. - QueryStorageUsageAndQuota(blink.mojom.StorageType storage_type) => + QueryStorageUsageAndQuota() => (blink.mojom.QuotaStatusCode error, int64 current_usage, int64 current_quota, UsageBreakdown usage_breakdown); - - // Requests a new quota size for the origin. - // - // This method can only be called from frames, because the implementation may - // involve a permission prompt. |requested_size| indicates how much storage - // space the origin expects to need. - // - // The callback reflects the result of the quota grant. The granted quota may - // be different than the requested amount. - // - // This method is only used in the old FileSystem API. - RequestStorageQuota(blink.mojom.StorageType storage_type, - uint64 requested_size) => - (blink.mojom.QuotaStatusCode error, - int64 current_usage, - int64 granted_quota); };
diff --git a/third_party/blink/public/platform/webaudiosourceprovider_impl.h b/third_party/blink/public/platform/webaudiosourceprovider_impl.h index 8b564fb..92e2e14 100644 --- a/third_party/blink/public/platform/webaudiosourceprovider_impl.h +++ b/third_party/blink/public/platform/webaudiosourceprovider_impl.h
@@ -93,6 +93,8 @@ int RenderForTesting(media::AudioBus* audio_bus); + bool IsAudioBeingCaptured() const; + protected: ~WebAudioSourceProviderImpl() override; @@ -103,17 +105,17 @@ void OnSetFormat(); // Used to keep the volume across reconfigurations. - double volume_; + double volume_ = 1.0; // Tracks the current playback state. enum PlaybackState { kStopped, kStarted, kPlaying }; - PlaybackState state_; + PlaybackState state_ = kStopped; // Closure that calls OnSetFormat() on |client_| on the renderer thread. base::RepeatingClosure set_format_cb_; // When set via setClient() it overrides |sink_| for consuming audio. - raw_ptr<WebAudioSourceProviderClient> client_; + raw_ptr<WebAudioSourceProviderClient> client_ = nullptr; // Where audio ends up unless overridden by |client_|. base::Lock sink_lock_; @@ -129,6 +131,8 @@ base::OnceClosure on_set_client_callback_; + bool has_copy_audio_callback_ = false; + // NOTE: Weak pointers must be invalidated before all other member variables. base::WeakPtrFactory<WebAudioSourceProviderImpl> weak_factory_{this}; };
diff --git a/third_party/blink/renderer/bindings/generated_in_core.gni b/third_party/blink/renderer/bindings/generated_in_core.gni index a8009c0..6430bbda 100644 --- a/third_party/blink/renderer/bindings/generated_in_core.gni +++ b/third_party/blink/renderer/bindings/generated_in_core.gni
@@ -87,6 +87,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_animation_event_init.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_animation_playback_event_init.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_animation_playback_event_init.h", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_aria_notification_options.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_aria_notification_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_assigned_nodes_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_assigned_nodes_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_base_keyframe.cc", @@ -408,6 +410,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_align_setting.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_animation_play_state.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_animation_play_state.h", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_aria_notification_insertion_mode.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_aria_notification_insertion_mode.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_auto_keyword.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_auto_keyword.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_beacon_method.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_core.gni b/third_party/blink/renderer/bindings/idl_in_core.gni index d1dcb60..ad99d893 100644 --- a/third_party/blink/renderer/bindings/idl_in_core.gni +++ b/third_party/blink/renderer/bindings/idl_in_core.gni
@@ -6,6 +6,7 @@ # for production. static_idl_files_in_core = get_path_info( [ + "//third_party/blink/renderer/core/accessibility/aria_notification_options.idl", "//third_party/blink/renderer/core/animation/animatable.idl", "//third_party/blink/renderer/core/animation/animation.idl", "//third_party/blink/renderer/core/animation/animation_effect.idl",
diff --git a/third_party/blink/renderer/core/accessibility/aria_notification_options.idl b/third_party/blink/renderer/core/accessibility/aria_notification_options.idl new file mode 100644 index 0000000..00e8374 --- /dev/null +++ b/third_party/blink/renderer/core/accessibility/aria_notification_options.idl
@@ -0,0 +1,8 @@ +enum AriaNotificationInsertionMode { "queue", "stack", "clear" }; + +dictionary AriaNotificationOptions { + AriaNotificationInsertionMode insertionMode = "queue"; + boolean interruptCurrent = false; + boolean preventInterrupt = false; + DOMString label = ""; +};
diff --git a/third_party/blink/renderer/core/accessibility/ax_object_cache.h b/third_party/blink/renderer/core/accessibility/ax_object_cache.h index 33aa6bb..5a5afbb 100644 --- a/third_party/blink/renderer/core/accessibility/ax_object_cache.h +++ b/third_party/blink/renderer/core/accessibility/ax_object_cache.h
@@ -45,6 +45,7 @@ namespace blink { +class AriaNotificationOptions; class AXObject; class AbstractInlineTextBox; class AccessibleNode; @@ -188,6 +189,10 @@ virtual AXID GenerateAXID() const = 0; + virtual void AddAriaNotification(Node*, + const String, + const AriaNotificationOptions*) = 0; + typedef AXObjectCache* (*AXObjectCacheCreateFunction)(Document&, const ui::AXMode&); static void Init(AXObjectCacheCreateFunction);
diff --git a/third_party/blink/renderer/core/animation/animation.cc b/third_party/blink/renderer/core/animation/animation.cc index c791275..fb998597 100644 --- a/third_party/blink/renderer/core/animation/animation.cc +++ b/third_party/blink/renderer/core/animation/animation.cc
@@ -1028,7 +1028,6 @@ // https://www.w3.org/TR/web-animations-1/#setting-the-start-time-of-an-animation void Animation::setStartTime(const V8CSSNumberish* start_time, ExceptionState& exception_state) { - absl::optional<AnimationTimeDelta> new_start_time; // Failure to convert results in a thrown exception and returning false. if (!ConvertCSSNumberishToTime(start_time, new_start_time, "startTime", @@ -2827,18 +2826,14 @@ } void Animation::UpdateCompositedPaintStatus() { - if (!RuntimeEnabledFeatures::CompositeBGColorAnimationEnabled()) + if (!RuntimeEnabledFeatures::CompositeBGColorAnimationEnabled() && + !RuntimeEnabledFeatures::CompositeClipPathAnimationEnabled()) return; KeyframeEffect* keyframe_effect = DynamicTo<KeyframeEffect>(content_.Get()); if (!keyframe_effect) return; - if (!keyframe_effect->Affects( - PropertyHandle(GetCSSPropertyBackgroundColor()))) { - return; - } - Element* target = keyframe_effect->EffectTarget(); if (!target) return; @@ -2846,8 +2841,17 @@ ElementAnimations* element_animations = target->GetElementAnimations(); DCHECK(element_animations); - element_animations->SetCompositedBackgroundColorStatus( - ElementAnimations::CompositedPaintStatus::kNeedsRepaintOrNoAnimation); + if (RuntimeEnabledFeatures::CompositeBGColorAnimationEnabled() && + keyframe_effect->Affects( + PropertyHandle(GetCSSPropertyBackgroundColor()))) { + element_animations->SetCompositedBackgroundColorStatus( + ElementAnimations::CompositedPaintStatus::kNeedsRepaintOrNoAnimation); + } + if (RuntimeEnabledFeatures::CompositeClipPathAnimationEnabled() && + keyframe_effect->Affects(PropertyHandle(GetCSSPropertyClipPath()))) { + element_animations->SetCompositedClipPathStatus( + ElementAnimations::CompositedPaintStatus::kNeedsRepaintOrNoAnimation); + } } void Animation::Trace(Visitor* visitor) const {
diff --git a/third_party/blink/renderer/core/animation/animation_test.cc b/third_party/blink/renderer/core/animation/animation_test.cc index 45da6bf5..d7d225a 100644 --- a/third_party/blink/renderer/core/animation/animation_test.cc +++ b/third_party/blink/renderer/core/animation/animation_test.cc
@@ -216,7 +216,7 @@ void SimulateAwaitReady() { SimulateFrame(last_frame_time); } void SimulateMicrotask() { - GetDocument().GetAgent()->event_loop()->PerformMicrotaskCheckpoint(); + GetDocument().GetAgent().event_loop()->PerformMicrotaskCheckpoint(); } void SimulateFrameForScrollAnimations() {
diff --git a/third_party/blink/renderer/core/animation/compositor_animations.cc b/third_party/blink/renderer/core/animation/compositor_animations.cc index 07f1edf7..3fe1426 100644 --- a/third_party/blink/renderer/core/animation/compositor_animations.cc +++ b/third_party/blink/renderer/core/animation/compositor_animations.cc
@@ -429,6 +429,13 @@ element_animations->CompositedBackgroundColorStatus() != ElementAnimations::CompositedPaintStatus::kComposited); } + if (effect.Affects(PropertyHandle(GetCSSPropertyClipPath()))) { + ElementAnimations* element_animations = + target_element.GetElementAnimations(); + DCHECK(element_animations && + element_animations->CompositedClipPathStatus() != + ElementAnimations::CompositedPaintStatus::kComposited); + } #endif reasons |= kCompositorPropertyAnimationsHaveNoEffect; }
diff --git a/third_party/blink/renderer/core/animation/compositor_animations_test.cc b/third_party/blink/renderer/core/animation/compositor_animations_test.cc index 5841e02..035fe06 100644 --- a/third_party/blink/renderer/core/animation/compositor_animations_test.cc +++ b/third_party/blink/renderer/core/animation/compositor_animations_test.cc
@@ -75,6 +75,7 @@ #include "third_party/blink/renderer/core/svg/svg_length.h" #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h" #include "third_party/blink/renderer/core/testing/dummy_page_holder.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/heap/thread_state.h" @@ -2346,9 +2347,11 @@ Element* target = GetElementById("target"); ASSERT_TRUE(target); + ScopedNullExecutionContext execution_context; // Move the target element to another Document, that does not have a frame // (and thus no Settings). - Document* another_document = Document::CreateForTest(); + Document* another_document = + Document::CreateForTest(execution_context.GetExecutionContext()); ASSERT_FALSE(another_document->GetSettings()); another_document->adoptNode(target, ASSERT_NO_EXCEPTION);
diff --git a/third_party/blink/renderer/core/animation/css_interpolation_types_map_test.cc b/third_party/blink/renderer/core/animation/css_interpolation_types_map_test.cc index ba083ef..cf341dc 100644 --- a/third_party/blink/renderer/core/animation/css_interpolation_types_map_test.cc +++ b/third_party/blink/renderer/core/animation/css_interpolation_types_map_test.cc
@@ -20,8 +20,9 @@ execution_context->GetSecurityContext().SetDocumentPolicy( DocumentPolicy::CreateWithHeaderPolicy({})); - DocumentInit init = - DocumentInit::Create().WithExecutionContext(execution_context); + DocumentInit init = DocumentInit::Create() + .WithExecutionContext(execution_context) + .WithAgent(*execution_context->GetAgent()); auto* document1 = MakeGarbageCollected<Document>(init); auto* document2 = MakeGarbageCollected<Document>(init);
diff --git a/third_party/blink/renderer/core/animation/document_animations.cc b/third_party/blink/renderer/core/animation/document_animations.cc index 6dfcaf0..646d035 100644 --- a/third_party/blink/renderer/core/animation/document_animations.cc +++ b/third_party/blink/renderer/core/animation/document_animations.cc
@@ -102,7 +102,7 @@ // This is to ensure that any microtasks queued up as a result of resolving or // rejecting Promise objects as part of updating timelines run their callbacks // prior to dispatching animation events and generating the next main frame. - document_->GetAgent()->event_loop()->PerformMicrotaskCheckpoint(); + document_->GetAgent().event_loop()->PerformMicrotaskCheckpoint(); } bool DocumentAnimations::NeedsAnimationTimingUpdate() { @@ -285,7 +285,7 @@ } } scoped_refptr<scheduler::EventLoop> event_loop = - document_->GetAgent()->event_loop(); + document_->GetAgent().event_loop(); // The list of animations for removal is constructed in reverse composite // ordering for efficiency. Flip the ordering to ensure that events are
diff --git a/third_party/blink/renderer/core/animation/document_timeline_test.cc b/third_party/blink/renderer/core/animation/document_timeline_test.cc index 8fe92dc3..16eb63b 100644 --- a/third_party/blink/renderer/core/animation/document_timeline_test.cc +++ b/third_party/blink/renderer/core/animation/document_timeline_test.cc
@@ -43,6 +43,7 @@ #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/dom/qualified_name.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/core/testing/page_test_base.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/heap/thread_state.h" @@ -206,7 +207,9 @@ EXPECT_EQ(2, timeline->CurrentTimeSeconds()); EXPECT_EQ(2000, timeline->CurrentTimeMilliseconds()); - auto* document_without_frame = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document_without_frame = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* inactive_timeline = MakeGarbageCollected<DocumentTimeline>( document_without_frame, base::TimeDelta(), platform_timing);
diff --git a/third_party/blink/renderer/core/animation/element_animations.cc b/third_party/blink/renderer/core/animation/element_animations.cc index 0251eda..93d8f3ec 100644 --- a/third_party/blink/renderer/core/animation/element_animations.cc +++ b/third_party/blink/renderer/core/animation/element_animations.cc
@@ -39,6 +39,8 @@ ElementAnimations::ElementAnimations() : animation_style_change_(false), composited_background_color_status_(static_cast<unsigned>( + CompositedPaintStatus::kNeedsRepaintOrNoAnimation)), + composited_clip_path_status_(static_cast<unsigned>( CompositedPaintStatus::kNeedsRepaintOrNoAnimation)) {} ElementAnimations::~ElementAnimations() = default;
diff --git a/third_party/blink/renderer/core/animation/element_animations.h b/third_party/blink/renderer/core/animation/element_animations.h index bd898c95..863ca14 100644 --- a/third_party/blink/renderer/core/animation/element_animations.h +++ b/third_party/blink/renderer/core/animation/element_animations.h
@@ -120,6 +120,14 @@ void SetCompositedBackgroundColorStatus(CompositedPaintStatus status); + CompositedPaintStatus CompositedClipPathStatus() { + return static_cast<CompositedPaintStatus>(composited_clip_path_status_); + } + + void SetCompositedClipPathStatus(CompositedPaintStatus status) { + composited_clip_path_status_ = static_cast<unsigned>(status); + } + void Trace(Visitor*) const; private: @@ -138,11 +146,12 @@ // See also StyleBaseData. bool animation_style_change_ : 1; - // The decision of whether to composite a background color animation needs to + // The decision of whether to composite a compositable animations needs to // be made at Paint time and respected by the compositor. // The size of the bit-field must be updated if adding new // CompositedPaintStatus values to ensure that it can hold the value. unsigned composited_background_color_status_ : 2; + unsigned composited_clip_path_status_ : 2; FRIEND_TEST_ALL_PREFIXES(StyleEngineTest, PseudoElementBaseComputedStyle); };
diff --git a/third_party/blink/renderer/core/animation/scroll_timeline_util_test.cc b/third_party/blink/renderer/core/animation/scroll_timeline_util_test.cc index e9b47ecc..b66a738 100644 --- a/third_party/blink/renderer/core/animation/scroll_timeline_util_test.cc +++ b/third_party/blink/renderer/core/animation/scroll_timeline_util_test.cc
@@ -11,6 +11,7 @@ #include "third_party/blink/renderer/core/css/resolver/style_resolver.h" #include "third_party/blink/renderer/core/html/html_div_element.h" #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" namespace blink { @@ -64,8 +65,9 @@ TEST_F(ScrollTimelineUtilTest, ToCompositorScrollTimelineDocumentTimelineParameter) { - DocumentTimeline* timeline = - MakeGarbageCollected<DocumentTimeline>(Document::CreateForTest()); + ScopedNullExecutionContext execution_context; + DocumentTimeline* timeline = MakeGarbageCollected<DocumentTimeline>( + Document::CreateForTest(execution_context.GetExecutionContext())); EXPECT_EQ(ToCompositorScrollTimeline(timeline), nullptr); }
diff --git a/third_party/blink/renderer/core/css/build.gni b/third_party/blink/renderer/core/css/build.gni index a9c6986..0b79d92 100644 --- a/third_party/blink/renderer/core/css/build.gni +++ b/third_party/blink/renderer/core/css/build.gni
@@ -70,6 +70,8 @@ "css_bracketed_value_list.h", "css_color.cc", "css_color.h", + "css_color_mix_value.h", + "css_color_mix_value.cc", "css_computed_style_declaration.cc", "css_computed_style_declaration.h", "css_condition_rule.cc",
diff --git a/third_party/blink/renderer/core/css/check_pseudo_has_argument_context_test.cc b/third_party/blink/renderer/core/css/check_pseudo_has_argument_context_test.cc index 6e5fcbc..07ea27d7 100644 --- a/third_party/blink/renderer/core/css/check_pseudo_has_argument_context_test.cc +++ b/third_party/blink/renderer/core/css/check_pseudo_has_argument_context_test.cc
@@ -10,6 +10,7 @@ #include "third_party/blink/renderer/core/css/parser/css_parser_context.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/html/html_document.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/core/testing/page_test_base.h" namespace blink { @@ -416,7 +417,9 @@ TEST_F(CheckPseudoHasArgumentContextTest, TestTraversalIteratorCase1) { // CheckPseudoHasArgumentTraversalScope::kSubtree - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -472,7 +475,9 @@ TEST_F(CheckPseudoHasArgumentContextTest, TestTraversalIteratorCase2) { // CheckPseudoHasArgumentTraversalScope::kAllNextSiblings - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -505,7 +510,9 @@ TEST_F(CheckPseudoHasArgumentContextTest, TestTraversalIteratorCase3) { // CheckPseudoHasArgumentTraversalScope::kOneNextSiblingSubtree - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -571,7 +578,9 @@ TEST_F(CheckPseudoHasArgumentContextTest, TestTraversalIteratorCase4) { // CheckPseudoHasArgumentTraversalScope::kAllNextSiblingSubtrees - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -625,7 +634,9 @@ TEST_F(CheckPseudoHasArgumentContextTest, TestTraversalIteratorCase5) { // CheckPseudoHasArgumentTraversalScope::kOneNextSibling - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -661,7 +672,9 @@ TEST_F(CheckPseudoHasArgumentContextTest, TestTraversalIteratorCase6) { // CheckPseudoHasArgumentTraversalScope::kFixedDepthDescendants - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -714,7 +727,9 @@ TEST_F(CheckPseudoHasArgumentContextTest, TestTraversalIteratorCase7) { // CheckPseudoHasArgumentTraversalScope::kOneNextSiblingFixedDepthDescendants - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -780,7 +795,9 @@ TEST_F(CheckPseudoHasArgumentContextTest, TestTraversalIteratorCase8) { // CheckPseudoHasArgumentTraversalScope::kAllNextSiblingsFixedDepthDescendants - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main>
diff --git a/third_party/blink/renderer/core/css/check_pseudo_has_cache_scope_context_test.cc b/third_party/blink/renderer/core/css/check_pseudo_has_cache_scope_context_test.cc index 7b87d10..49645f4 100644 --- a/third_party/blink/renderer/core/css/check_pseudo_has_cache_scope_context_test.cc +++ b/third_party/blink/renderer/core/css/check_pseudo_has_cache_scope_context_test.cc
@@ -13,6 +13,7 @@ #include "third_party/blink/renderer/core/css/parser/css_parser_context.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/html/html_document.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/core/testing/page_test_base.h" namespace blink { @@ -218,7 +219,9 @@ Case1StartsWithDescendantCombinator) { // CheckPseudoHasArgumentTraversalScope::kSubtree - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -394,7 +397,9 @@ TEST_F(CheckPseudoHasCacheScopeContextTest, Case1StartsWithChildCombinator) { // CheckPseudoHasArgumentTraversalScope::kSubtree - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -625,7 +630,9 @@ TEST_F(CheckPseudoHasCacheScopeContextTest, Case2StartsWithIndirectAdjacent) { // CheckPseudoHasArgumentTraversalScope::kAllNextSiblings - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -729,7 +736,9 @@ TEST_F(CheckPseudoHasCacheScopeContextTest, Case2StartsWithDirectAdjacent) { // CheckPseudoHasArgumentTraversalScope::kAllNextSiblings - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -923,7 +932,9 @@ TEST_F(CheckPseudoHasCacheScopeContextTest, Case3) { // CheckPseudoHasArgumentTraversalScope::kOneNextSiblingSubtree - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -1141,7 +1152,9 @@ TEST_F(CheckPseudoHasCacheScopeContextTest, Case4) { // CheckPseudoHasArgumentTraversalScope::kAllNextSiblingSubtrees - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -1448,7 +1461,9 @@ QuerySelectorAllCase1StartsWithDescendantCombinator) { // CheckPseudoHasArgumentTraversalScope::kSubtree - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -1682,7 +1697,9 @@ QuerySelectorAllCase1StartsWithChildCombinator) { // CheckPseudoHasArgumentTraversalScope::kSubtree - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -1782,7 +1799,9 @@ QuerySelectorAllCase1StartsWithChildCombinatorNonSubjectHas) { // CheckPseudoHasArgumentTraversalScope::kSubtree - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -1949,7 +1968,9 @@ QuerySelectorAllCase2NonSubjectHas) { // CheckPseudoHasArgumentTraversalScope::kAllNextSiblings - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -2069,7 +2090,9 @@ QuerySelectorAllCase3NonSubjectHas) { // CheckPseudoHasArgumentTraversalScope::kOneNextSiblingSubtree - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -2161,7 +2184,9 @@ QuerySelectorAllCase4NonSubjectHas) { // CheckPseudoHasArgumentTraversalScope::kAllNextSiblingSubtrees - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -2258,7 +2283,9 @@ QuerySelectorAllCase4StartsWithDirectAdjacentCombinator) { // CheckPseudoHasArgumentTraversalScope::kAllNextSiblingSubtrees - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -2456,7 +2483,9 @@ TEST_F(CheckPseudoHasCacheScopeContextTest, QuerySelectorAllCase5) { // CheckPseudoHasArgumentTraversalScope::kOneNextSibling - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -2539,7 +2568,9 @@ TEST_F(CheckPseudoHasCacheScopeContextTest, QuerySelectorAllCase6) { // CheckPseudoHasArgumentTraversalScope::kFixedDepthDescendants - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -2642,7 +2673,9 @@ TEST_F(CheckPseudoHasCacheScopeContextTest, QuerySelectorAllCase7) { // CheckPseudoHasArgumentTraversalScope::kOneNextSiblingFixedDepthDescendants - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main> @@ -2721,7 +2754,9 @@ TEST_F(CheckPseudoHasCacheScopeContextTest, QuerySelectorAllCase8) { // CheckPseudoHasArgumentTraversalScope::kAllNextSiblingsFixedDepthDescendants - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main>
diff --git a/third_party/blink/renderer/core/css/css_color_mix_value.cc b/third_party/blink/renderer/core/css/css_color_mix_value.cc new file mode 100644 index 0000000..5c929c5 --- /dev/null +++ b/third_party/blink/renderer/core/css/css_color_mix_value.cc
@@ -0,0 +1,92 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/core/css/css_color_mix_value.h" +#include "third_party/blink/renderer/core/css/css_color.h" +#include "third_party/blink/renderer/core/css/css_primitive_value.h" +#include "third_party/blink/renderer/platform/wtf/math_extras.h" +#include "third_party/blink/renderer/platform/wtf/text/string_builder.h" + +namespace blink::cssvalue { + +bool CSSColorMixValue::NormalizePercentages( + const CSSPrimitiveValue* percentage1, + const CSSPrimitiveValue* percentage2, + double& mix_amount, + double& alpha_multiplier) { + double p1 = 0.5; + double p2 = 0.5; + if (percentage1 && !percentage2) { + p1 = ClampTo<double>(percentage1->GetDoubleValue(), 0.0, 100.0) / 100.0; + p2 = 1.0 - p1; + } else if (percentage2 && !percentage1) { + p2 = ClampTo<double>(percentage2->GetDoubleValue(), 0.0, 100.0) / 100.0; + p1 = 1.0 - p2; + } else if (percentage1 && percentage2) { + p1 = ClampTo<double>(percentage1->GetDoubleValue(), 0.0, 100.0) / 100.0; + p2 = ClampTo<double>(percentage2->GetDoubleValue(), 0.0, 100.0) / 100.0; + } + + if (p1 == 0.0 && p2 == 0.0) + return false; + + alpha_multiplier = 1.0; + + double scale = p1 + p2; + if (scale != 0.0) { + p1 /= scale; + p2 /= scale; + if (scale <= 1.0) + alpha_multiplier = scale; + } + + mix_amount = p1; + if (p2 == 0.0) + mix_amount = 1.0; + + return true; +} + +bool CSSColorMixValue::Equals(const CSSColorMixValue& other) const { + return color1_ == other.color1_ && color2_ == other.color2_ && + percentage1_ == other.percentage1_ && + percentage2_ == other.percentage2_ && + color_interpolation_space_ == other.color_interpolation_space_ && + hue_interpolation_method_ == other.hue_interpolation_method_; +} + +String CSSColorMixValue::CustomCSSText() const { + // color-mix values with currentColor as one of the components cannot be + // eagerly resolved (https://github.com/w3c/csswg-drafts/issues/6168) + // Color keywords should be handled similarly. + StringBuilder result; + result.Append("color-mix("); + result.Append(Color::ColorInterpolationSpaceToString( + color_interpolation_space_, hue_interpolation_method_)); + result.Append(", "); + result.Append(color1_->CssText()); + if (percentage1_) { + result.Append(" "); + result.Append(percentage1_->CssText()); + } + result.Append(", "); + result.Append(color2_->CssText()); + if (percentage2_) { + result.Append(" "); + result.Append(percentage2_->CssText()); + } + result.Append(")"); + + return result.ReleaseString(); +} + +void CSSColorMixValue::TraceAfterDispatch(blink::Visitor* visitor) const { + visitor->Trace(color1_); + visitor->Trace(color2_); + visitor->Trace(percentage1_); + visitor->Trace(percentage2_); + CSSValue::TraceAfterDispatch(visitor); +} + +} // namespace blink::cssvalue
diff --git a/third_party/blink/renderer/core/css/css_color_mix_value.h b/third_party/blink/renderer/core/css/css_color_mix_value.h new file mode 100644 index 0000000..9231c90 --- /dev/null +++ b/third_party/blink/renderer/core/css/css_color_mix_value.h
@@ -0,0 +1,80 @@ +// 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_CSS_CSS_COLOR_MIX_VALUE_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_COLOR_MIX_VALUE_H_ + +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/css/css_primitive_value.h" +#include "third_party/blink/renderer/core/css/css_value.h" +#include "third_party/blink/renderer/platform/graphics/color.h" +#include "third_party/blink/renderer/platform/wtf/casting.h" + +namespace blink { +namespace cssvalue { + +// This is a class for storing the result of parsing the color-mix function +// before resolving it into a blink::Color. See +// https://www.w3.org/TR/css-color-5/#color-mix +class CORE_EXPORT CSSColorMixValue : public CSSValue { + public: + CSSColorMixValue( + const CSSValue* color1, + const CSSValue* color2, + const CSSPrimitiveValue* p1, + const CSSPrimitiveValue* p2, + const Color::ColorInterpolationSpace color_interpolation_space, + const Color::HueInterpolationMethod hue_interpolation_method) + : CSSValue(kColorMixClass), + color1_(color1), + color2_(color2), + percentage1_(p1), + percentage2_(p2), + color_interpolation_space_(color_interpolation_space), + hue_interpolation_method_(hue_interpolation_method) {} + + String CustomCSSText() const; + + void TraceAfterDispatch(blink::Visitor* visitor) const; + + bool Equals(const CSSColorMixValue& other) const; + + const CSSValue& Color1() const { return *color1_; } + const CSSValue& Color2() const { return *color2_; } + const CSSPrimitiveValue* Percentage1() const { return percentage1_; } + const CSSPrimitiveValue* Percentage2() const { return percentage2_; } + Color::ColorInterpolationSpace ColorInterpolationSpace() const { + return color_interpolation_space_; + } + Color::HueInterpolationMethod HueInterpolationMethod() const { + return hue_interpolation_method_; + } + // https://www.w3.org/TR/css-color-5/#color-mix-percent-norm + static bool NormalizePercentages(const CSSPrimitiveValue* percentage1, + const CSSPrimitiveValue* percentage2, + double& mix_amount, + double& alpha_multiplier); + + private: + Member<const CSSValue> color1_; + Member<const CSSValue> color2_; + Member<const CSSPrimitiveValue> percentage1_; + Member<const CSSPrimitiveValue> percentage2_; + const Color::ColorInterpolationSpace color_interpolation_space_; + const Color::HueInterpolationMethod hue_interpolation_method_; +}; + +} // namespace cssvalue + +template <> +struct DowncastTraits<cssvalue::CSSColorMixValue> { + static bool AllowFrom(const CSSValue& value) { + return value.IsColorMixValue(); + } +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_COLOR_MIX_VALUE_H_
diff --git a/third_party/blink/renderer/core/css/css_gradient_value.cc b/third_party/blink/renderer/core/css/css_gradient_value.cc index 728fff8..3e61750 100644 --- a/third_party/blink/renderer/core/css/css_gradient_value.cc +++ b/third_party/blink/renderer/core/css/css_gradient_value.cc
@@ -816,70 +816,6 @@ CSSImageGeneratorValue::TraceAfterDispatch(visitor); } -static void AppendColorInterpolationSpace( - StringBuilder& result, - Color::ColorInterpolationSpace color_space, - Color::HueInterpolationMethod hue_interpolation_method) { - switch (color_space) { - case Color::ColorInterpolationSpace::kLab: - result.Append("lab"); - break; - case Color::ColorInterpolationSpace::kLCH: - result.Append("lch"); - break; - case Color::ColorInterpolationSpace::kOKLab: - result.Append("oklab"); - break; - case Color::ColorInterpolationSpace::kOKLCH: - result.Append("oklch"); - break; - case Color::ColorInterpolationSpace::kSRGBLinear: - result.Append("srgb-linear"); - break; - case Color::ColorInterpolationSpace::kSRGB: - result.Append("srgb"); - break; - case Color::ColorInterpolationSpace::kXYZD65: - result.Append("xyz-d65"); - break; - case Color::ColorInterpolationSpace::kXYZD50: - result.Append("xyz-d50"); - break; - case Color::ColorInterpolationSpace::kHSL: - result.Append("hsl"); - break; - case Color::ColorInterpolationSpace::kHWB: - result.Append("hwb"); - break; - case Color::ColorInterpolationSpace::kNone: - NOTREACHED(); - break; - } - - if (color_space == Color::ColorInterpolationSpace::kLCH || - color_space == Color::ColorInterpolationSpace::kOKLCH || - color_space == Color::ColorInterpolationSpace::kHSL || - color_space == Color::ColorInterpolationSpace::kHWB) { - switch (hue_interpolation_method) { - case Color::HueInterpolationMethod::kDecreasing: - result.Append(" decreasing hue"); - break; - case Color::HueInterpolationMethod::kIncreasing: - result.Append(" increasing hue"); - break; - case Color::HueInterpolationMethod::kLonger: - result.Append(" longer hue"); - break; - case Color::HueInterpolationMethod::kSpecified: - result.Append(" specified hue"); - break; - // Shorter is the default value and does not get serialized - case Color::HueInterpolationMethod::kShorter: - break; - } - } -} - bool CSSGradientValue::ShouldSerializeColorSpace() const { if (color_interpolation_space_ == Color::ColorInterpolationSpace::kNone) return false; @@ -976,8 +912,8 @@ result.Append(" "); wrote_something = true; result.Append("in "); - AppendColorInterpolationSpace(result, color_interpolation_space_, - hue_interpolation_method_); + result.Append(Color::ColorInterpolationSpaceToString( + color_interpolation_space_, hue_interpolation_method_)); } AppendCSSTextForColorStops(result, wrote_something); @@ -1341,8 +1277,8 @@ if (ShouldSerializeColorSpace()) { result.Append(" in "); - AppendColorInterpolationSpace(result, color_interpolation_space_, - hue_interpolation_method_); + result.Append(Color::ColorInterpolationSpaceToString( + color_interpolation_space_, hue_interpolation_method_)); } AppendCSSTextForColorStops(result, kAppendSeparator); @@ -1387,8 +1323,8 @@ result.Append(" "); result.Append("in "); wrote_something = true; - AppendColorInterpolationSpace(result, color_interpolation_space_, - hue_interpolation_method_); + result.Append(Color::ColorInterpolationSpaceToString( + color_interpolation_space_, hue_interpolation_method_)); } AppendCSSTextForColorStops(result, wrote_something); @@ -1695,8 +1631,8 @@ result.Append(" "); result.Append("in "); wrote_something = true; - AppendColorInterpolationSpace(result, color_interpolation_space_, - hue_interpolation_method_); + result.Append(Color::ColorInterpolationSpaceToString( + color_interpolation_space_, hue_interpolation_method_)); } AppendCSSTextForColorStops(result, wrote_something);
diff --git a/third_party/blink/renderer/core/css/css_test_helpers.cc b/third_party/blink/renderer/core/css/css_test_helpers.cc index 49c591d1..111b635 100644 --- a/third_party/blink/renderer/core/css/css_test_helpers.cc +++ b/third_party/blink/renderer/core/css/css_test_helpers.cc
@@ -39,7 +39,7 @@ TestStyleSheet::~TestStyleSheet() = default; TestStyleSheet::TestStyleSheet() { - document_ = Document::CreateForTest(); + document_ = Document::CreateForTest(execution_context_.GetExecutionContext()); style_sheet_ = CreateStyleSheet(*document_); }
diff --git a/third_party/blink/renderer/core/css/css_test_helpers.h b/third_party/blink/renderer/core/css/css_test_helpers.h index 835fce0..2b63b98 100644 --- a/third_party/blink/renderer/core/css/css_test_helpers.h +++ b/third_party/blink/renderer/core/css/css_test_helpers.h
@@ -9,6 +9,7 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/renderer/core/css/css_selector_list.h" #include "third_party/blink/renderer/core/css/rule_set.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" namespace blink { @@ -42,6 +43,7 @@ CSSRuleList* CssRules(); private: + ScopedNullExecutionContext execution_context_; Persistent<Document> document_; Persistent<CSSStyleSheet> style_sheet_; };
diff --git a/third_party/blink/renderer/core/css/css_value.cc b/third_party/blink/renderer/core/css/css_value.cc index dd38571..f87d27e 100644 --- a/third_party/blink/renderer/core/css/css_value.cc +++ b/third_party/blink/renderer/core/css/css_value.cc
@@ -31,6 +31,7 @@ #include "third_party/blink/renderer/core/css/css_border_image_slice_value.h" #include "third_party/blink/renderer/core/css/css_bracketed_value_list.h" #include "third_party/blink/renderer/core/css/css_color.h" +#include "third_party/blink/renderer/core/css/css_color_mix_value.h" #include "third_party/blink/renderer/core/css/css_content_distribution_value.h" #include "third_party/blink/renderer/core/css/css_counter_value.h" #include "third_party/blink/renderer/core/css/css_crossfade_value.h" @@ -187,6 +188,8 @@ other); case kColorClass: return CompareCSSValues<cssvalue::CSSColor>(*this, other); + case kColorMixClass: + return CompareCSSValues<cssvalue::CSSColorMixValue>(*this, other); case kCounterClass: return CompareCSSValues<cssvalue::CSSCounterValue>(*this, other); case kCursorImageClass: @@ -327,6 +330,8 @@ return To<cssvalue::CSSBorderImageSliceValue>(this)->CustomCSSText(); case kColorClass: return To<cssvalue::CSSColor>(this)->CustomCSSText(); + case kColorMixClass: + return To<cssvalue::CSSColorMixValue>(this)->CustomCSSText(); case kCounterClass: return To<cssvalue::CSSCounterValue>(this)->CustomCSSText(); case kCursorImageClass: @@ -470,6 +475,9 @@ case kColorClass: To<cssvalue::CSSColor>(this)->TraceAfterDispatch(visitor); return; + case kColorMixClass: + To<cssvalue::CSSColorMixValue>(this)->TraceAfterDispatch(visitor); + return; case kCounterClass: To<cssvalue::CSSCounterValue>(this)->TraceAfterDispatch(visitor); return;
diff --git a/third_party/blink/renderer/core/css/css_value.h b/third_party/blink/renderer/core/css/css_value.h index 9fe46b30..3b4cceb 100644 --- a/third_party/blink/renderer/core/css/css_value.h +++ b/third_party/blink/renderer/core/css/css_value.h
@@ -79,6 +79,7 @@ return class_type_ == kBorderImageSliceClass; } bool IsColorValue() const { return class_type_ == kColorClass; } + bool IsColorMixValue() const { return class_type_ == kColorMixClass; } bool IsCounterValue() const { return class_type_ == kCounterClass; } bool IsCursorImageValue() const { return class_type_ == kCursorImageClass; } bool IsCrossfadeValue() const { return class_type_ == kCrossfadeClass; } @@ -201,6 +202,7 @@ kMathFunctionClass, kIdentifierClass, kColorClass, + kColorMixClass, kCounterClass, kQuadClass, kCustomIdentClass,
diff --git a/third_party/blink/renderer/core/css/css_value_keywords.json5 b/third_party/blink/renderer/core/css/css_value_keywords.json5 index 79778e3..f2b8a1f 100644 --- a/third_party/blink/renderer/core/css/css_value_keywords.json5 +++ b/third_party/blink/renderer/core/css/css_value_keywords.json5
@@ -1309,6 +1309,8 @@ // For gradient interpolations in certain color spaces "in", + // The color-mix function https://www.w3.org/TR/css-color-5/#color-mix + "color-mix", // transform "matrix", @@ -1480,7 +1482,7 @@ // (device-posture) media feature "continuous", "folded", - + // scrollbar-gutter // auto "stable",
diff --git a/third_party/blink/renderer/core/css/cssom/inline_style_property_map_test.cc b/third_party/blink/renderer/core/css/cssom/inline_style_property_map_test.cc index 555d8b4..0d74871 100644 --- a/third_party/blink/renderer/core/css/cssom/inline_style_property_map_test.cc +++ b/third_party/blink/renderer/core/css/cssom/inline_style_property_map_test.cc
@@ -9,6 +9,7 @@ #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/style_property_shorthand.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" namespace blink { @@ -16,7 +17,9 @@ // Test that trying to reify any longhands with a CSSPendingSubstitutionValue // does not cause a crash. - Document* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + Document* document = + Document::CreateForTest(execution_context.GetExecutionContext()); Element* div = document->CreateRawElement(html_names::kDivTag); InlineStylePropertyMap map(div);
diff --git a/third_party/blink/renderer/core/css/media_query_exp_test.cc b/third_party/blink/renderer/core/css/media_query_exp_test.cc index 4c1fd50e..aa275c7 100644 --- a/third_party/blink/renderer/core/css/media_query_exp_test.cc +++ b/third_party/blink/renderer/core/css/media_query_exp_test.cc
@@ -5,6 +5,7 @@ #include "third_party/blink/renderer/core/css/media_query_exp.h" #include "third_party/blink/renderer/core/css/css_test_helpers.h" #include "third_party/blink/renderer/core/dom/document.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "testing/gtest/include/gtest/gtest.h" @@ -404,9 +405,11 @@ LeftExp("width", LtCmp(CqhValue(10.0))).GetUnitFlags()); // width < calc(10em + 10dvh) + ScopedNullExecutionContext execution_context; const auto* calc_value = DynamicTo<CSSPrimitiveValue>(css_test_helpers::ParseValue( - *Document::CreateForTest(), "<length>", "calc(10em + 10dvh)")); + *Document::CreateForTest(execution_context.GetExecutionContext()), + "<length>", "calc(10em + 10dvh)")); ASSERT_TRUE(calc_value); EXPECT_EQ( static_cast<unsigned>(MediaQueryExpValue::UnitFlags::kFontRelative |
diff --git a/third_party/blink/renderer/core/css/media_query_list_test.cc b/third_party/blink/renderer/core/css/media_query_list_test.cc index 03e2683a..6fc516da 100644 --- a/third_party/blink/renderer/core/css/media_query_list_test.cc +++ b/third_party/blink/renderer/core/css/media_query_list_test.cc
@@ -9,6 +9,7 @@ #include "third_party/blink/renderer/core/css/media_query_list_listener.h" #include "third_party/blink/renderer/core/css/media_query_matcher.h" #include "third_party/blink/renderer/core/dom/document.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" namespace blink { @@ -23,7 +24,9 @@ } // anonymous namespace TEST(MediaQueryListTest, CrashInStop) { - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* list = MakeGarbageCollected<MediaQueryList>( document->GetExecutionContext(), MakeGarbageCollected<MediaQueryMatcher>(*document),
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_impl_test.cc b/third_party/blink/renderer/core/css/parser/css_parser_impl_test.cc index 6d90e49..732433b6 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_impl_test.cc +++ b/third_party/blink/renderer/core/css/parser/css_parser_impl_test.cc
@@ -17,6 +17,7 @@ #include "third_party/blink/renderer/core/css/style_sheet_contents.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/execution_context/security_context.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" namespace blink { @@ -200,15 +201,18 @@ } TEST(CSSParserImplTest, AtContainerDisabled) { + ScopedNullExecutionContext execution_context; String rule = "@container (max-width: 100px) { }"; { ScopedCSSContainerQueriesForTest scoped_feature(true); - Document* document = Document::CreateForTest(); + Document* document = + Document::CreateForTest(execution_context.GetExecutionContext()); EXPECT_TRUE(css_test_helpers::ParseRule(*document, rule)); } { ScopedCSSContainerQueriesForTest scoped_feature(false); - Document* document = Document::CreateForTest(); + Document* document = + Document::CreateForTest(execution_context.GetExecutionContext()); EXPECT_FALSE(css_test_helpers::ParseRule(*document, rule)); } } @@ -358,7 +362,9 @@ TEST(CSSParserImplTest, InvalidLayerRules) { using css_test_helpers::ParseRule; - Document* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + Document* document = + Document::CreateForTest(execution_context.GetExecutionContext()); // At most one layer name in an @layer block rule EXPECT_FALSE(ParseRule(*document, "@layer foo, bar { }")); @@ -382,7 +388,9 @@ TEST(CSSParserImplTest, ValidLayerBlockRule) { using css_test_helpers::ParseRule; - Document* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + Document* document = + Document::CreateForTest(execution_context.GetExecutionContext()); // Basic named layer { @@ -415,7 +423,9 @@ TEST(CSSParserImplTest, ValidLayerStatementRule) { using css_test_helpers::ParseRule; - Document* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + Document* document = + Document::CreateForTest(execution_context.GetExecutionContext()); { String rule = "@layer foo;"; @@ -455,7 +465,9 @@ TEST(CSSParserImplTest, NestedLayerRules) { using css_test_helpers::ParseRule; - Document* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + Document* document = + Document::CreateForTest(execution_context.GetExecutionContext()); // Block rule as a child rule. { @@ -516,7 +528,9 @@ TEST(CSSParserImplTest, LayeredImportRules) { using css_test_helpers::ParseRule; - Document* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + Document* document = + Document::CreateForTest(execution_context.GetExecutionContext()); { String rule = "@import url(foo.css) layer;"; @@ -549,7 +563,9 @@ TEST(CSSParserImplTest, LayeredImportRulesInvalid) { using css_test_helpers::ParseRule; - Document* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + Document* document = + Document::CreateForTest(execution_context.GetExecutionContext()); // Invalid layer declarations in @import rules should not make the entire rule // invalid. They should be parsed as <general-enclosed> and have no effect. @@ -581,7 +597,9 @@ TEST(CSSParserImplTest, LayeredImportRulesMultipleLayers) { using css_test_helpers::ParseRule; - Document* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + Document* document = + Document::CreateForTest(execution_context.GetExecutionContext()); // If an @import rule has more than one layer keyword/function, only the first // one is parsed as layer, and the remaining ones are parsed as @@ -707,7 +725,9 @@ // @font-palette-values rules should be ignored when the feature is disabled. using css_test_helpers::ParseRule; - Document* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + Document* document = + Document::CreateForTest(execution_context.GetExecutionContext()); EXPECT_FALSE(ParseRule(*document, "@font-palette-values foo;")); EXPECT_FALSE(ParseRule(*document, "@font-palette-values foo { }")); EXPECT_FALSE(ParseRule(*document, "@font-palette-values foo.bar { }")); @@ -717,7 +737,9 @@ TEST(CSSParserImplTest, FontPaletteValuesBasicRuleParsing) { ScopedFontPaletteForTest enabled_scope(true); using css_test_helpers::ParseRule; - Document* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + Document* document = + Document::CreateForTest(execution_context.GetExecutionContext()); String rule = R"CSS(@font-palette-values --myTestPalette { font-family: testFamily; base-palette: 0;
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc index ddfb0ff3..57f6f8a 100644 --- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc +++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
@@ -13,6 +13,7 @@ #include "third_party/blink/renderer/core/css/css_border_image.h" #include "third_party/blink/renderer/core/css/css_bracketed_value_list.h" #include "third_party/blink/renderer/core/css/css_color.h" +#include "third_party/blink/renderer/core/css/css_color_mix_value.h" #include "third_party/blink/renderer/core/css/css_content_distribution_value.h" #include "third_party/blink/renderer/core/css/css_crossfade_value.h" #include "third_party/blink/renderer/core/css/css_custom_ident_value.h" @@ -1688,11 +1689,129 @@ return args.AtEnd(); } +static bool ConsumeColorInterpolationSpace( + CSSParserTokenRange& args, + Color::ColorInterpolationSpace& color_space, + Color::HueInterpolationMethod& hue_interpolation) { + if (!RuntimeEnabledFeatures::CSSColor4Enabled()) + return false; + + if (!ConsumeIdent<CSSValueID::kIn>(args)) + return false; + + absl::optional<Color::ColorInterpolationSpace> read_color_space; + if (ConsumeIdent<CSSValueID::kXyz>(args)) + read_color_space = Color::ColorInterpolationSpace::kXYZD65; + else if (ConsumeIdent<CSSValueID::kXyzD50>(args)) + read_color_space = Color::ColorInterpolationSpace::kXYZD50; + else if (ConsumeIdent<CSSValueID::kXyzD65>(args)) + read_color_space = Color::ColorInterpolationSpace::kXYZD65; + else if (ConsumeIdent<CSSValueID::kSRGBLinear>(args)) + read_color_space = Color::ColorInterpolationSpace::kSRGBLinear; + else if (ConsumeIdent<CSSValueID::kLab>(args)) + read_color_space = Color::ColorInterpolationSpace::kLab; + else if (ConsumeIdent<CSSValueID::kOklab>(args)) + read_color_space = Color::ColorInterpolationSpace::kOKLab; + else if (ConsumeIdent<CSSValueID::kLch>(args)) + read_color_space = Color::ColorInterpolationSpace::kLCH; + else if (ConsumeIdent<CSSValueID::kOklch>(args)) + read_color_space = Color::ColorInterpolationSpace::kOKLCH; + else if (ConsumeIdent<CSSValueID::kSRGB>(args)) + read_color_space = Color::ColorInterpolationSpace::kSRGB; + else if (ConsumeIdent<CSSValueID::kHsl>(args)) + read_color_space = Color::ColorInterpolationSpace::kHSL; + else if (ConsumeIdent<CSSValueID::kHwb>(args)) + read_color_space = Color::ColorInterpolationSpace::kHWB; + + if (read_color_space) { + color_space = read_color_space.value(); + absl::optional<Color::HueInterpolationMethod> read_hue; + if (color_space == Color::ColorInterpolationSpace::kHSL || + color_space == Color::ColorInterpolationSpace::kHWB || + color_space == Color::ColorInterpolationSpace::kLCH || + color_space == Color::ColorInterpolationSpace::kOKLCH) { + if (ConsumeIdent<CSSValueID::kShorter>(args)) + read_hue = Color::HueInterpolationMethod::kShorter; + else if (ConsumeIdent<CSSValueID::kLonger>(args)) + read_hue = Color::HueInterpolationMethod::kLonger; + else if (ConsumeIdent<CSSValueID::kDecreasing>(args)) + read_hue = Color::HueInterpolationMethod::kDecreasing; + else if (ConsumeIdent<CSSValueID::kIncreasing>(args)) + read_hue = Color::HueInterpolationMethod::kIncreasing; + else if (ConsumeIdent<CSSValueID::kSpecified>(args)) + read_hue = Color::HueInterpolationMethod::kSpecified; + if (read_hue) { + if (!ConsumeIdent<CSSValueID::kHue>(args)) + return false; + hue_interpolation = read_hue.value(); + } else { + // Shorter is the default method for hue interpolation. + hue_interpolation = Color::HueInterpolationMethod::kShorter; + } + } + return true; + } + + return false; +} + +// https://www.w3.org/TR/css-color-5/#color-mix +static CSSValue* ConsumeColorMixFunction(CSSParserTokenRange& range, + const CSSParserContext& context) { + DCHECK(range.Peek().FunctionId() == CSSValueID::kColorMix); + if (!RuntimeEnabledFeatures::CSSColor4Enabled()) + return nullptr; + + CSSParserTokenRange args = ConsumeFunction(range); + // First argument is the colorspace + Color::ColorInterpolationSpace color_space; + Color::HueInterpolationMethod hue_interpolation_method; + if (!ConsumeColorInterpolationSpace(args, color_space, + hue_interpolation_method)) + return nullptr; + + if (!ConsumeCommaIncludingWhitespace(args)) + return nullptr; + + CSSValue* color1 = + ConsumeColor(args, context, false /* Accept quirky colors */); + if (!color1) + return nullptr; + CSSPrimitiveValue* p1 = + ConsumePercent(args, context, CSSPrimitiveValue::ValueRange::kAll); + // Reject negative values, but not negative calc() values. + if (p1 && p1->IsNumericLiteralValue() && p1->GetDoubleValue() < 0.0) + return nullptr; + + if (!ConsumeCommaIncludingWhitespace(args)) + return nullptr; + + CSSValue* color2 = + ConsumeColor(args, context, false /* Accept quirky colors */); + if (!color2) + return nullptr; + CSSPrimitiveValue* p2 = + ConsumePercent(args, context, CSSPrimitiveValue::ValueRange::kAll); + if (p2 && p2->IsNumericLiteralValue() && p2->GetDoubleValue() < 0.0) + return nullptr; + + // If both values are literally zero (and not calc()) reject at parse time + if (p1 && p2 && p1->IsNumericLiteralValue() && p1->GetDoubleValue() == 0.0f && + p2->IsNumericLiteralValue() && p2->GetDoubleValue() == 0.0) + return nullptr; + + cssvalue::CSSColorMixValue* result = + MakeGarbageCollected<cssvalue::CSSColorMixValue>( + color1, color2, p1, p2, color_space, hue_interpolation_method); + return result; +} + // https://www.w3.org/TR/css-color-4/#funcdef-color static bool ParseColorFunctionParameters(CSSParserTokenRange& range, const CSSParserContext& context, Color& result) { DCHECK(range.Peek().FunctionId() == CSSValueID::kColor); + CSSParserTokenRange args = ConsumeFunction(range); // First argument is the colorspace CSSValueID colorspace_id_ = args.ConsumeIncludingWhitespace().Id(); @@ -1962,6 +2081,13 @@ range.Peek().FunctionId() == CSSValueID::kColorContrast) { return ConsumeColorContrast(range, context, accept_quirky_colors); } + + if (RuntimeEnabledFeatures::CSSColor4Enabled() && + range.Peek().FunctionId() == CSSValueID::kColorMix) { + CSSValue* color = ConsumeColorMixFunction(range, context); + return color; + } + CSSValueID id = range.Peek().Id(); if (StyleColor::IsColorKeyword(id)) { if (!isValueAllowedInMode(id, context.Mode())) @@ -1974,6 +2100,7 @@ CSSIdentifierValue* color = ConsumeIdent(range); return color; } + Color color = Color::kTransparent; if (!ParseHexColor(range, color, accept_quirky_colors) && !ParseFunctionalSyntaxColor(range, context, color)) { @@ -2524,72 +2651,6 @@ : nullptr; } -static bool ConsumeColorSpace( - CSSParserTokenRange& args, - Color::ColorInterpolationSpace& color_space, - Color::HueInterpolationMethod& hue_interpolation) { - if (!RuntimeEnabledFeatures::CSSColor4Enabled()) - return false; - - if (!ConsumeIdent<CSSValueID::kIn>(args)) - return false; - - absl::optional<Color::ColorInterpolationSpace> read_color_space; - if (ConsumeIdent<CSSValueID::kXyz>(args)) - read_color_space = Color::ColorInterpolationSpace::kXYZD65; - else if (ConsumeIdent<CSSValueID::kXyzD50>(args)) - read_color_space = Color::ColorInterpolationSpace::kXYZD50; - else if (ConsumeIdent<CSSValueID::kXyzD65>(args)) - read_color_space = Color::ColorInterpolationSpace::kXYZD65; - else if (ConsumeIdent<CSSValueID::kSRGBLinear>(args)) - read_color_space = Color::ColorInterpolationSpace::kSRGBLinear; - else if (ConsumeIdent<CSSValueID::kLab>(args)) - read_color_space = Color::ColorInterpolationSpace::kLab; - else if (ConsumeIdent<CSSValueID::kOklab>(args)) - read_color_space = Color::ColorInterpolationSpace::kOKLab; - else if (ConsumeIdent<CSSValueID::kLch>(args)) - read_color_space = Color::ColorInterpolationSpace::kLCH; - else if (ConsumeIdent<CSSValueID::kOklch>(args)) - read_color_space = Color::ColorInterpolationSpace::kOKLCH; - else if (ConsumeIdent<CSSValueID::kSRGB>(args)) - read_color_space = Color::ColorInterpolationSpace::kSRGB; - else if (ConsumeIdent<CSSValueID::kHsl>(args)) - read_color_space = Color::ColorInterpolationSpace::kHSL; - else if (ConsumeIdent<CSSValueID::kHwb>(args)) - read_color_space = Color::ColorInterpolationSpace::kHWB; - - if (read_color_space) { - color_space = read_color_space.value(); - absl::optional<Color::HueInterpolationMethod> read_hue; - if (color_space == Color::ColorInterpolationSpace::kHSL || - color_space == Color::ColorInterpolationSpace::kHWB || - color_space == Color::ColorInterpolationSpace::kLCH || - color_space == Color::ColorInterpolationSpace::kOKLCH) { - if (ConsumeIdent<CSSValueID::kShorter>(args)) - read_hue = Color::HueInterpolationMethod::kShorter; - else if (ConsumeIdent<CSSValueID::kLonger>(args)) - read_hue = Color::HueInterpolationMethod::kLonger; - else if (ConsumeIdent<CSSValueID::kDecreasing>(args)) - read_hue = Color::HueInterpolationMethod::kDecreasing; - else if (ConsumeIdent<CSSValueID::kIncreasing>(args)) - read_hue = Color::HueInterpolationMethod::kIncreasing; - else if (ConsumeIdent<CSSValueID::kSpecified>(args)) - read_hue = Color::HueInterpolationMethod::kSpecified; - if (read_hue) { - if (!ConsumeIdent<CSSValueID::kHue>(args)) - return false; - hue_interpolation = read_hue.value(); - } else { - // Shorter is the default method for hue interpolation. - hue_interpolation = Color::HueInterpolationMethod::kShorter; - } - } - return true; - } - - return false; -} - static CSSValue* ConsumeRadialGradient(CSSParserTokenRange& args, const CSSParserContext& context, cssvalue::CSSGradientRepeat repeating) { @@ -2606,8 +2667,8 @@ Color::ColorInterpolationSpace color_space; Color::HueInterpolationMethod hue_interpolation_method; - bool has_color_space = - ConsumeColorSpace(args, color_space, hue_interpolation_method); + bool has_color_space = ConsumeColorInterpolationSpace( + args, color_space, hue_interpolation_method); for (int i = 0; i < 3; ++i) { if (args.Peek().GetType() == kIdentToken) { @@ -2675,8 +2736,8 @@ } if (!has_color_space) { - has_color_space = - ConsumeColorSpace(args, color_space, hue_interpolation_method); + has_color_space = ConsumeColorInterpolationSpace(args, color_space, + hue_interpolation_method); } if ((shape || size_keyword || horizontal_size || center_x || center_y || @@ -2709,8 +2770,8 @@ bool expect_comma = true; Color::ColorInterpolationSpace color_space; Color::HueInterpolationMethod hue_interpolation_method; - bool has_color_space = - ConsumeColorSpace(args, color_space, hue_interpolation_method); + bool has_color_space = ConsumeColorInterpolationSpace( + args, color_space, hue_interpolation_method); const CSSPrimitiveValue* angle = ConsumeAngle(args, context, WebFeature::kUnitlessZeroAngleGradient); @@ -2738,8 +2799,8 @@ // It's possible that the <color-space> comes after the [ <angle> | // <side-or-corner> ] if (!has_color_space) { - has_color_space = - ConsumeColorSpace(args, color_space, hue_interpolation_method); + has_color_space = ConsumeColorInterpolationSpace(args, color_space, + hue_interpolation_method); } if (has_color_space) @@ -2766,8 +2827,8 @@ cssvalue::CSSGradientRepeat repeating) { Color::ColorInterpolationSpace color_space; Color::HueInterpolationMethod hue_interpolation_method; - bool has_color_space = - ConsumeColorSpace(args, color_space, hue_interpolation_method); + bool has_color_space = ConsumeColorInterpolationSpace( + args, color_space, hue_interpolation_method); const CSSPrimitiveValue* from_angle = nullptr; if (ConsumeIdent<CSSValueID::kFrom>(args)) { @@ -2785,8 +2846,8 @@ } if (!has_color_space) { - has_color_space = - ConsumeColorSpace(args, color_space, hue_interpolation_method); + has_color_space = ConsumeColorInterpolationSpace(args, color_space, + hue_interpolation_method); } // Comma separator required when fromAngle, position or color_space is
diff --git a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc index e2cd4b4..2df4dcc2 100644 --- a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc +++ b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
@@ -1748,6 +1748,8 @@ value_id); } } + // TODO(crbug.com/1362022): We will need to store an unresolved color-mix + // value in order to account for currentColor. return StyleColor(state.GetDocument().GetTextLinkColors().ColorFromCSSValue( value, Color(), state.Style()->UsedColorScheme(), for_visited_link)); }
diff --git a/third_party/blink/renderer/core/css/rule_feature_set_test.cc b/third_party/blink/renderer/core/css/rule_feature_set_test.cc index 6b3df2b..ac5e7e2 100644 --- a/third_party/blink/renderer/core/css/rule_feature_set_test.cc +++ b/third_party/blink/renderer/core/css/rule_feature_set_test.cc
@@ -20,6 +20,7 @@ #include "third_party/blink/renderer/core/html/html_document.h" #include "third_party/blink/renderer/core/html/html_element.h" #include "third_party/blink/renderer/core/html/html_html_element.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" #include "third_party/blink/renderer/platform/wtf/vector.h" @@ -35,7 +36,8 @@ RuleFeatureSetTest() = default; void SetUp() override { - document_ = HTMLDocument::CreateForTest(); + document_ = + HTMLDocument::CreateForTest(execution_context_.GetExecutionContext()); auto* html = MakeGarbageCollected<HTMLHtmlElement>(*document_); html->AppendChild(MakeGarbageCollected<HTMLBodyElement>(*document_)); document_->AppendChild(html); @@ -697,6 +699,9 @@ rule_feature_set.pseudo_invalidation_sets_, key, ref_count); } + protected: + ScopedNullExecutionContext execution_context_; + private: RuleFeatureSet rule_feature_set_; Persistent<Document> document_; @@ -2065,7 +2070,8 @@ void CollectTo(const char* text, RuleFeatureSet& set, StyleRule* parent_rule_for_nesting = nullptr) const override { - Document* document = Document::CreateForTest(); + Document* document = + Document::CreateForTest(execution_context_.GetExecutionContext()); StyleRuleBase* rule = css_test_helpers::ParseRule(*document, text); ASSERT_TRUE(rule);
diff --git a/third_party/blink/renderer/core/css/selector_query_test.cc b/third_party/blink/renderer/core/css/selector_query_test.cc index a52aac2..d42ef67 100644 --- a/third_party/blink/renderer/core/css/selector_query_test.cc +++ b/third_party/blink/renderer/core/css/selector_query_test.cc
@@ -16,6 +16,7 @@ #include "third_party/blink/renderer/core/dom/static_node_list.h" #include "third_party/blink/renderer/core/html/html_document.h" #include "third_party/blink/renderer/core/html/html_html_element.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" // Uncomment to run the SelectorQueryTests for stats in a release build. @@ -64,7 +65,9 @@ } // namespace TEST(SelectorQueryTest, NotMatchingPseudoElement) { - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* html = MakeGarbageCollected<HTMLHtmlElement>(*document); document->AppendChild(html); document->documentElement()->setInnerHTML( @@ -94,7 +97,9 @@ } TEST(SelectorQueryTest, LastOfTypeNotFinishedParsing) { - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); auto* html = MakeGarbageCollected<HTMLHtmlElement>(*document); document->AppendChild(html); document->documentElement()->setInnerHTML( @@ -117,7 +122,9 @@ } TEST(SelectorQueryTest, StandardsModeFastPaths) { - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <html> @@ -221,7 +228,9 @@ } TEST(SelectorQueryTest, FastPathScoped) { - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <html id=root-id class=root-class> @@ -288,7 +297,9 @@ } TEST(SelectorQueryTest, QuirksModeSlowPath) { - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <html> <head></head> @@ -324,7 +335,9 @@ } TEST(SelectorQueryTest, DisconnectedSubtree) { - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); Element* scope = document->CreateRawElement(html_names::kDivTag); scope->setInnerHTML(R"HTML( <section> @@ -351,7 +364,9 @@ } TEST(SelectorQueryTest, DisconnectedTreeScope) { - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); Element* host = document->CreateRawElement(html_names::kDivTag); ShadowRoot& shadowRoot = host->AttachShadowRootInternal(ShadowRootType::kOpen); @@ -380,7 +395,9 @@ } TEST(SelectorQueryTest, QueryHasPseudoClass) { - auto* document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); document->write(R"HTML( <!DOCTYPE html> <main id=main>
diff --git a/third_party/blink/renderer/core/css/style_traversal_root_test.cc b/third_party/blink/renderer/core/css/style_traversal_root_test.cc index 7e9f269..de72143 100644 --- a/third_party/blink/renderer/core/css/style_traversal_root_test.cc +++ b/third_party/blink/renderer/core/css/style_traversal_root_test.cc
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/dom/flat_tree_traversal.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/heap/persistent.h" @@ -63,7 +64,8 @@ protected: enum ElementIndex { kA, kB, kC, kD, kE, kF, kG, kElementCount }; void SetUp() final { - document_ = Document::CreateForTest(); + document_ = + Document::CreateForTest(execution_context_.GetExecutionContext()); elements_ = MakeGarbageCollected<HeapVector<Member<Element>, 7>>(); for (size_t i = 0; i < kElementCount; i++) { elements_->push_back(GetDocument().CreateRawElement(html_names::kDivTag)); @@ -89,6 +91,7 @@ Element* DivElement(ElementIndex index) { return elements_->at(index); } private: + ScopedNullExecutionContext execution_context_; Persistent<Document> document_; Persistent<HeapVector<Member<Element>, 7>> elements_; };
diff --git a/third_party/blink/renderer/core/dom/attr_test.cc b/third_party/blink/renderer/core/dom/attr_test.cc index 8b4c88b..8a4a2824 100644 --- a/third_party/blink/renderer/core/dom/attr_test.cc +++ b/third_party/blink/renderer/core/dom/attr_test.cc
@@ -7,6 +7,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/core/dom/document.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" namespace blink { @@ -19,12 +20,13 @@ const AtomicString& Value() const { return value_; } private: + ScopedNullExecutionContext execution_context_; Persistent<Document> document_; AtomicString value_; }; void AttrTest::SetUp() { - document_ = Document::CreateForTest(); + document_ = Document::CreateForTest(execution_context_.GetExecutionContext()); value_ = "value"; }
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 24e5f5b..64eb23e2 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -74,6 +74,7 @@ #include "third_party/blink/renderer/bindings/core/v8/script_controller.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_aria_notification_options.h" #include "third_party/blink/renderer/bindings/core/v8/v8_element_creation_options.h" #include "third_party/blink/renderer/bindings/core/v8/v8_element_registration_options.h" #include "third_party/blink/renderer/bindings/core/v8/v8_observable_array_css_style_sheet.h" @@ -677,12 +678,13 @@ Document* new_document = MakeGarbageCollected<Document>( DocumentInit::Create() .WithExecutionContext(document.GetExecutionContext()) + .WithAgent(document.GetAgent()) .WithURL(BlankURL())); new_document->SetContextFeatures(document.GetContextFeatures()); return new_document; } -Document* Document::CreateForTest(ExecutionContext* execution_context) { +Document* Document::CreateForTest(ExecutionContext& execution_context) { return MakeGarbageCollected<Document>( DocumentInit::Create().ForTest(execution_context)); } @@ -703,7 +705,7 @@ pending_sheet_layout_(kNoLayoutWithPendingSheets), dom_window_(initializer.GetWindow()), execution_context_(initializer.GetExecutionContext()), - agent_(execution_context_ ? execution_context_->GetAgent() : nullptr), + agent_(initializer.GetAgent()), context_features_(ContextFeatures::DefaultSwitch()), http_refresh_scheduler_(MakeGarbageCollected<HttpRefreshScheduler>(this)), well_formed_(false), @@ -816,6 +818,7 @@ ? MakeGarbageCollected<RenderBlockingResourceManager>(*this) : nullptr), data_(MakeGarbageCollected<DocumentData>(GetExecutionContext())) { + DCHECK(agent_); if (base::FeatureList::IsEnabled(features::kDelayAsyncScriptExecution)) script_runner_delayer_->Activate(); @@ -4792,6 +4795,7 @@ Document* Document::CloneDocumentWithoutChildren() const { DocumentInit init = DocumentInit::Create() .WithExecutionContext(execution_context_.Get()) + .WithAgent(GetAgent()) .WithURL(Url()); if (IsA<XMLDocument>(this)) { if (IsXHTMLDocument()) @@ -6545,6 +6549,17 @@ data_->pending_trust_token_query_resolvers_.clear(); } +void Document::ariaNotify(const String announcement, + const AriaNotificationOptions* options) { + DCHECK(RuntimeEnabledFeatures::ConfirmationOfActionEnabled()); + + AXObjectCache* cache = ExistingAXObjectCache(); + if (!cache) + return; + + cache->AddAriaNotification(this, announcement, options); +} + static bool IsValidNameNonASCII(const LChar* characters, unsigned length) { if (!IsValidNameStart(characters[0])) return false; @@ -6911,8 +6926,8 @@ return execution_context_.Get(); } -Agent* Document::GetAgent() const { - return agent_.Get(); +Agent& Document::GetAgent() const { + return *agent_; } Attr* Document::createAttribute(const AtomicString& name, @@ -7979,11 +7994,13 @@ template_document_ = MakeGarbageCollected<HTMLDocument>( DocumentInit::Create() .WithExecutionContext(execution_context_.Get()) + .WithAgent(GetAgent()) .WithURL(BlankURL())); } else { template_document_ = MakeGarbageCollected<Document>( DocumentInit::Create() .WithExecutionContext(execution_context_.Get()) + .WithAgent(GetAgent()) .WithURL(BlankURL())); }
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h index 2675ff33..e14b127 100644 --- a/third_party/blink/renderer/core/dom/document.h +++ b/third_party/blink/renderer/core/dom/document.h
@@ -124,6 +124,7 @@ class Agent; class AnchorElementInteractionTracker; class AnimationClock; +class AriaNotificationOptions; class AXContext; class AXObjectCache; class Attr; @@ -352,7 +353,7 @@ ~Document() override; // Constructs a Document instance without a subclass for testing. - static Document* CreateForTest(ExecutionContext* execution_context = nullptr); + static Document* CreateForTest(ExecutionContext& execution_context); static Range* CreateRangeAdjustedToTreeScope(const TreeScope&, const Position&); @@ -1224,6 +1225,8 @@ const String& issuer, ExceptionState&); + void ariaNotify(const String announcement, const AriaNotificationOptions*); + // The following implements the rule from HTML 4 for what valid names are. // To get this right for all the XML cases, we probably have to improve this // or move it and make it sensitive to the type of document. @@ -1295,8 +1298,8 @@ // See `execution_context_` for details. ExecutionContext* GetExecutionContext() const final; - // Return the agent. Can only be null in unit tests. - Agent* GetAgent() const; + // Return the agent. + Agent& GetAgent() const; ScriptRunner* GetScriptRunner() { return script_runner_.Get(); } const base::ElapsedTimer& GetStartTime() const { return start_time_; } @@ -2171,8 +2174,7 @@ // in unit tests). Member<ExecutionContext> execution_context_; - // Documents should always have an agent except those created with - // DocumentInit::ForTest. + // Documents should always have an agent. Member<Agent> agent_; Member<ResourceFetcher> fetcher_;
diff --git a/third_party/blink/renderer/core/dom/document.idl b/third_party/blink/renderer/core/dom/document.idl index ffde41e..a308bca 100644 --- a/third_party/blink/renderer/core/dom/document.idl +++ b/third_party/blink/renderer/core/dom/document.idl
@@ -204,6 +204,10 @@ // Trust Token API (https://github.com/wicg/trust-token-api) [CallWith=ScriptState, Measure, RaisesException, NewObject, SecureContext, RuntimeEnabled=TrustTokens] Promise<boolean> hasRedemptionRecord(USVString issuer); + // Confirmation of Action API + // https://github.com/WICG/aom/blob/gh-pages/notification-api.md + [RuntimeEnabled=ConfirmationOfAction] void ariaNotify(HTMLString announcement, optional AriaNotificationOptions options = {}); + // Event handler attributes attribute EventHandler onbeforecopy; attribute EventHandler onbeforecut;
diff --git a/third_party/blink/renderer/core/dom/document_init.cc b/third_party/blink/renderer/core/dom/document_init.cc index bdf3a06..36e86aa 100644 --- a/third_party/blink/renderer/core/dom/document_init.cc +++ b/third_party/blink/renderer/core/dom/document_init.cc
@@ -66,14 +66,16 @@ DocumentInit::~DocumentInit() = default; -DocumentInit& DocumentInit::ForTest(ExecutionContext* execution_context) { +DocumentInit& DocumentInit::ForTest(ExecutionContext& execution_context) { DCHECK(!execution_context_); DCHECK(!window_); + DCHECK(!agent_); #if DCHECK_IS_ON() DCHECK(!for_test_); for_test_ = true; #endif - execution_context_ = execution_context; + execution_context_ = &execution_context; + agent_ = execution_context.GetAgent(); return *this; } @@ -95,16 +97,32 @@ Document* owner_document) { DCHECK(!window_); DCHECK(!execution_context_); + DCHECK(!agent_); #if DCHECK_IS_ON() DCHECK(!for_test_); #endif DCHECK(window); window_ = window; execution_context_ = window; + agent_ = window->GetAgent(); owner_document_ = owner_document; return *this; } +DocumentInit& DocumentInit::WithAgent(Agent& agent) { + DCHECK(!agent_); +#if DCHECK_IS_ON() + DCHECK(!for_test_); +#endif + agent_ = &agent; + return *this; +} + +Agent& DocumentInit::GetAgent() const { + DCHECK(agent_); + return *agent_; +} + DocumentInit& DocumentInit::WithToken(const DocumentToken& token) { token_ = token; return *this; @@ -206,6 +224,7 @@ ExecutionContext* execution_context) { DCHECK(!execution_context_); DCHECK(!window_); + DCHECK(!agent_); #if DCHECK_IS_ON() DCHECK(!for_test_); #endif @@ -270,7 +289,8 @@ Document* DocumentInit::CreateDocument() const { #if DCHECK_IS_ON() - DCHECK(execution_context_ || for_test_); + DCHECK(execution_context_); + DCHECK(agent_); #endif switch (type_) { case Type::kHTML:
diff --git a/third_party/blink/renderer/core/dom/document_init.h b/third_party/blink/renderer/core/dom/document_init.h index 565b3a1..01b2427 100644 --- a/third_party/blink/renderer/core/dom/document_init.h +++ b/third_party/blink/renderer/core/dom/document_init.h
@@ -41,6 +41,7 @@ namespace blink { +class Agent; class Document; class ExecutionContext; class LocalDOMWindow; @@ -90,7 +91,7 @@ kUnspecified }; - DocumentInit& ForTest(ExecutionContext* execution_context = nullptr); + DocumentInit& ForTest(ExecutionContext& execution_context); // Actually constructs the Document based on the provided state. Document* CreateDocument() const; @@ -105,6 +106,9 @@ DocumentInit& WithToken(const DocumentToken& token); const DocumentToken& GetToken() const; + DocumentInit& WithAgent(Agent& agent); + Agent& GetAgent() const; + DocumentInit& ForInitialEmptyDocument(bool empty); bool IsInitialEmptyDocument() const { return is_initial_empty_document_; } @@ -159,6 +163,7 @@ ExecutionContext* execution_context_ = nullptr; KURL url_; Document* owner_document_ = nullptr; + Agent* agent_ = nullptr; // Whether we should treat the new document as "srcdoc" document. This // affects security checks, since srcdoc's content comes directly from
diff --git a/third_party/blink/renderer/core/dom/document_test.cc b/third_party/blink/renderer/core/dom/document_test.cc index af8074fa..d26723e 100644 --- a/third_party/blink/renderer/core/dom/document_test.cc +++ b/third_party/blink/renderer/core/dom/document_test.cc
@@ -77,6 +77,7 @@ #include "third_party/blink/renderer/core/page/validation_message_client.h" #include "third_party/blink/renderer/core/testing/color_scheme_helper.h" #include "third_party/blink/renderer/core/testing/mock_policy_container_host.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/core/testing/page_test_base.h" #include "third_party/blink/renderer/core/testing/scoped_mock_overlay_scrollbars.h" #include "third_party/blink/renderer/core/testing/sim/sim_request.h" @@ -657,7 +658,9 @@ move_sample->appendChild(GetDocument().createTextNode("b456")); GetDocument().body()->AppendChild(move_sample); - Document& another_document = *Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + Document& another_document = + *Document::CreateForTest(execution_context.GetExecutionContext()); another_document.AppendChild(move_sample); EXPECT_EQ(1u, observer.MoveTreeToNewDocumentNodes().size());
diff --git a/third_party/blink/renderer/core/dom/dom_implementation.cc b/third_party/blink/renderer/core/dom/dom_implementation.cc index 2482a973..980c32b 100644 --- a/third_party/blink/renderer/core/dom/dom_implementation.cc +++ b/third_party/blink/renderer/core/dom/dom_implementation.cc
@@ -74,7 +74,9 @@ ExceptionState& exception_state) { XMLDocument* doc = nullptr; ExecutionContext* context = document_->GetExecutionContext(); - DocumentInit init = DocumentInit::Create().WithExecutionContext(context); + DocumentInit init = + DocumentInit::Create().WithExecutionContext(context).WithAgent( + document_->GetAgent()); if (namespace_uri == svg_names::kNamespaceURI) { doc = XMLDocument::CreateSVG(init); } else if (namespace_uri == html_names::xhtmlNamespaceURI) { @@ -102,8 +104,10 @@ } Document* DOMImplementation::createHTMLDocument(const String& title) { - DocumentInit init = DocumentInit::Create().WithExecutionContext( - document_->GetExecutionContext()); + DocumentInit init = + DocumentInit::Create() + .WithExecutionContext(document_->GetExecutionContext()) + .WithAgent(document_->GetAgent()); auto* d = MakeGarbageCollected<HTMLDocument>(init); d->setAllowDeclarativeShadowRoots(false); d->open();
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index 69013aa..8aac7ec 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -41,6 +41,7 @@ #include "third_party/blink/public/web/web_autofill_state.h" #include "third_party/blink/renderer/bindings/core/v8/dictionary.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_aria_notification_options.h" #include "third_party/blink/renderer/bindings/core/v8/v8_check_visibility_options.h" #include "third_party/blink/renderer/bindings/core/v8/v8_get_inner_html_options.h" #include "third_party/blink/renderer/bindings/core/v8/v8_pointer_lock_options.h" @@ -2151,6 +2152,17 @@ return rare_data.EnsureAccessibleNode(this); } +void Element::ariaNotify(const String announcement, + const AriaNotificationOptions* options) { + DCHECK(RuntimeEnabledFeatures::ConfirmationOfActionEnabled()); + + AXObjectCache* cache = GetDocument().ExistingAXObjectCache(); + if (!cache) + return; + + cache->AddAriaNotification(this, announcement, options); +} + bool Element::toggleAttribute(const AtomicString& qualified_name, ExceptionState& exception_state) { // https://dom.spec.whatwg.org/#dom-element-toggleattribute
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h index 49256bfb..4bd8c09 100644 --- a/third_party/blink/renderer/core/dom/element.h +++ b/third_party/blink/renderer/core/dom/element.h
@@ -66,6 +66,7 @@ namespace blink { class AccessibleNode; +class AriaNotificationOptions; class Attr; class Attribute; class ContainerQueryData; @@ -434,6 +435,8 @@ AccessibleNode* ExistingAccessibleNode() const; AccessibleNode* accessibleNode(); + void ariaNotify(const String announcement, const AriaNotificationOptions*); + void DidMoveToNewDocument(Document&) override; void removeAttribute(const AtomicString& name) {
diff --git a/third_party/blink/renderer/core/dom/element.idl b/third_party/blink/renderer/core/dom/element.idl index 1d1b87a..f0a72248 100644 --- a/third_party/blink/renderer/core/dom/element.idl +++ b/third_party/blink/renderer/core/dom/element.idl
@@ -154,6 +154,10 @@ // Accessibility Object Model [RuntimeEnabled=AccessibilityObjectModel] readonly attribute AccessibleNode? accessibleNode; + // Confirmation of Action API + // https://github.com/WICG/aom/blob/gh-pages/notification-api.md + [RuntimeEnabled=ConfirmationOfAction] void ariaNotify(HTMLString announcement, optional AriaNotificationOptions options = {}); + // Event handler attributes attribute EventHandler onbeforecopy; attribute EventHandler onbeforecut;
diff --git a/third_party/blink/renderer/core/dom/mutation_observer.cc b/third_party/blink/renderer/core/dom/mutation_observer.cc index e61ed506..c8ab98d 100644 --- a/third_party/blink/renderer/core/dom/mutation_observer.cc +++ b/third_party/blink/renderer/core/dom/mutation_observer.cc
@@ -305,13 +305,13 @@ // static void MutationObserver::EnqueueSlotChange(HTMLSlotElement& slot) { DCHECK(IsMainThread()); - MutationObserverAgentData::From(*slot.GetDocument().GetAgent()) + MutationObserverAgentData::From(slot.GetDocument().GetAgent()) .EnqueueSlotChange(slot); } // static void MutationObserver::CleanSlotChangeList(Document& document) { - MutationObserverAgentData::From(*document.GetAgent()) + MutationObserverAgentData::From(document.GetAgent()) .CleanSlotChangeList(document); }
diff --git a/third_party/blink/renderer/core/dom/mutation_observer_test.cc b/third_party/blink/renderer/core/dom/mutation_observer_test.cc index a4e441c..e6fd903 100644 --- a/third_party/blink/renderer/core/dom/mutation_observer_test.cc +++ b/third_party/blink/renderer/core/dom/mutation_observer_test.cc
@@ -9,6 +9,7 @@ #include "third_party/blink/renderer/core/dom/mutation_observer_registration.h" #include "third_party/blink/renderer/core/html/html_document.h" #include "third_party/blink/renderer/core/html/html_element.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/heap/thread_state.h" @@ -38,7 +39,9 @@ } // namespace TEST(MutationObserverTest, DisconnectCrash) { - Persistent<Document> document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + Persistent<Document> document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); auto* root = To<HTMLElement>(document->CreateRawElement(html_names::kHTMLTag)); document->AppendChild(root);
diff --git a/third_party/blink/renderer/core/dom/range_test.cc b/third_party/blink/renderer/core/dom/range_test.cc index d8a99890..63c62ef0e 100644 --- a/third_party/blink/renderer/core/dom/range_test.cc +++ b/third_party/blink/renderer/core/dom/range_test.cc
@@ -25,6 +25,7 @@ #include "third_party/blink/renderer/core/html/html_document.h" #include "third_party/blink/renderer/core/html/html_element.h" #include "third_party/blink/renderer/core/html/html_html_element.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h" @@ -224,7 +225,9 @@ auto* range = MakeGarbageCollected<Range>(GetDocument(), Position(bar, 0), Position(foo, 1)); - auto* another_document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* another_document = + Document::CreateForTest(execution_context.GetExecutionContext()); another_document->AppendChild(foo); EXPECT_EQ(bar, range->startContainer());
diff --git a/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc b/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc index 7596608..074cabcf 100644 --- a/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc +++ b/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc
@@ -181,30 +181,14 @@ }; } // namespace -class ScopedNullExecutionContext { - public: - explicit ScopedNullExecutionContext( - MockScriptedIdleTaskControllerScheduler* scheduler) - : execution_context_(MakeGarbageCollected<NullExecutionContext>( - std::make_unique<IdleTaskControllerFrameScheduler>(scheduler))) {} - - ~ScopedNullExecutionContext() { - execution_context_->NotifyContextDestroyed(); - } - - ExecutionContext* GetExecutionContext() { return execution_context_; } - - private: - Persistent<ExecutionContext> execution_context_; -}; - TEST(ScriptedIdleTaskControllerTest, RunCallback) { MockScriptedIdleTaskControllerScheduler scheduler(ShouldYield(false)); ScopedSchedulerOverrider scheduler_overrider(&scheduler, scheduler.TaskRunner()); - ScopedNullExecutionContext execution_context(&scheduler); + ScopedNullExecutionContext execution_context( + std::make_unique<IdleTaskControllerFrameScheduler>(&scheduler)); ScriptedIdleTaskController* controller = ScriptedIdleTaskController::Create( - execution_context.GetExecutionContext()); + &execution_context.GetExecutionContext()); Persistent<MockIdleTask> idle_task(MakeGarbageCollected<MockIdleTask>()); IdleRequestOptions* options = IdleRequestOptions::Create(); @@ -223,9 +207,10 @@ MockScriptedIdleTaskControllerScheduler scheduler(ShouldYield(true)); ScopedSchedulerOverrider scheduler_overrider(&scheduler, scheduler.TaskRunner()); - ScopedNullExecutionContext execution_context(&scheduler); + ScopedNullExecutionContext execution_context( + std::make_unique<IdleTaskControllerFrameScheduler>(&scheduler)); ScriptedIdleTaskController* controller = ScriptedIdleTaskController::Create( - execution_context.GetExecutionContext()); + &execution_context.GetExecutionContext()); Persistent<MockIdleTask> idle_task(MakeGarbageCollected<MockIdleTask>()); IdleRequestOptions* options = IdleRequestOptions::Create(); @@ -244,9 +229,10 @@ MockScriptedIdleTaskControllerScheduler scheduler(ShouldYield(true)); ScopedSchedulerOverrider scheduler_overrider(&scheduler, scheduler.TaskRunner()); - ScopedNullExecutionContext execution_context(&scheduler); + ScopedNullExecutionContext execution_context( + std::make_unique<IdleTaskControllerFrameScheduler>(&scheduler)); ScriptedIdleTaskController* controller = ScriptedIdleTaskController::Create( - execution_context.GetExecutionContext()); + &execution_context.GetExecutionContext()); // Register an idle task with a deadline. Persistent<MockIdleTask> idle_task(MakeGarbageCollected<MockIdleTask>());
diff --git a/third_party/blink/renderer/core/dom/static_range_test.cc b/third_party/blink/renderer/core/dom/static_range_test.cc index 7991d5e..896ebae 100644 --- a/third_party/blink/renderer/core/dom/static_range_test.cc +++ b/third_party/blink/renderer/core/dom/static_range_test.cc
@@ -15,6 +15,7 @@ #include "third_party/blink/renderer/core/html/html_document.h" #include "third_party/blink/renderer/core/html/html_element.h" #include "third_party/blink/renderer/core/html/html_html_element.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" @@ -28,11 +29,13 @@ HTMLDocument& GetDocument() const; private: + ScopedNullExecutionContext execution_context_; Persistent<HTMLDocument> document_; }; void StaticRangeTest::SetUp() { - document_ = HTMLDocument::CreateForTest(); + document_ = + HTMLDocument::CreateForTest(execution_context_.GetExecutionContext()); auto* html = MakeGarbageCollected<HTMLHtmlElement>(*document_); html->AppendChild(MakeGarbageCollected<HTMLBodyElement>(*document_)); document_->AppendChild(html);
diff --git a/third_party/blink/renderer/core/dom/text_link_colors.cc b/third_party/blink/renderer/core/dom/text_link_colors.cc index 7e21a7b..165c6ad 100644 --- a/third_party/blink/renderer/core/dom/text_link_colors.cc +++ b/third_party/blink/renderer/core/dom/text_link_colors.cc
@@ -29,13 +29,14 @@ #include "third_party/blink/renderer/core/dom/text_link_colors.h" -#include "third_party/blink/public/mojom/frame/color_scheme.mojom-blink.h" #include "third_party/blink/renderer/core/css/css_color.h" +#include "third_party/blink/renderer/core/css/css_color_mix_value.h" #include "third_party/blink/renderer/core/css/css_identifier_value.h" #include "third_party/blink/renderer/core/css/css_light_dark_value_pair.h" #include "third_party/blink/renderer/core/css/style_color.h" #include "third_party/blink/renderer/core/layout/layout_theme.h" -#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" +#include "third_party/blink/renderer/platform/graphics/color.h" +#include "third_party/blink/renderer/platform/wtf/casting.h" namespace blink { @@ -130,6 +131,30 @@ if (auto* color_value = DynamicTo<cssvalue::CSSColor>(value)) return color_value->Value(); + if (auto* color_mix_value = DynamicTo<cssvalue::CSSColorMixValue>(value)) { + // TODO(crbug.com/1362022): This is not correct for CurrentColor + Color c1 = ColorFromCSSValue(color_mix_value->Color1(), current_color, + color_scheme, for_visited_link); + Color c2 = ColorFromCSSValue(color_mix_value->Color2(), current_color, + color_scheme, for_visited_link); + + double alpha_multiplier; + double mix_amount; + if (cssvalue::CSSColorMixValue::NormalizePercentages( + color_mix_value->Percentage1(), color_mix_value->Percentage2(), + mix_amount, alpha_multiplier)) { + Color result = Color::InterpolateColors( + c1, c2, mix_amount, color_mix_value->ColorInterpolationSpace(), + color_mix_value->HueInterpolationMethod()); + result.MultiplyAlpha(alpha_multiplier); + return result; + } else { + // TODO(crbug.com/1362022): Not sure what is appropriate to return when + // both mix amounts are zero. + return Color(); + } + } + if (auto* pair = DynamicTo<CSSLightDarkValuePair>(value)) { const CSSValue& color_value = color_scheme == mojom::blink::ColorScheme::kLight ? pair->First()
diff --git a/third_party/blink/renderer/core/dom/tree_scope_adopter_test.cc b/third_party/blink/renderer/core/dom/tree_scope_adopter_test.cc index f397e81..795dab4 100644 --- a/third_party/blink/renderer/core/dom/tree_scope_adopter_test.cc +++ b/third_party/blink/renderer/core/dom/tree_scope_adopter_test.cc
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/dom/shadow_root.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" namespace blink { @@ -15,8 +16,9 @@ // TODO(hayato): It's hard to see what's happening in these tests. // It would be better to refactor these tests. TEST(TreeScopeAdopterTest, SimpleMove) { - auto* doc1 = Document::CreateForTest(); - auto* doc2 = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* doc1 = Document::CreateForTest(execution_context.GetExecutionContext()); + auto* doc2 = Document::CreateForTest(execution_context.GetExecutionContext()); Element* html1 = doc1->CreateRawElement(html_names::kHTMLTag); doc1->AppendChild(html1);
diff --git a/third_party/blink/renderer/core/dom/tree_scope_test.cc b/third_party/blink/renderer/core/dom/tree_scope_test.cc index 64b56e7..2d873018 100644 --- a/third_party/blink/renderer/core/dom/tree_scope_test.cc +++ b/third_party/blink/renderer/core/dom/tree_scope_test.cc
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/dom/shadow_root.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" namespace blink { @@ -15,7 +16,8 @@ class TreeScopeTest : public ::testing::Test { protected: void SetUp() override { - document_ = Document::CreateForTest(); + document_ = + Document::CreateForTest(execution_context_.GetExecutionContext()); Element* html = document_->CreateRawElement(html_names::kHTMLTag); document_->AppendChild(html); body_ = document_->CreateRawElement(html_names::kBodyTag); @@ -23,8 +25,12 @@ } Document* GetDocument() { return document_; } Element* GetBody() { return body_; } + ExecutionContext& GetExecutionContext() { + return execution_context_.GetExecutionContext(); + } private: + ScopedNullExecutionContext execution_context_; Persistent<Document> document_; Persistent<Element> body_; }; @@ -99,7 +105,7 @@ } TEST_F(TreeScopeTest, CommonAncestorOfTreesInDifferentDocuments) { - auto* document2 = Document::CreateForTest(); + auto* document2 = Document::CreateForTest(GetExecutionContext()); EXPECT_EQ(nullptr, GetDocument()->CommonAncestorTreeScope(*document2)); EXPECT_EQ(nullptr, document2->CommonAncestorTreeScope(*GetDocument())); }
diff --git a/third_party/blink/renderer/core/editing/markers/document_marker_controller_test.cc b/third_party/blink/renderer/core/editing/markers/document_marker_controller_test.cc index fb796170d..b368814 100644 --- a/third_party/blink/renderer/core/editing/markers/document_marker_controller_test.cc +++ b/third_party/blink/renderer/core/editing/markers/document_marker_controller_test.cc
@@ -42,6 +42,7 @@ #include "third_party/blink/renderer/core/html/html_element.h" #include "third_party/blink/renderer/core/layout/layout_object.h" #include "third_party/blink/renderer/core/testing/dummy_page_holder.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/heap/thread_state.h" @@ -85,7 +86,9 @@ auto* parent = To<Element>(GetDocument().body()->firstChild()->firstChild()); MarkNodeContents(parent); EXPECT_EQ(1u, MarkerController().Markers().size()); - Persistent<Document> another_document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + Persistent<Document> another_document = + Document::CreateForTest(execution_context.GetExecutionContext()); another_document->adoptNode(parent, ASSERT_NO_EXCEPTION); // No more reference to marked node.
diff --git a/third_party/blink/renderer/core/editing/serializers/serialization.cc b/third_party/blink/renderer/core/editing/serializers/serialization.cc index 4909a71..63d2d02 100644 --- a/third_party/blink/renderer/core/editing/serializers/serialization.cc +++ b/third_party/blink/renderer/core/editing/serializers/serialization.cc
@@ -531,8 +531,9 @@ return nullptr; auto* tagged_document = MakeGarbageCollected<Document>( - DocumentInit::Create().WithExecutionContext( - document.GetExecutionContext())); + DocumentInit::Create() + .WithExecutionContext(document.GetExecutionContext()) + .WithAgent(document.GetAgent())); tagged_document->SetContextFeatures(document.GetContextFeatures()); auto* root =
diff --git a/third_party/blink/renderer/core/exported/web_media_player_impl_unittest.cc b/third_party/blink/renderer/core/exported/web_media_player_impl_unittest.cc index f2cf26f..b4f1198 100644 --- a/third_party/blink/renderer/core/exported/web_media_player_impl_unittest.cc +++ b/third_party/blink/renderer/core/exported/web_media_player_impl_unittest.cc
@@ -80,6 +80,7 @@ #include "third_party/blink/renderer/platform/media/testing/mock_resource_fetch_context.h" #include "third_party/blink/renderer/platform/media/testing/mock_web_associated_url_loader.h" #include "third_party/blink/renderer/platform/media/video_decode_stats_reporter.h" +#include "third_party/blink/renderer/platform/media/web_audio_source_provider_client.h" #include "third_party/blink/renderer/platform/media/web_content_decryption_module_impl.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" @@ -208,8 +209,6 @@ MOCK_METHOD2(OnFirstFrame, void(base::TimeTicks, size_t)); MOCK_METHOD0(OnRequestVideoFrameCallback, void()); MOCK_METHOD0(GetTextTrackMetadata, Vector<TextTrackMetadata>()); - - bool was_always_muted_ = false; }; class MockWebMediaPlayerEncryptedMediaClient @@ -2290,19 +2289,18 @@ class WebMediaPlayerImplBackgroundBehaviorTest : public WebMediaPlayerImplTest, + public WebAudioSourceProviderClient, public ::testing::WithParamInterface< - std::tuple<bool, int, int, bool, bool, bool, bool, bool, bool>> { + std::tuple<bool, int, int, bool, bool, bool, bool>> { public: // Indices of the tuple parameters. static const int kIsMediaSuspendEnabled = 0; static const int kDurationSec = 1; static const int kAverageKeyframeDistanceSec = 2; static const int kIsResumeBackgroundVideoEnabled = 3; - static const int kIsMediaSource = 4; - static const int kIsBackgroundPauseEnabled = 5; - static const int kIsPictureInPictureEnabled = 6; - static const int kIsBackgroundVideoPlaybackEnabled = 7; - static const int kIsVideoBeingCaptured = 8; + static const int kIsPictureInPictureEnabled = 4; + static const int kIsBackgroundVideoPlaybackEnabled = 5; + static const int kIsVideoBeingCaptured = 6; void SetUp() override { WebMediaPlayerImplTest::SetUp(); @@ -2312,16 +2310,6 @@ std::string enabled_features; std::string disabled_features; - if (IsBackgroundPauseOn()) { - if (!enabled_features.empty()) - enabled_features += ","; - enabled_features += media::kBackgroundVideoPauseOptimization.name; - } else { - if (!disabled_features.empty()) - disabled_features += ","; - disabled_features += media::kBackgroundVideoPauseOptimization.name; - } - if (IsResumeBackgroundVideoEnabled()) { if (!enabled_features.empty()) enabled_features += ","; @@ -2335,17 +2323,16 @@ feature_list_.InitFromCommandLine(enabled_features, disabled_features); InitializeWebMediaPlayerImpl(); - bool is_media_source = std::get<kIsMediaSource>(GetParam()); - SetLoadType(is_media_source ? WebMediaPlayer::kLoadTypeMediaSource - : WebMediaPlayer::kLoadTypeURL); + + // MSE or SRC doesn't matter since we artificially inject pipeline stats. + SetLoadType(WebMediaPlayer::kLoadTypeURL); + SetVideoKeyframeDistanceAverage( base::Seconds(GetAverageKeyframeDistanceSec())); SetDuration(base::Seconds(GetDurationSec())); if (IsPictureInPictureOn()) { - EXPECT_CALL(client_, GetDisplayType()) - .WillRepeatedly(Return(DisplayType::kPictureInPicture)); - + SetPiPExpectations(); wmpi_->OnSurfaceIdUpdated(surface_id_); } @@ -2361,6 +2348,13 @@ wmpi_->SetPipelineStatisticsForTest(statistics); } + void SetPiPExpectations() { + if (!IsPictureInPictureOn()) + return; + EXPECT_CALL(client_, GetDisplayType()) + .WillRepeatedly(Return(DisplayType::kPictureInPicture)); + } + bool IsMediaSuspendOn() { return std::get<kIsMediaSuspendEnabled>(GetParam()); } @@ -2369,10 +2363,6 @@ return std::get<kIsResumeBackgroundVideoEnabled>(GetParam()); } - bool IsBackgroundPauseOn() { - return std::get<kIsBackgroundPauseEnabled>(GetParam()); - } - bool IsPictureInPictureOn() { return std::get<kIsPictureInPictureEnabled>(GetParam()); } @@ -2396,14 +2386,6 @@ base::Time::kMillisecondsPerSecond; } - bool IsAndroid() { -#if BUILDFLAG(IS_ANDROID) - return true; -#else - return false; -#endif - } - bool ShouldDisableVideoWhenHidden() const { return wmpi_->ShouldDisableVideoWhenHidden(); } @@ -2412,24 +2394,69 @@ return wmpi_->ShouldPausePlaybackWhenHidden(); } - bool IsBackgroundOptimizationCandidate() const { - return wmpi_->IsBackgroundOptimizationCandidate(); + std::string PrintValues() { + std::stringstream stream; + stream << "is_media_suspend_enabled=" << IsMediaSuspendOn() + << ", duration_sec=" << GetDurationSec() + << ", average_keyframe_distance_sec=" + << GetAverageKeyframeDistanceSec() + << ", is_resume_background_video_enabled=" + << IsResumeBackgroundVideoEnabled() + << ", is_picture_in_picture=" << IsPictureInPictureOn() + << ", is_background_video_playback_enabled=" + << IsBackgroundVideoPlaybackEnabled() + << ", is_video_being_captured=" << IsVideoBeingCaptured(); + return stream.str(); } + MOCK_METHOD2(SetFormat, void(uint32_t numberOfChannels, float sampleRate)); + private: base::test::ScopedFeatureList feature_list_; }; TEST_P(WebMediaPlayerImplBackgroundBehaviorTest, AudioOnly) { - // Never optimize or pause an audio-only player. - SetMetadata(true, false); - EXPECT_FALSE(IsBackgroundOptimizationCandidate()); + SCOPED_TRACE(testing::Message() << PrintValues()); + if (base::FeatureList::IsEnabled(media::kPauseBackgroundMutedAudio)) { + // Audio only players should pause if they are muted and not captured. + EXPECT_CALL(client_, WasAlwaysMuted()).WillRepeatedly(Return(true)); + SetMetadata(true, false); + EXPECT_TRUE(ShouldPausePlaybackWhenHidden()); + EXPECT_FALSE(ShouldDisableVideoWhenHidden()); + + auto provider = wmpi_->GetAudioSourceProvider(); + provider->SetClient(this); + EXPECT_FALSE(ShouldPausePlaybackWhenHidden()); + EXPECT_FALSE(ShouldDisableVideoWhenHidden()); + + provider->SetClient(nullptr); + EXPECT_TRUE(ShouldPausePlaybackWhenHidden()); + EXPECT_FALSE(ShouldDisableVideoWhenHidden()); + + provider->SetCopyAudioCallback(base::DoNothing()); + EXPECT_FALSE(ShouldPausePlaybackWhenHidden()); + EXPECT_FALSE(ShouldDisableVideoWhenHidden()); + + provider->ClearCopyAudioCallback(); + EXPECT_TRUE(ShouldPausePlaybackWhenHidden()); + EXPECT_FALSE(ShouldDisableVideoWhenHidden()); + + testing::Mock::VerifyAndClearExpectations(&client_); + SetPiPExpectations(); + } else { + // Never optimize or pause an audio-only player. + SetMetadata(true, false); + } + EXPECT_FALSE(ShouldPausePlaybackWhenHidden()); EXPECT_FALSE(ShouldDisableVideoWhenHidden()); } TEST_P(WebMediaPlayerImplBackgroundBehaviorTest, VideoOnly) { - // Video only. + SCOPED_TRACE(testing::Message() << PrintValues()); + + // Video only -- setting muted should do nothing. + EXPECT_CALL(client_, WasAlwaysMuted()).WillRepeatedly(Return(true)); SetMetadata(false, true); // Never disable video track for a video only stream. @@ -2438,19 +2465,56 @@ // There's no optimization criteria for video only in Picture-in-Picture. bool matches_requirements = !IsPictureInPictureOn() && !IsVideoBeingCaptured(); - EXPECT_EQ(matches_requirements, IsBackgroundOptimizationCandidate()); // Video is always paused when suspension is on and only if matches the // optimization criteria if the optimization is on. - bool should_pause = - (!IsBackgroundVideoPlaybackEnabled() || IsMediaSuspendOn() || - (IsBackgroundPauseOn() && matches_requirements)) && - !(IsPictureInPictureOn() && IsAndroid()); + bool should_pause = (!IsBackgroundVideoPlaybackEnabled() || + IsMediaSuspendOn() || matches_requirements) && + !IsPictureInPictureOn(); EXPECT_EQ(should_pause, ShouldPausePlaybackWhenHidden()); } TEST_P(WebMediaPlayerImplBackgroundBehaviorTest, AudioVideo) { - SetMetadata(true, true); + SCOPED_TRACE(testing::Message() << PrintValues()); + + bool always_pause = + (!IsBackgroundVideoPlaybackEnabled() || + (IsMediaSuspendOn() && IsResumeBackgroundVideoEnabled())) && + !IsPictureInPictureOn(); + + if (base::FeatureList::IsEnabled(media::kPauseBackgroundMutedAudio)) { + bool should_pause = !IsPictureInPictureOn() && + (!IsBackgroundVideoPlaybackEnabled() || + IsMediaSuspendOn() || !IsVideoBeingCaptured()); + + EXPECT_CALL(client_, WasAlwaysMuted()).WillRepeatedly(Return(true)); + SetMetadata(true, true); + EXPECT_EQ(should_pause, ShouldPausePlaybackWhenHidden()); + + auto provider = wmpi_->GetAudioSourceProvider(); + provider->SetClient(this); + EXPECT_EQ(always_pause, ShouldPausePlaybackWhenHidden()); + + provider->SetClient(nullptr); + EXPECT_EQ(should_pause, ShouldPausePlaybackWhenHidden()); + + provider->SetCopyAudioCallback(base::DoNothing()); + EXPECT_EQ(always_pause, ShouldPausePlaybackWhenHidden()); + + provider->ClearCopyAudioCallback(); + EXPECT_EQ(should_pause, ShouldPausePlaybackWhenHidden()); + + testing::Mock::VerifyAndClearExpectations(&client_); + SetPiPExpectations(); + } else { + SetMetadata(true, true); + } + + // Only pause audible videos if both media suspend and resume background + // videos is on and background video playback is disabled. Background video + // playback is enabled by default. Both media suspend and resume background + // videos are on by default on Android and off on desktop. + EXPECT_EQ(always_pause, ShouldPausePlaybackWhenHidden()); // Optimization requirements are the same for all platforms. bool matches_requirements = @@ -2458,27 +2522,13 @@ ((GetDurationSec() < GetMaxKeyframeDistanceSec()) || (GetAverageKeyframeDistanceSec() < GetMaxKeyframeDistanceSec())); - EXPECT_EQ(matches_requirements, IsBackgroundOptimizationCandidate()); EXPECT_EQ(matches_requirements, ShouldDisableVideoWhenHidden()); - // Only pause audible videos if both media suspend and resume background - // videos is on and background video playback is disabled. Background video - // playback is enabled by default. Both media suspend and resume background - // videos are on by default on Android and off on desktop. - EXPECT_EQ((!IsBackgroundVideoPlaybackEnabled() || - (IsMediaSuspendOn() && IsResumeBackgroundVideoEnabled())) && - !(IsPictureInPictureOn() && IsAndroid()), - ShouldPausePlaybackWhenHidden()); - if (!matches_requirements || !ShouldDisableVideoWhenHidden() || IsMediaSuspendOn()) { return; } - // These tests start in background mode prior to having metadata, so put the - // test back into a normal state. - EXPECT_TRUE(IsDisableVideoTrackPending()); - ForegroundPlayer(); EXPECT_FALSE(IsVideoTrackDisabled()); EXPECT_FALSE(IsDisableVideoTrackPending()); @@ -2514,8 +2564,6 @@ ::testing::Bool(), ::testing::Bool(), ::testing::Bool(), - ::testing::Bool(), - ::testing::Bool(), ::testing::Bool())); } // namespace blink
diff --git a/third_party/blink/renderer/core/frame/csp/content_security_policy_test.cc b/third_party/blink/renderer/core/frame/csp/content_security_policy_test.cc index 4bf0b76..3495db6 100644 --- a/third_party/blink/renderer/core/frame/csp/content_security_policy_test.cc +++ b/third_party/blink/renderer/core/frame/csp/content_security_policy_test.cc
@@ -1154,7 +1154,7 @@ csp->BindToDelegate(execution_context->GetContentSecurityPolicyDelegate()); const KURL example_url("http://example.com"); - auto* document = Document::CreateForTest(); + auto* document = Document::CreateForTest(*execution_context); String source; String context_url; String nonce;
diff --git a/third_party/blink/renderer/core/frame/web_frame_test.cc b/third_party/blink/renderer/core/frame/web_frame_test.cc index 45b323b5..94ad026 100644 --- a/third_party/blink/renderer/core/frame/web_frame_test.cc +++ b/third_party/blink/renderer/core/frame/web_frame_test.cc
@@ -8547,7 +8547,7 @@ Fullscreen::RequestFullscreen(*iframe_body); web_view_impl->DidEnterFullscreen(); - top_doc->GetAgent()->event_loop()->PerformMicrotaskCheckpoint(); + top_doc->GetAgent().event_loop()->PerformMicrotaskCheckpoint(); UpdateAllLifecyclePhases(web_view_impl); // We are now in nested fullscreen, with both documents having a non-empty
diff --git a/third_party/blink/renderer/core/fullscreen/fullscreen.cc b/third_party/blink/renderer/core/fullscreen/fullscreen.cc index 627bd4d..bdf5565 100644 --- a/third_party/blink/renderer/core/fullscreen/fullscreen.cc +++ b/third_party/blink/renderer/core/fullscreen/fullscreen.cc
@@ -746,7 +746,7 @@ // but must still not synchronously change the fullscreen element. Instead // enqueue a microtask to continue. if (RequestFullscreenScope::RunningRequestFullscreen()) { - document.GetAgent()->event_loop()->EnqueueMicrotask(WTF::BindOnce( + document.GetAgent().event_loop()->EnqueueMicrotask(WTF::BindOnce( [](Document* document, bool granted) { DCHECK(document); DidResolveEnterFullscreenRequest(*document, granted); @@ -971,7 +971,7 @@ // Note: We are past the "in parallel" point, and |ContinueExitFullscreen()| // will change script-observable state (document.fullscreenElement) // synchronously, so we have to continue asynchronously. - doc.GetAgent()->event_loop()->EnqueueMicrotask( + doc.GetAgent().event_loop()->EnqueueMicrotask( WTF::BindOnce(ContinueExitFullscreen, WrapPersistent(&doc), WrapPersistent(resolver), false /* resize */)); }
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack.cc b/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack.cc index b9b1e81..d63e1e3 100644 --- a/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack.cc +++ b/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack.cc
@@ -95,7 +95,7 @@ // If the processing the backup element queue is not set: if (!backup_queue_ || backup_queue_->empty()) { - element.GetDocument().GetAgent()->event_loop()->EnqueueMicrotask( + element.GetDocument().GetAgent().event_loop()->EnqueueMicrotask( WTF::BindOnce(&CustomElementReactionStack::InvokeBackupQueue, Persistent<CustomElementReactionStack>(this))); }
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_registry_test.cc b/third_party/blink/renderer/core/html/custom/custom_element_registry_test.cc index 4be220ce..4c31dff 100644 --- a/third_party/blink/renderer/core/html/custom/custom_element_registry_test.cc +++ b/third_party/blink/renderer/core/html/custom/custom_element_registry_test.cc
@@ -23,6 +23,7 @@ #include "third_party/blink/renderer/core/html/custom/custom_element_descriptor.h" #include "third_party/blink/renderer/core/html/custom/custom_element_test_helpers.h" #include "third_party/blink/renderer/core/html/html_element.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/core/testing/page_test_base.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/script_forbidden_scope.h" @@ -77,7 +78,9 @@ Element* element = CreateElement("a-a").InDocument(&GetDocument()); Registry().AddCandidate(*element); - auto* other_document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* other_document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); other_document->AppendChild(element); EXPECT_EQ(other_document, element->ownerDocument()) << "sanity: another document should have adopted an element on append"; @@ -397,7 +400,9 @@ static_cast<LogUpgradeDefinition*>(Registry().DefinitionForName("a-a")); definition->Clear(); - auto* other_document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* other_document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); { CEReactionsScope reactions; other_document->adoptNode(element, ASSERT_NO_EXCEPTION);
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_test_helpers.h b/third_party/blink/renderer/core/html/custom/custom_element_test_helpers.h index 28c3503b..dfaf5cb 100644 --- a/third_party/blink/renderer/core/html/custom/custom_element_test_helpers.h +++ b/third_party/blink/renderer/core/html/custom/custom_element_test_helpers.h
@@ -14,6 +14,7 @@ #include "third_party/blink/renderer/core/html/custom/custom_element_definition.h" #include "third_party/blink/renderer/core/html/custom/custom_element_definition_builder.h" #include "third_party/blink/renderer/core/html/html_document.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" @@ -152,8 +153,10 @@ operator Element*() const { Document* document = document_; - if (!document) - document = HTMLDocument::CreateForTest(); + if (!document) { + document = + HTMLDocument::CreateForTest(execution_context_.GetExecutionContext()); + } NonThrowableExceptionState no_exceptions; Element* element = document->CreateElement( QualifiedName(g_null_atom, local_name_, namespace_uri_), @@ -164,6 +167,7 @@ } private: + ScopedNullExecutionContext execution_context_; Document* document_ = nullptr; AtomicString namespace_uri_; AtomicString local_name_;
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_upgrade_sorter_test.cc b/third_party/blink/renderer/core/html/custom/custom_element_upgrade_sorter_test.cc index 76dffd6..0095fe0 100644 --- a/third_party/blink/renderer/core/html/custom/custom_element_upgrade_sorter_test.cc +++ b/third_party/blink/renderer/core/html/custom/custom_element_upgrade_sorter_test.cc
@@ -12,6 +12,7 @@ #include "third_party/blink/renderer/core/dom/shadow_root.h" #include "third_party/blink/renderer/core/html/html_document.h" #include "third_party/blink/renderer/core/html_names.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/core/testing/page_test_base.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/heap/collection_support/heap_vector.h" @@ -41,7 +42,9 @@ Element* element = GetDocument().CreateElementForBinding("a-a", nullptr, no_exceptions); - auto* other_document = HTMLDocument::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* other_document = + HTMLDocument::CreateForTest(execution_context.GetExecutionContext()); other_document->AppendChild(element); EXPECT_EQ(other_document, element->ownerDocument()) << "sanity: another document should have adopted an element on append";
diff --git a/third_party/blink/renderer/core/html/forms/external_date_time_chooser_test.cc b/third_party/blink/renderer/core/html/forms/external_date_time_chooser_test.cc index 40a9707..73e3d9f 100644 --- a/third_party/blink/renderer/core/html/forms/external_date_time_chooser_test.cc +++ b/third_party/blink/renderer/core/html/forms/external_date_time_chooser_test.cc
@@ -10,6 +10,7 @@ #include "third_party/blink/renderer/core/html/forms/date_time_chooser_client.h" #include "third_party/blink/renderer/core/html/forms/html_input_element.h" #include "third_party/blink/renderer/core/testing/dummy_page_holder.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" @@ -60,8 +61,10 @@ // This is a regression test for crbug.com/974646. EndChooser can cause a crash // when it's called twice because |client_| was already nullptr. TEST_F(ExternalDateTimeChooserTest, EndChooserShouldNotCrash) { + ScopedNullExecutionContext execution_context; ScopedInputMultipleFieldsUIForTest input_multiple_fields_ui(false); - auto* document = Document::CreateForTest(); + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* element = document->CreateRawElement(html_names::kInputTag); auto* client = MakeGarbageCollected<TestDateTimeChooserClient>(element); auto* external_date_time_chooser =
diff --git a/third_party/blink/renderer/core/html/forms/file_input_type_test.cc b/third_party/blink/renderer/core/html/forms/file_input_type_test.cc index bf6711c..49a8271 100644 --- a/third_party/blink/renderer/core/html/forms/file_input_type_test.cc +++ b/third_party/blink/renderer/core/html/forms/file_input_type_test.cc
@@ -53,9 +53,9 @@ files.push_back(CreateFileChooserFileInfoFileSystem( url, base::Time::FromJsTime(1.0 * kMsPerDay + 3), 64)); - auto* execution_context = MakeGarbageCollected<NullExecutionContext>(); - FileList* list = FileInputType::CreateFileList(*execution_context, files, - base::FilePath()); + ScopedNullExecutionContext execution_context; + FileList* list = FileInputType::CreateFileList( + execution_context.GetExecutionContext(), files, base::FilePath()); ASSERT_TRUE(list); ASSERT_EQ(2u, list->length()); @@ -68,11 +68,12 @@ EXPECT_EQ(url, list->item(1)->FileSystemURL()); EXPECT_EQ(64u, list->item(1)->size()); EXPECT_EQ(1.0 * kMsPerDay + 3, list->item(1)->lastModified()); - execution_context->NotifyContextDestroyed(); } TEST(FileInputTypeTest, ignoreDroppedNonNativeFiles) { - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* input = MakeGarbageCollected<HTMLInputElement>(*document, CreateElementFlags()); InputType* file_input = MakeGarbageCollected<FileInputType>(*input); @@ -106,7 +107,9 @@ } TEST(FileInputTypeTest, setFilesFromPaths) { - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* input = MakeGarbageCollected<HTMLInputElement>(*document, CreateElementFlags()); InputType* file_input = MakeGarbageCollected<FileInputType>(*input);
diff --git a/third_party/blink/renderer/core/html/forms/form_controller_test.cc b/third_party/blink/renderer/core/html/forms/form_controller_test.cc index d5652b8..4743de41 100644 --- a/third_party/blink/renderer/core/html/forms/form_controller_test.cc +++ b/third_party/blink/renderer/core/html/forms/form_controller_test.cc
@@ -11,12 +11,14 @@ #include "third_party/blink/renderer/core/html/forms/html_form_element.h" #include "third_party/blink/renderer/core/html_names.h" #include "third_party/blink/renderer/core/testing/dummy_page_holder.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" namespace blink { TEST(DocumentStateTest, ToStateVectorConnected) { - auto& doc = *Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto& doc = *Document::CreateForTest(execution_context.GetExecutionContext()); Element* html = doc.CreateRawElement(html_names::kHTMLTag); doc.appendChild(html); Node* body = html->appendChild(doc.CreateRawElement(html_names::kBodyTag));
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element_test.cc b/third_party/blink/renderer/core/html/forms/html_input_element_test.cc index 4c48f225..6fa1dd6 100644 --- a/third_party/blink/renderer/core/html/forms/html_input_element_test.cc +++ b/third_party/blink/renderer/core/html/forms/html_input_element_test.cc
@@ -160,7 +160,9 @@ } TEST_F(HTMLInputElementTest, NoAssertWhenMovedInNewDocument) { - auto* document_without_frame = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document_without_frame = + Document::CreateForTest(execution_context.GetExecutionContext()); EXPECT_EQ(nullptr, document_without_frame->GetPage()); auto* html = MakeGarbageCollected<HTMLHtmlElement>(*document_without_frame); html->AppendChild(
diff --git a/third_party/blink/renderer/core/html/forms/html_output_element_test.cc b/third_party/blink/renderer/core/html/forms/html_output_element_test.cc index 02c903d4..83c19131 100644 --- a/third_party/blink/renderer/core/html/forms/html_output_element_test.cc +++ b/third_party/blink/renderer/core/html/forms/html_output_element_test.cc
@@ -8,13 +8,16 @@ #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/dom_token_list.h" #include "third_party/blink/renderer/core/html_names.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" namespace blink { TEST(HTMLLinkElementSizesAttributeTest, setHTMLForProperty_updatesForAttribute) { - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* element = MakeGarbageCollected<HTMLOutputElement>(*document); EXPECT_EQ(g_null_atom, element->FastGetAttribute(html_names::kForAttr)); element->htmlFor()->setValue(" strawberry "); @@ -22,7 +25,9 @@ } TEST(HTMLOutputElementTest, setForAttribute_updatesHTMLForPropertyValue) { - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* element = MakeGarbageCollected<HTMLOutputElement>(*document); DOMTokenList* for_tokens = element->htmlFor(); EXPECT_EQ(g_null_atom, for_tokens->value());
diff --git a/third_party/blink/renderer/core/html/forms/option_list_test.cc b/third_party/blink/renderer/core/html/forms/option_list_test.cc index 1c794f3..0127824 100644 --- a/third_party/blink/renderer/core/html/forms/option_list_test.cc +++ b/third_party/blink/renderer/core/html/forms/option_list_test.cc
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/core/html/forms/html_option_element.h" #include "third_party/blink/renderer/core/html/forms/html_select_element.h" #include "third_party/blink/renderer/core/html/html_document.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" namespace blink { @@ -23,7 +24,8 @@ class OptionListTest : public testing::Test { protected: void SetUp() override { - auto* document = HTMLDocument::CreateForTest(); + auto* document = + HTMLDocument::CreateForTest(execution_context_.GetExecutionContext()); auto* select = MakeGarbageCollected<HTMLSelectElement>(*document); document->AppendChild(select); select_ = select; @@ -31,6 +33,7 @@ HTMLSelectElement& Select() const { return *select_; } private: + ScopedNullExecutionContext execution_context_; Persistent<HTMLSelectElement> select_; };
diff --git a/third_party/blink/renderer/core/html/html_document.cc b/third_party/blink/renderer/core/html/html_document.cc index e291a44..f33b93f0c 100644 --- a/third_party/blink/renderer/core/html/html_document.cc +++ b/third_party/blink/renderer/core/html/html_document.cc
@@ -73,14 +73,16 @@ HTMLDocument::~HTMLDocument() = default; -HTMLDocument* HTMLDocument::CreateForTest() { - return MakeGarbageCollected<HTMLDocument>(DocumentInit::Create().ForTest()); +HTMLDocument* HTMLDocument::CreateForTest(ExecutionContext& execution_context) { + return MakeGarbageCollected<HTMLDocument>( + DocumentInit::Create().ForTest(execution_context)); } Document* HTMLDocument::CloneDocumentWithoutChildren() const { return MakeGarbageCollected<HTMLDocument>( DocumentInit::Create() .WithExecutionContext(GetExecutionContext()) + .WithAgent(GetAgent()) .WithURL(Url())); }
diff --git a/third_party/blink/renderer/core/html/html_document.h b/third_party/blink/renderer/core/html/html_document.h index efe2c5d..3afe5cb5 100644 --- a/third_party/blink/renderer/core/html/html_document.h +++ b/third_party/blink/renderer/core/html/html_document.h
@@ -40,7 +40,7 @@ DocumentClassFlags extended_document_classes = kDefaultDocumentClass); ~HTMLDocument() override; - static HTMLDocument* CreateForTest(); + static HTMLDocument* CreateForTest(ExecutionContext& execution_context); void AddNamedItem(const AtomicString& name); void RemoveNamedItem(const AtomicString& name);
diff --git a/third_party/blink/renderer/core/html/html_frame_element_test.cc b/third_party/blink/renderer/core/html/html_frame_element_test.cc index d3379f9..18ce3a0ed 100644 --- a/third_party/blink/renderer/core/html/html_frame_element_test.cc +++ b/third_party/blink/renderer/core/html/html_frame_element_test.cc
@@ -8,6 +8,7 @@ #include "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom-blink.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/document_init.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" namespace blink { @@ -19,8 +20,11 @@ // fullscreen feature should be unconditionally disabled. TEST_F(HTMLFrameElementTest, DefaultContainerPolicy) { const KURL document_url("http://example.com"); + ScopedNullExecutionContext execution_context; auto* document = MakeGarbageCollected<Document>( - DocumentInit::Create().ForTest().WithURL(document_url)); + DocumentInit::Create() + .ForTest(execution_context.GetExecutionContext()) + .WithURL(document_url)); auto* frame_element = MakeGarbageCollected<HTMLFrameElement>(*document);
diff --git a/third_party/blink/renderer/core/html/html_link_element_sizes_attribute_test.cc b/third_party/blink/renderer/core/html/html_link_element_sizes_attribute_test.cc index 0a8937d..8dc97be 100644 --- a/third_party/blink/renderer/core/html/html_link_element_sizes_attribute_test.cc +++ b/third_party/blink/renderer/core/html/html_link_element_sizes_attribute_test.cc
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/dom_token_list.h" #include "third_party/blink/renderer/core/html_names.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" namespace blink { @@ -16,7 +17,9 @@ TEST(HTMLLinkElementSizesAttributeTest, setSizesPropertyValue_updatesAttribute) { - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* link = MakeGarbageCollected<HTMLLinkElement>(*document, CreateElementFlags()); DOMTokenList* sizes = link->sizes(); @@ -28,7 +31,9 @@ TEST(HTMLLinkElementSizesAttributeTest, setSizesAttribute_updatesSizesPropertyValue) { - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* link = MakeGarbageCollected<HTMLLinkElement>(*document, CreateElementFlags()); DOMTokenList* sizes = link->sizes();
diff --git a/third_party/blink/renderer/core/html/html_table_row_element_test.cc b/third_party/blink/renderer/core/html/html_table_row_element_test.cc index 94dcba6..8886635 100644 --- a/third_party/blink/renderer/core/html/html_table_row_element_test.cc +++ b/third_party/blink/renderer/core/html/html_table_row_element_test.cc
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/html/html_paragraph_element.h" #include "third_party/blink/renderer/core/html/html_table_element.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" namespace blink { @@ -16,14 +17,18 @@ // https://html.spec.whatwg.org/C/#dom-tr-rowindex TEST(HTMLTableRowElementTest, rowIndex_notInTable) { - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* row = MakeGarbageCollected<HTMLTableRowElement>(*document); EXPECT_EQ(-1, row->rowIndex()) << "rows not in tables should have row index -1"; } TEST(HTMLTableRowElementTest, rowIndex_directChildOfTable) { - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* table = MakeGarbageCollected<HTMLTableElement>(*document); auto* row = MakeGarbageCollected<HTMLTableRowElement>(*document); table->AppendChild(row); @@ -32,7 +37,9 @@ } TEST(HTMLTableRowElementTest, rowIndex_inUnrelatedElementInTable) { - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* table = MakeGarbageCollected<HTMLTableElement>(*document); // Almost any element will do; what's pertinent is that this is not // THEAD, TBODY or TFOOT.
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc index 87f4fa20..1b74c9ec 100644 --- a/third_party/blink/renderer/core/html/media/html_media_element.cc +++ b/third_party/blink/renderer/core/html/media/html_media_element.cc
@@ -2510,7 +2510,7 @@ // needed, the update is applied in the next call to // officialPlaybackPosition(). official_playback_position_needs_update_ = false; - GetDocument().GetAgent()->event_loop()->EnqueueMicrotask( + GetDocument().GetAgent().event_loop()->EnqueueMicrotask( WTF::BindOnce(&HTMLMediaElement::RequireOfficialPlaybackPositionUpdate, WrapWeakPersistent(this))); }
diff --git a/third_party/blink/renderer/core/html/parser/html_construction_site.cc b/third_party/blink/renderer/core/html/parser/html_construction_site.cc index bd2cc5f..a6ff82f 100644 --- a/third_party/blink/renderer/core/html/parser/html_construction_site.cc +++ b/third_party/blink/renderer/core/html/parser/html_construction_site.cc
@@ -982,7 +982,7 @@ // checkpoints, but note the spec is different--it talks about the // JavaScript stack, not the script nesting level. if (0u == reentry_permit_->ScriptNestingLevel()) - document.GetAgent()->event_loop()->PerformMicrotaskCheckpoint(); + document.GetAgent().event_loop()->PerformMicrotaskCheckpoint(); // "6.3 Push a new element queue onto the custom element // reactions stack."
diff --git a/third_party/blink/renderer/core/html/parser/html_document_parser.cc b/third_party/blink/renderer/core/html/parser/html_document_parser.cc index 4a4265b..164782e 100644 --- a/third_party/blink/renderer/core/html/parser/html_document_parser.cc +++ b/third_party/blink/renderer/core/html/parser/html_document_parser.cc
@@ -1623,14 +1623,16 @@ GetDocument()->GetTaskRunner(TaskType::kInternalLoading))); background_scan_fn_ = CrossThreadBindRepeating( - [](base::WeakPtr<HTMLPreloadScanner> scanner, const KURL& url, - const String& data) { + [](base::WeakPtr<HTMLPreloadScanner> scanner, + scoped_refptr<base::SingleThreadTaskRunner> task_runner, + const KURL& url, const String& data) { PostCrossThreadTask( - *GetPreloadScannerThread()->GetTaskRunner(), FROM_HERE, + *task_runner, FROM_HERE, CrossThreadBindOnce(&HTMLPreloadScanner::ScanInBackground, std::move(scanner), data, url)); }, - background_scanner_->AsWeakPtr()); + background_scanner_->AsWeakPtr(), + GetPreloadScannerThread()->GetTaskRunner()); } if (background_scan_fn_)
diff --git a/third_party/blink/renderer/core/html/parser/html_document_parser_test.cc b/third_party/blink/renderer/core/html/parser/html_document_parser_test.cc index f1f6f11..d227fd6 100644 --- a/third_party/blink/renderer/core/html/parser/html_document_parser_test.cc +++ b/third_party/blink/renderer/core/html/parser/html_document_parser_test.cc
@@ -14,6 +14,7 @@ #include "third_party/blink/renderer/core/html/parser/text_resource_decoder.h" #include "third_party/blink/renderer/core/html/parser/text_resource_decoder_builder.h" #include "third_party/blink/renderer/core/loader/no_state_prefetch_client.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/core/testing/page_test_base.h" #include "third_party/blink/renderer/core/testing/sim/sim_request.h" #include "third_party/blink/renderer/core/testing/sim/sim_test.h" @@ -349,7 +350,12 @@ TEST_F(HTMLDocumentParserWithThreadedTokenizerTest, EmptyDocumentDoesNotUseBackgroundTokenizer) { - DocumentInit init = DocumentInit::Create().ForInitialEmptyDocument(true); + ScopedNullExecutionContext execution_context; + DocumentInit init = + DocumentInit::Create() + .ForInitialEmptyDocument(true) + .WithExecutionContext(&execution_context.GetExecutionContext()) + .WithAgent(*execution_context.GetExecutionContext().GetAgent()); HTMLDocument* empty_doc = MakeGarbageCollected<HTMLDocument>(init); ASSERT_TRUE(empty_doc->IsInitialEmptyDocument()); HTMLDocumentParser* parser = MakeGarbageCollected<HTMLDocumentParser>(
diff --git a/third_party/blink/renderer/core/html/parser/html_view_source_parser_test.cc b/third_party/blink/renderer/core/html/parser/html_view_source_parser_test.cc index f59394f..1218041 100644 --- a/third_party/blink/renderer/core/html/parser/html_view_source_parser_test.cc +++ b/third_party/blink/renderer/core/html/parser/html_view_source_parser_test.cc
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/core/dom/document_init.h" #include "third_party/blink/renderer/core/dom/document_parser.h" #include "third_party/blink/renderer/core/html/html_view_source_document.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" @@ -15,9 +16,12 @@ // This is a regression test for https://crbug.com/664915 TEST(HTMLViewSourceParserTest, DetachThenFinish_ShouldNotCrash) { + ScopedNullExecutionContext execution_context; String mime_type("text/html"); auto* document = MakeGarbageCollected<HTMLViewSourceDocument>( - DocumentInit::Create().ForTest().WithTypeFrom(mime_type)); + DocumentInit::Create() + .ForTest(execution_context.GetExecutionContext()) + .WithTypeFrom(mime_type)); auto* parser = MakeGarbageCollected<HTMLViewSourceParser>(*document, mime_type); // A client may detach the parser from the document.
diff --git a/third_party/blink/renderer/core/inspector/dom_patch_support.cc b/third_party/blink/renderer/core/inspector/dom_patch_support.cc index d148771bf..9fe30504 100644 --- a/third_party/blink/renderer/core/inspector/dom_patch_support.cc +++ b/third_party/blink/renderer/core/inspector/dom_patch_support.cc
@@ -62,8 +62,10 @@ void DOMPatchSupport::PatchDocument(const String& markup) { Document* new_document = nullptr; - DocumentInit init = DocumentInit::Create().WithExecutionContext( - GetDocument().GetExecutionContext()); + DocumentInit init = + DocumentInit::Create() + .WithExecutionContext(GetDocument().GetExecutionContext()) + .WithAgent(GetDocument().GetAgent()); if (IsA<HTMLDocument>(GetDocument())) new_document = MakeGarbageCollected<HTMLDocument>(init); else if (GetDocument().IsSVGDocument())
diff --git a/third_party/blink/renderer/core/layout/deferred_shaping_test.cc b/third_party/blink/renderer/core/layout/deferred_shaping_test.cc index d24104dd..8d3237f5 100644 --- a/third_party/blink/renderer/core/layout/deferred_shaping_test.cc +++ b/third_party/blink/renderer/core/layout/deferred_shaping_test.cc
@@ -10,6 +10,7 @@ #include "third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h" #include "third_party/blink/renderer/core/page/print_context.h" #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/fonts/shaping/shape_result_inline_headers.h" #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" @@ -553,7 +554,9 @@ } TEST_F(DeferredShapingTest, ScrollIntoViewInInactiveDocument) { - Document* doc = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + Document* doc = + Document::CreateForTest(execution_context.GetExecutionContext()); Node* root = doc->appendChild(doc->CreateRawElement(html_names::kHTMLTag)); To<Element>(root)->scrollIntoView(); // PASS if no crash.
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc index c76e4f18..2e20c919 100644 --- a/third_party/blink/renderer/core/layout/layout_object.cc +++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -200,16 +200,34 @@ ElementAnimations::CompositedPaintStatus::kComposited; } -StyleDifference AdjustForBackgroundColorPaint( +bool HasClipPathPaintWorklet(Node* node) { + if (!RuntimeEnabledFeatures::CompositeClipPathAnimationEnabled()) + return false; + + Element* element = DynamicTo<Element>(node); + if (!element) + return false; + + ElementAnimations* element_animations = element->GetElementAnimations(); + if (!element_animations) + return false; + + return element_animations->CompositedClipPathStatus() == + ElementAnimations::CompositedPaintStatus::kComposited; +} + +StyleDifference AdjustForCompositableAnimationPaint( scoped_refptr<const ComputedStyle> old_style, scoped_refptr<const ComputedStyle> new_style, Node* node, StyleDifference diff) { + DCHECK(new_style); + // Background color changes that are triggered by animations on the compositor // thread can skip paint invalidation. bool had_background_color_animation = old_style ? old_style->HasCurrentBackgroundColorAnimation() : false; - DCHECK(new_style); + bool has_background_color_animation = new_style->HasCurrentBackgroundColorAnimation(); // If animation status changed, we need a paint invalidation regardless of @@ -223,6 +241,21 @@ if (!skip_background_color_paint_invalidation) diff.SetNeedsPaintInvalidation(); + bool had_clip_path_animation = + old_style ? old_style->HasCurrentClipPathAnimation() : false; + + bool has_clip_path_animation = new_style->HasCurrentClipPathAnimation(); + // If animation status changed, we need a paint invalidation regardless of + // whether the background color changed. + if (RuntimeEnabledFeatures::CompositeClipPathAnimationEnabled() && + (had_clip_path_animation != has_clip_path_animation)) + diff.SetNeedsPaintInvalidation(); + + bool skip_clip_path_paint_invalidation = + !diff.ClipPathChanged() || HasClipPathPaintWorklet(node); + if (!skip_clip_path_paint_invalidation) + diff.SetNeedsPaintInvalidation(); + return diff; } @@ -2594,9 +2627,9 @@ diff = AdjustStyleDifference(diff); - // A change to the background color or status of BG color animation may - // require paint invalidation. - diff = AdjustForBackgroundColorPaint(style_, style, GetNode(), diff); + // A change to a property that can be animated on the compositor or an + // animation affecting that property may require paint invalidation. + diff = AdjustForCompositableAnimationPaint(style_, style, GetNode(), diff); StyleWillChange(diff, *style); @@ -3115,7 +3148,7 @@ if (const auto* new_first_line_style = FirstLineStyleWithoutFallback()) { diff = old_first_line_style->VisualInvalidationDiff( GetDocument(), *new_first_line_style); - diff = AdjustForBackgroundColorPaint( + diff = AdjustForCompositableAnimationPaint( old_first_line_style, new_first_line_style, GetNode(), diff); has_diff = true; }
diff --git a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc index c7f00006..6f6799c 100644 --- a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc
@@ -1160,11 +1160,9 @@ CaptionResult caption = LayoutCaption( ConstraintSpace(), Style(), container_builder_.InlineSize(), child_space, child, margins, child_break_token, early_break_in_child); - if (caption.layout_result->Status() != NGLayoutResult::kSuccess) { - DCHECK_EQ(caption.layout_result->Status(), - NGLayoutResult::kOutOfFragmentainerSpace); - return container_builder_.Abort(caption.layout_result->Status()); - } + DCHECK(caption.layout_result->Status() == NGLayoutResult::kSuccess || + caption.layout_result->Status() == + NGLayoutResult::kOutOfFragmentainerSpace); child_result = caption.layout_result; child_inline_offset = caption.margins.inline_start; } else {
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc index f93fcdb..f6b7e9142 100644 --- a/third_party/blink/renderer/core/loader/document_loader.cc +++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -1632,7 +1632,7 @@ // microtasks with a v8::Context, remove this hack. frame_->GetDocument() ->GetAgent() - ->event_loop() + .event_loop() ->PerformMicrotaskCheckpoint(); } ScriptForbiddenScope forbid_scripts;
diff --git a/third_party/blink/renderer/core/loader/image_loader.cc b/third_party/blink/renderer/core/loader/image_loader.cc index 7930473..a2d97de 100644 --- a/third_party/blink/renderer/core/loader/image_loader.cc +++ b/third_party/blink/renderer/core/loader/image_loader.cc
@@ -422,7 +422,7 @@ network::mojom::ReferrerPolicy referrer_policy) { auto task = std::make_unique<Task>(this, update_behavior, referrer_policy); pending_task_ = task->GetWeakPtr(); - element_->GetDocument().GetAgent()->event_loop()->EnqueueMicrotask( + element_->GetDocument().GetAgent().event_loop()->EnqueueMicrotask( WTF::BindOnce(&Task::Run, std::move(task))); delay_until_do_update_from_element_ = std::make_unique<IncrementLoadEventDelayCount>(element_->GetDocument());
diff --git a/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle.cc b/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle.cc index 9cb67c3..6c0ba99 100644 --- a/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle.cc +++ b/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle.cc
@@ -232,7 +232,7 @@ element_ = nullptr; if (element_document_) { auto task = std::make_unique<ReleaseResourceTask>(*this); - element_document_->GetAgent()->event_loop()->EnqueueMicrotask( + element_document_->GetAgent().event_loop()->EnqueueMicrotask( WTF::BindOnce(&ReleaseResourceTask::Run, std::move(task))); } else { ReleaseBundleLoaderAndUnregister();
diff --git a/third_party/blink/renderer/core/page/chrome_client_test.cc b/third_party/blink/renderer/core/page/chrome_client_test.cc index ec3bd63..8bb81ce 100644 --- a/third_party/blink/renderer/core/page/chrome_client_test.cc +++ b/third_party/blink/renderer/core/page/chrome_client_test.cc
@@ -12,6 +12,7 @@ #include "third_party/blink/renderer/core/layout/hit_test_result.h" #include "third_party/blink/renderer/core/loader/empty_clients.h" #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" namespace blink { @@ -45,7 +46,8 @@ ChromeClient* client = &logger; HitTestLocation location(PhysicalOffset(10, 20)); HitTestResult result(HitTestRequest(HitTestRequest::kMove), location); - auto* doc = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* doc = Document::CreateForTest(execution_context.GetExecutionContext()); auto* element = MakeGarbageCollected<HTMLElement>(html_names::kDivTag, *doc); element->setAttribute(html_names::kTitleAttr, "tooltip"); result.SetInnerNode(element); @@ -78,7 +80,8 @@ ChromeClient* client = MakeGarbageCollected<EmptyChromeClient>(); HitTestLocation location(PhysicalOffset(10, 20)); HitTestResult result(HitTestRequest(HitTestRequest::kMove), location); - auto& doc = *Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto& doc = *Document::CreateForTest(execution_context.GetExecutionContext()); auto& input_element = *MakeGarbageCollected<HTMLInputElement>(doc, CreateElementFlags()); input_element.setAttribute(html_names::kTypeAttr, "file");
diff --git a/third_party/blink/renderer/core/page/scrolling/scroll_state_test.cc b/third_party/blink/renderer/core/page/scrolling/scroll_state_test.cc index f9f92e5..b58f0a6 100644 --- a/third_party/blink/renderer/core/page/scrolling/scroll_state_test.cc +++ b/third_party/blink/renderer/core/page/scrolling/scroll_state_test.cc
@@ -8,6 +8,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/element.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" namespace blink { @@ -68,8 +69,10 @@ TEST_F(ScrollStateTest, CurrentNativeScrollingElement) { ScrollState* scroll_state = CreateScrollState(0, 0, false, false); - auto* element = MakeGarbageCollected<Element>(QualifiedName::Null(), - Document::CreateForTest()); + ScopedNullExecutionContext execution_context; + auto* element = MakeGarbageCollected<Element>( + QualifiedName::Null(), + Document::CreateForTest(execution_context.GetExecutionContext())); scroll_state->SetCurrentNativeScrollingNode(element); EXPECT_EQ(element, scroll_state->CurrentNativeScrollingNode());
diff --git a/third_party/blink/renderer/core/paint/clip_path_clipper.cc b/third_party/blink/renderer/core/paint/clip_path_clipper.cc index d226a8c..3c79b85 100644 --- a/third_party/blink/renderer/core/paint/clip_path_clipper.cc +++ b/third_party/blink/renderer/core/paint/clip_path_clipper.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/core/paint/clip_path_clipper.h" +#include "third_party/blink/renderer/core/animation/element_animations.h" #include "third_party/blink/renderer/core/css/clip_path_paint_image_generator.h" #include "third_party/blink/renderer/core/display_lock/display_lock_utilities.h" #include "third_party/blink/renderer/core/frame/local_frame.h" @@ -27,6 +28,8 @@ namespace blink { +using CompositedPaintStatus = ElementAnimations::CompositedPaintStatus; + namespace { SVGResourceClient* GetResourceClient(const LayoutObject& object) { @@ -66,29 +69,63 @@ clip_path_owner.IsSVGForeignObjectIncludingNG(); } +CompositedPaintStatus CompositeClipPathStatus(Node* node) { + if (!node || !node->IsElementNode()) + return CompositedPaintStatus::kNotComposited; + + ElementAnimations* element_animations = + static_cast<Element*>(node)->GetElementAnimations(); + DCHECK(element_animations); + + return element_animations->CompositedClipPathStatus(); +} + +void SetCompositeClipPathStatus(Node* node, bool is_compositable) { + if (!node || !node->IsElementNode()) + return; + + ElementAnimations* element_animations = + static_cast<Element*>(node)->GetElementAnimations(); + DCHECK(element_animations || !is_compositable); + if (element_animations) { + element_animations->SetCompositedClipPathStatus( + is_compositable ? CompositedPaintStatus::kComposited + : CompositedPaintStatus::kNotComposited); + } +} + static bool HasCompositeClipPathAnimation(const LayoutObject& layout_object) { if (!RuntimeEnabledFeatures::CompositeClipPathAnimationEnabled() || !layout_object.StyleRef().HasCurrentClipPathAnimation()) return false; + CompositedPaintStatus status = + CompositeClipPathStatus(layout_object.GetNode()); + + if (status == CompositedPaintStatus::kComposited) { + return true; + } else if (status == CompositedPaintStatus::kNotComposited) { + return false; + } + ClipPathPaintImageGenerator* generator = layout_object.GetFrame()->GetClipPathPaintImageGenerator(); // TODO(crbug.com/686074): The generator may be null in tests. // Fix and remove this test-only branch. if (!generator) { + SetCompositeClipPathStatus(layout_object.GetNode(), false); return false; } const Element* element = To<Element>(layout_object.GetNode()); const Animation* animation = generator->GetAnimationIfCompositable(element); - if (!animation) { - return false; - } - // TODO(crbug.com/1248622): Cache this function to avoid this heavy check, - // See also: work done for bgcolor animations on crbug.com/1301961 - return animation->CheckCanStartAnimationOnCompositor(nullptr) == - CompositorAnimations::kNoFailure; + bool has_compositable_clip_path_animation = + animation && (animation->CheckCanStartAnimationOnCompositor(nullptr) == + CompositorAnimations::kNoFailure); + SetCompositeClipPathStatus(layout_object.GetNode(), + has_compositable_clip_path_animation); + return has_compositable_clip_path_animation; } static void PaintWorkletBasedClip(GraphicsContext& context, @@ -355,8 +392,9 @@ // will be impossible to tell if a composited clip path animation is possible // or not based only on the layout object. Exclude the possibility if we're // fragmented. - if (!is_in_block_fragmentation && - HasCompositeClipPathAnimation(clip_path_owner)) + if (is_in_block_fragmentation) + SetCompositeClipPathStatus(clip_path_owner.GetNode(), false); + else if (HasCompositeClipPathAnimation(clip_path_owner)) return absl::nullopt; return PathBasedClipInternal(clip_path_owner,
diff --git a/third_party/blink/renderer/core/script/html_parser_script_runner.cc b/third_party/blink/renderer/core/script/html_parser_script_runner.cc index 07e08e6..ad72846 100644 --- a/third_party/blink/renderer/core/script/html_parser_script_runner.cc +++ b/third_party/blink/renderer/core/script/html_parser_script_runner.cc
@@ -200,7 +200,7 @@ if (!IsExecutingScript()) { // TODO(kouhei, hiroshige): Investigate why we need checkpoint here. - document_->GetAgent()->event_loop()->PerformMicrotaskCheckpoint(); + document_->GetAgent().event_loop()->PerformMicrotaskCheckpoint(); // The parser cannot be unblocked as a microtask requested another // resource if (!document_->IsScriptExecutionReady()) @@ -248,7 +248,7 @@ if (!IsExecutingScript()) { // TODO(kouhei, hiroshige): Investigate why we need checkpoint here. - document_->GetAgent()->event_loop()->PerformMicrotaskCheckpoint(); + document_->GetAgent().event_loop()->PerformMicrotaskCheckpoint(); } DoExecuteScript(pending_script, *document_); @@ -516,7 +516,7 @@ // JavaScript execution context stack is empty, then perform a microtask // checkpoint. ...</spec> if (!IsExecutingScript()) - document_->GetAgent()->event_loop()->PerformMicrotaskCheckpoint(); + document_->GetAgent().event_loop()->PerformMicrotaskCheckpoint(); // <spec>... Let the old insertion point have the same value as the current // insertion point. Let the insertion point be just before the next input
diff --git a/third_party/blink/renderer/core/style/computed_style.cc b/third_party/blink/renderer/core/style/computed_style.cc index b6cea5e..2bbefe14 100644 --- a/third_party/blink/renderer/core/style/computed_style.cc +++ b/third_party/blink/renderer/core/style/computed_style.cc
@@ -965,6 +965,7 @@ !BorderVisuallyEqual(other) || !RadiiEqual(other)) diff.SetNeedsPaintInvalidation(); + AdjustDiffForClipPath(other, diff); AdjustDiffForBackgroundVisuallyEqual(other, diff); if (diff.NeedsPaintInvalidation()) @@ -981,6 +982,16 @@ } } +void ComputedStyle::AdjustDiffForClipPath(const ComputedStyle& other, + StyleDifference& diff) const { + if (!this->ClipPathDataEquivalent(other)) { + // Paint invalidation may not be necessary in the case of a composited + // clip-path animation, so this dcision needs to be deferred until we know + // whether the clip is being handled by the compositor or not + diff.SetClipPathChanged(); + } +} + void ComputedStyle::AdjustDiffForBackgroundVisuallyEqual( const ComputedStyle& other, StyleDifference& diff) const {
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h index 5904edd..0b7d0c5 100644 --- a/third_party/blink/renderer/core/style/computed_style.h +++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -1849,6 +1849,9 @@ return BorderImage().Outset() == o.BorderImage().Outset(); } + CORE_EXPORT void AdjustDiffForClipPath(const ComputedStyle& o, + StyleDifference& diff) const; + CORE_EXPORT void AdjustDiffForBackgroundVisuallyEqual( const ComputedStyle& o, StyleDifference& diff) const;
diff --git a/third_party/blink/renderer/core/style/computed_style_diff_functions.json5 b/third_party/blink/renderer/core/style/computed_style_diff_functions.json5 index f2d407016..9601094 100644 --- a/third_party/blink/renderer/core/style/computed_style_diff_functions.json5 +++ b/third_party/blink/renderer/core/style/computed_style_diff_functions.json5
@@ -299,10 +299,6 @@ field_dependencies: ["shape-outside"] }, { - predicate: "a.ClipPathDataEquivalent(b)", - field_dependencies: ["clip-path"] - }, - { predicate: "a.OutlineVisuallyEqual(b)", field_dependencies: ["outline-width", "outline-color", "outline-offset", "outline-style", "OutlineStyleIsAuto"] },
diff --git a/third_party/blink/renderer/core/style/computed_style_test.cc b/third_party/blink/renderer/core/style/computed_style_test.cc index f98b4af..2063720 100644 --- a/third_party/blink/renderer/core/style/computed_style_test.cc +++ b/third_party/blink/renderer/core/style/computed_style_test.cc
@@ -36,6 +36,7 @@ #include "third_party/blink/renderer/core/style/style_initial_data.h" #include "third_party/blink/renderer/core/testing/color_scheme_helper.h" #include "third_party/blink/renderer/core/testing/dummy_page_holder.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" #include "third_party/blink/renderer/platform/transforms/scale_transform_operation.h" @@ -457,7 +458,9 @@ } while (false) TEST_F(ComputedStyleTest, AnimationFlags) { - Persistent<Document> document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + Persistent<Document> document = + Document::CreateForTest(execution_context.GetExecutionContext()); TEST_ANIMATION_FLAG(HasCurrentTransformAnimation, kNonInherited); TEST_ANIMATION_FLAG(HasCurrentScaleAnimation, kNonInherited); TEST_ANIMATION_FLAG(HasCurrentRotateAnimation, kNonInherited); @@ -818,11 +821,13 @@ scoped_refptr<ComputedStyle> style = CreateComputedStyle(); + ScopedNullExecutionContext execution_context; PropertyRegistry* registry = MakeGarbageCollected<PropertyRegistry>(); registry->RegisterProperty("--x", *CreateLengthRegistration("--x", 1)); registry->RegisterProperty("--y", *CreateLengthRegistration("--y", 2)); - style->SetInitialData( - StyleInitialData::Create(*Document::CreateForTest(), *registry)); + style->SetInitialData(StyleInitialData::Create( + *Document::CreateForTest(execution_context.GetExecutionContext()), + *registry)); EXPECT_EQ(2u, style->GetVariableNames().size()); EXPECT_TRUE(style->GetVariableNames().Contains("--x")); @@ -881,11 +886,13 @@ scoped_refptr<ComputedStyle> style = CreateComputedStyle(); + ScopedNullExecutionContext execution_context; PropertyRegistry* registry = MakeGarbageCollected<PropertyRegistry>(); registry->RegisterProperty("--b", *CreateLengthRegistration("--b", 1)); registry->RegisterProperty("--e", *CreateLengthRegistration("--e", 2)); - style->SetInitialData( - StyleInitialData::Create(*Document::CreateForTest(), *registry)); + style->SetInitialData(StyleInitialData::Create( + *Document::CreateForTest(execution_context.GetExecutionContext()), + *registry)); const bool inherited = true; style->SetVariableData("--a", CreateVariableData("foo"), inherited); @@ -942,11 +949,13 @@ scoped_refptr<ComputedStyle> style = CreateComputedStyle(); + ScopedNullExecutionContext execution_context; { PropertyRegistry* registry = MakeGarbageCollected<PropertyRegistry>(); registry->RegisterProperty("--x", *CreateLengthRegistration("--x", 1)); - style->SetInitialData( - StyleInitialData::Create(*Document::CreateForTest(), *registry)); + style->SetInitialData(StyleInitialData::Create( + *Document::CreateForTest(execution_context.GetExecutionContext()), + *registry)); } EXPECT_EQ(style->GetVariableNames().size(), 1u); EXPECT_TRUE(style->GetVariableNames().Contains("--x")); @@ -956,8 +965,9 @@ PropertyRegistry* registry = MakeGarbageCollected<PropertyRegistry>(); registry->RegisterProperty("--y", *CreateLengthRegistration("--y", 2)); registry->RegisterProperty("--z", *CreateLengthRegistration("--z", 3)); - style->SetInitialData( - StyleInitialData::Create(*Document::CreateForTest(), *registry)); + style->SetInitialData(StyleInitialData::Create( + *Document::CreateForTest(execution_context.GetExecutionContext()), + *registry)); } EXPECT_EQ(style->GetVariableNames().size(), 2u); EXPECT_TRUE(style->GetVariableNames().Contains("--y")); @@ -1211,7 +1221,9 @@ } TEST_F(ComputedStyleTest, SvgStrokeStyleShouldCompareValue) { - Persistent<Document> document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + Persistent<Document> document = + Document::CreateForTest(execution_context.GetExecutionContext()); TEST_STYLE_VALUE_NO_DIFF(StrokeOpacity); TEST_STYLE_VALUE_NO_DIFF(StrokeMiterLimit); TEST_STYLE_VALUE_NO_DIFF(StrokeWidth); @@ -1223,7 +1235,9 @@ } TEST_F(ComputedStyleTest, SvgMiscStyleShouldCompareValue) { - Persistent<Document> document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + Persistent<Document> document = + Document::CreateForTest(execution_context.GetExecutionContext()); TEST_STYLE_VALUE_NO_DIFF(FloodColor); TEST_STYLE_VALUE_NO_DIFF(FloodOpacity); TEST_STYLE_VALUE_NO_DIFF(LightingColor);
diff --git a/third_party/blink/renderer/core/style/style_difference.h b/third_party/blink/renderer/core/style/style_difference.h index 99d1a2f7..e2e683f 100644 --- a/third_party/blink/renderer/core/style/style_difference.h +++ b/third_party/blink/renderer/core/style/style_difference.h
@@ -34,6 +34,7 @@ kBlendModeChanged = 1 << 7, kMaskChanged = 1 << 8, kBackgroundColorChanged = 1 << 9, + kClipPathChanged = 1 << 10 // If you add a value here, be sure to update kPropertyDifferenceCount. }; @@ -172,6 +173,13 @@ property_specific_differences_ |= kBackgroundColorChanged; } + bool ClipPathChanged() const { + return property_specific_differences_ & kClipPathChanged; + } + void SetClipPathChanged() { + property_specific_differences_ |= kClipPathChanged; + } + bool ScrollAnchorDisablingPropertyChanged() const { return scroll_anchor_disabling_property_changed_; } @@ -190,7 +198,7 @@ } private: - static constexpr int kPropertyDifferenceCount = 10; + static constexpr int kPropertyDifferenceCount = 11; friend CORE_EXPORT std::ostream& operator<<(std::ostream&, const StyleDifference&);
diff --git a/third_party/blink/renderer/core/style/style_pending_image_test.cc b/third_party/blink/renderer/core/style/style_pending_image_test.cc index da885de..27b115a 100644 --- a/third_party/blink/renderer/core/style/style_pending_image_test.cc +++ b/third_party/blink/renderer/core/style/style_pending_image_test.cc
@@ -6,12 +6,15 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/core/css/css_test_helpers.h" #include "third_party/blink/renderer/core/dom/document.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" namespace blink { TEST(StylePendingImageTest, IsEqual) { using css_test_helpers::ParseValue; - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); const CSSValue* value1 = ParseValue(*document, "<image>", "url('#a')"); const CSSValue* value2 = ParseValue(*document, "<image>", "url('#a')"); const CSSValue* value3 = ParseValue(*document, "<image>", "url('#b')");
diff --git a/third_party/blink/renderer/core/svg/svg_resource_document_content.cc b/third_party/blink/renderer/core/svg/svg_resource_document_content.cc index f0ea6783..36b4cf5 100644 --- a/third_party/blink/renderer/core/svg/svg_resource_document_content.cc +++ b/third_party/blink/renderer/core/svg/svg_resource_document_content.cc
@@ -101,7 +101,8 @@ auto* document = XMLDocument::CreateSVG(DocumentInit::Create() .WithURL(response.CurrentRequestUrl()) - .WithExecutionContext(execution_context)); + .WithExecutionContext(execution_context) + .WithAgent(*execution_context->GetAgent())); document->SetContent(resource->DecodedText()); return document; }
diff --git a/third_party/blink/renderer/core/svg/unsafe_svg_attribute_sanitization_test.cc b/third_party/blink/renderer/core/svg/unsafe_svg_attribute_sanitization_test.cc index 79f5c54..89a950e0 100644 --- a/third_party/blink/renderer/core/svg/unsafe_svg_attribute_sanitization_test.cc +++ b/third_party/blink/renderer/core/svg/unsafe_svg_attribute_sanitization_test.cc
@@ -25,6 +25,7 @@ #include "third_party/blink/renderer/core/svg_names.h" #include "third_party/blink/renderer/core/testing/dummy_page_holder.h" #include "third_party/blink/renderer/core/testing/mock_clipboard_host.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/core/testing/page_test_base.h" #include "third_party/blink/renderer/core/xlink_names.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" @@ -213,7 +214,9 @@ // Element::stripScriptingAttributes, perhaps to strip all // SVG animation attributes. TEST(UnsafeSVGAttributeSanitizationTest, stringsShouldNotSupportAddition) { - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* target = MakeGarbageCollected<SVGAElement>(*document); auto* element = MakeGarbageCollected<SVGAnimateElement>(*document); element->SetTargetElement(target); @@ -240,7 +243,9 @@ attributes.push_back(Attribute(svg_names::kFromAttr, "/home")); attributes.push_back(Attribute(svg_names::kToAttr, "javascript:own3d()")); - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* element = MakeGarbageCollected<SVGAnimateElement>(*document); element->StripScriptingAttributes(attributes); @@ -260,7 +265,9 @@ TEST(UnsafeSVGAttributeSanitizationTest, isJavaScriptURLAttribute_hrefContainingJavascriptURL) { Attribute attribute(svg_names::kHrefAttr, "javascript:alert()"); - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* element = MakeGarbageCollected<SVGAElement>(*document); EXPECT_TRUE(element->IsJavaScriptURLAttribute(attribute)) << "The 'a' element should identify an 'href' attribute with a " @@ -270,7 +277,9 @@ TEST(UnsafeSVGAttributeSanitizationTest, isJavaScriptURLAttribute_xlinkHrefContainingJavascriptURL) { Attribute attribute(xlink_names::kHrefAttr, "javascript:alert()"); - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* element = MakeGarbageCollected<SVGAElement>(*document); EXPECT_TRUE(element->IsJavaScriptURLAttribute(attribute)) << "The 'a' element should identify an 'xlink:href' attribute with a " @@ -283,7 +292,9 @@ QualifiedName href_alternate_prefix("foo", "href", xlink_names::kNamespaceURI); Attribute evil_attribute(href_alternate_prefix, "javascript:alert()"); - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* element = MakeGarbageCollected<SVGAElement>(*document); EXPECT_TRUE(element->IsJavaScriptURLAttribute(evil_attribute)) << "The XLink 'href' attribute with a JavaScript URL value should be " @@ -294,7 +305,9 @@ TEST(UnsafeSVGAttributeSanitizationTest, isSVGAnimationAttributeSettingJavaScriptURL_fromContainingJavaScriptURL) { Attribute evil_attribute(svg_names::kFromAttr, "javascript:alert()"); - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* element = MakeGarbageCollected<SVGAnimateElement>(*document); EXPECT_TRUE( element->IsSVGAnimationAttributeSettingJavaScriptURL(evil_attribute)) @@ -305,7 +318,9 @@ TEST(UnsafeSVGAttributeSanitizationTest, isSVGAnimationAttributeSettingJavaScriptURL_toContainingJavaScripURL) { Attribute evil_attribute(svg_names::kToAttr, "javascript:window.close()"); - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* element = MakeGarbageCollected<SVGSetElement>(*document); EXPECT_TRUE( element->IsSVGAnimationAttributeSettingJavaScriptURL(evil_attribute)) @@ -317,7 +332,9 @@ UnsafeSVGAttributeSanitizationTest, isSVGAnimationAttributeSettingJavaScriptURL_valuesContainingJavaScriptURL) { Attribute evil_attribute(svg_names::kValuesAttr, "hi!; javascript:confirm()"); - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* element = MakeGarbageCollected<SVGAnimateElement>(*document); EXPECT_TRUE( element->IsSVGAnimationAttributeSettingJavaScriptURL(evil_attribute)) @@ -328,7 +345,9 @@ TEST(UnsafeSVGAttributeSanitizationTest, isSVGAnimationAttributeSettingJavaScriptURL_innocuousAnimationAttribute) { Attribute fine_attribute(svg_names::kFromAttr, "hello, world!"); - auto* document = Document::CreateForTest(); + ScopedNullExecutionContext execution_context; + auto* document = + Document::CreateForTest(execution_context.GetExecutionContext()); auto* element = MakeGarbageCollected<SVGSetElement>(*document); EXPECT_FALSE( element->IsSVGAnimationAttributeSettingJavaScriptURL(fine_attribute))
diff --git a/third_party/blink/renderer/core/testing/null_execution_context.cc b/third_party/blink/renderer/core/testing/null_execution_context.cc index bd7d7d3..805fa19 100644 --- a/third_party/blink/renderer/core/testing/null_execution_context.cc +++ b/third_party/blink/renderer/core/testing/null_execution_context.cc
@@ -30,7 +30,9 @@ base::UnguessableToken::Create(), v8::MicrotaskQueue::New(v8::Isolate::GetCurrent(), v8::MicrotasksPolicy::kScoped))), - scheduler_(std::move(scheduler)) {} + scheduler_(std::move(scheduler)) { + SetPolicyContainer(PolicyContainer::CreateEmpty()); +} NullExecutionContext::~NullExecutionContext() {}
diff --git a/third_party/blink/renderer/core/testing/null_execution_context.h b/third_party/blink/renderer/core/testing/null_execution_context.h index d7a3fcc..d8ae5e8 100644 --- a/third_party/blink/renderer/core/testing/null_execution_context.h +++ b/third_party/blink/renderer/core/testing/null_execution_context.h
@@ -14,12 +14,11 @@ #include "third_party/blink/renderer/core/inspector/inspector_audits_issue.h" #include "third_party/blink/renderer/platform/bindings/source_location.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" +#include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" namespace blink { -class FrameScheduler; - class NullExecutionContext : public GarbageCollected<NullExecutionContext>, public ExecutionContext { public: @@ -80,6 +79,27 @@ const LocalFrameToken token_; }; +class ScopedNullExecutionContext { + public: + ScopedNullExecutionContext() + : execution_context_(MakeGarbageCollected<NullExecutionContext>()) {} + + explicit ScopedNullExecutionContext(std::unique_ptr<FrameScheduler> scheduler) + : execution_context_( + MakeGarbageCollected<NullExecutionContext>(std::move(scheduler))) {} + + ~ScopedNullExecutionContext() { + execution_context_->NotifyContextDestroyed(); + } + + NullExecutionContext& GetExecutionContext() const { + return *execution_context_; + } + + private: + Persistent<NullExecutionContext> execution_context_; +}; + } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_NULL_EXECUTION_CONTEXT_H_
diff --git a/third_party/blink/renderer/core/xml/dom_parser.cc b/third_party/blink/renderer/core/xml/dom_parser.cc index 3d3333b..31224cb 100644 --- a/third_party/blink/renderer/core/xml/dom_parser.cc +++ b/third_party/blink/renderer/core/xml/dom_parser.cc
@@ -35,6 +35,7 @@ .WithURL(window_->Url()) .WithTypeFrom(type) .WithExecutionContext(window_) + .WithAgent(*window_->GetAgent()) .CreateDocument(); doc->setAllowDeclarativeShadowRoots(options->hasIncludeShadowRoots() && options->includeShadowRoots());
diff --git a/third_party/blink/renderer/core/xml/parser/xml_document_parser_test.cc b/third_party/blink/renderer/core/xml/parser/xml_document_parser_test.cc index e66499a..0d71d2a 100644 --- a/third_party/blink/renderer/core/xml/parser/xml_document_parser_test.cc +++ b/third_party/blink/renderer/core/xml/parser/xml_document_parser_test.cc
@@ -17,9 +17,9 @@ // crbug.com/932380 TEST(XMLDocumentParserTest, NodeNamespaceWithParseError) { - auto* execution_context = MakeGarbageCollected<NullExecutionContext>(); - execution_context->SetUpSecurityContextForTesting(); - auto& doc = *Document::CreateForTest(execution_context); + ScopedNullExecutionContext execution_context; + execution_context.GetExecutionContext().SetUpSecurityContextForTesting(); + auto& doc = *Document::CreateForTest(execution_context.GetExecutionContext()); doc.SetContent( "<html xmlns='http://www.w3.org/1999/xhtml'>" "<body><d:foo/></body></html>"); @@ -29,14 +29,13 @@ EXPECT_TRUE(foo->namespaceURI().IsNull()) << foo->namespaceURI(); EXPECT_TRUE(foo->prefix().IsNull()) << foo->prefix(); EXPECT_EQ(foo->localName(), "d:foo"); - execution_context->NotifyContextDestroyed(); } // https://crbug.com/1239288 TEST(XMLDocumentParserTest, ParseFragmentWithUnboundNamespacePrefix) { - auto* execution_context = MakeGarbageCollected<NullExecutionContext>(); - execution_context->SetUpSecurityContextForTesting(); - auto& doc = *Document::CreateForTest(execution_context); + ScopedNullExecutionContext execution_context; + execution_context.GetExecutionContext().SetUpSecurityContextForTesting(); + auto& doc = *Document::CreateForTest(execution_context.GetExecutionContext()); DummyExceptionStateForTesting exception; auto* svg = @@ -56,7 +55,6 @@ EXPECT_EQ(bar->prefix(), WTF::g_null_atom); EXPECT_EQ(bar->namespaceURI(), WTF::g_null_atom); EXPECT_EQ(bar->localName(), "foo:bar"); - execution_context->NotifyContextDestroyed(); } } // namespace blink
diff --git a/third_party/blink/renderer/core/xml/xpath_functions_test.cc b/third_party/blink/renderer/core/xml/xpath_functions_test.cc index 5cba677..14c86410 100644 --- a/third_party/blink/renderer/core/xml/xpath_functions_test.cc +++ b/third_party/blink/renderer/core/xml/xpath_functions_test.cc
@@ -6,6 +6,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/core/dom/document.h" +#include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/core/xml/xpath_expression_node.h" // EvaluationContext #include "third_party/blink/renderer/core/xml/xpath_predicate.h" // Number, StringExpression #include "third_party/blink/renderer/core/xml/xpath_value.h" @@ -25,13 +26,15 @@ public: XPathContext() - : document_(Document::CreateForTest()), + : document_( + Document::CreateForTest(execution_context_.GetExecutionContext())), context_(*document_, had_type_conversion_error_) {} xpath::EvaluationContext& Context() { return context_; } Document& GetDocument() { return *document_; } private: + ScopedNullExecutionContext execution_context_; Document* const document_; bool had_type_conversion_error_ = false; xpath::EvaluationContext context_;
diff --git a/third_party/blink/renderer/core/xml/xslt_processor.cc b/third_party/blink/renderer/core/xml/xslt_processor.cc index c41bbee..0ed90578 100644 --- a/third_party/blink/renderer/core/xml/xslt_processor.cc +++ b/third_party/blink/renderer/core/xml/xslt_processor.cc
@@ -105,7 +105,8 @@ DocumentInit::Create() .WithURL(url) .WithTypeFrom(mime_type) - .WithExecutionContext(owner_document->GetExecutionContext()); + .WithExecutionContext(owner_document->GetExecutionContext()) + .WithAgent(owner_document->GetAgent()); Document* document = init.CreateDocument(); auto parsed_source_encoding = source_encoding.empty() ? UTF8Encoding()
diff --git a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc index 6be9820c..6819d46a 100644 --- a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc +++ b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc
@@ -346,6 +346,7 @@ auto* document = To<LocalDOMWindow>(GetExecutionContext())->document(); DocumentInit init = DocumentInit::Create() .WithExecutionContext(GetExecutionContext()) + .WithAgent(*GetExecutionContext()->GetAgent()) .WithURL(response_.ResponseUrl()); if (is_html) { response_document_ = MakeGarbageCollected<HTMLDocument>(init);
diff --git a/third_party/blink/renderer/modules/accessibility/BUILD.gn b/third_party/blink/renderer/modules/accessibility/BUILD.gn index 03c13c7..cb09148 100644 --- a/third_party/blink/renderer/modules/accessibility/BUILD.gn +++ b/third_party/blink/renderer/modules/accessibility/BUILD.gn
@@ -6,6 +6,8 @@ blink_modules_sources("accessibility") { sources = [ + "aria_notification.cc", + "aria_notification.h", "ax_enums.cc", "ax_enums.h", "ax_image_map_link.cc",
diff --git a/third_party/blink/renderer/modules/accessibility/aria_notification.cc b/third_party/blink/renderer/modules/accessibility/aria_notification.cc new file mode 100644 index 0000000..6e148bf --- /dev/null +++ b/third_party/blink/renderer/modules/accessibility/aria_notification.cc
@@ -0,0 +1,25 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/modules/accessibility/aria_notification.h" + +namespace blink { +AriaNotification::AriaNotification(Node* node, + const String announcement, + const AriaNotificationOptions* options) + : node_(node), announcement_(announcement) { + label_ = options->label(); + interrupt_current_ = options->interruptCurrent(); + prevent_interrupt_ = options->preventInterrupt(); + + if (options->insertionMode() == "queue") { + insertion_mode_ = AriaNotificationInsertionMode::kQueue; + } else if (options->insertionMode() == "stack") { + insertion_mode_ = AriaNotificationInsertionMode::kStack; + } else if (options->insertionMode() == "clear") { + insertion_mode_ = AriaNotificationInsertionMode::kClear; + } +} + +} // namespace blink
diff --git a/third_party/blink/renderer/modules/accessibility/aria_notification.h b/third_party/blink/renderer/modules/accessibility/aria_notification.h new file mode 100644 index 0000000..e096f307 --- /dev/null +++ b/third_party/blink/renderer/modules/accessibility/aria_notification.h
@@ -0,0 +1,35 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_ACCESSIBILITY_ARIA_NOTIFICATION_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_ACCESSIBILITY_ARIA_NOTIFICATION_H_ + +#include "third_party/blink/renderer/bindings/core/v8/v8_aria_notification_options.h" +#include "third_party/blink/renderer/core/dom/node.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" + +namespace blink { + +enum class AriaNotificationInsertionMode { kQueue, kStack, kClear }; + +class AriaNotification final : public GarbageCollected<AriaNotification> { + public: + AriaNotification(Node*, + const String announcement, + const AriaNotificationOptions* options); + + void Trace(Visitor* visitor) const { visitor->Trace(node_); } + + private: + Member<Node> node_; + const String announcement_; + AriaNotificationInsertionMode insertion_mode_; + bool interrupt_current_; + bool prevent_interrupt_; + String label_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_ACCESSIBILITY_ARIA_NOTIFICATION_H_
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc index 4d83dc494..0caeb1c 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -1801,6 +1801,14 @@ return obj_id; } +void AXObjectCacheImpl::AddAriaNotification( + Node* node, + const String announcement, + const AriaNotificationOptions* options) { + aria_notifications_.push_back( + MakeGarbageCollected<AriaNotification>(node, announcement, options)); +} + void AXObjectCacheImpl::AddToFixedOrStickyNodeList(const AXObject* object) { DCHECK(object); DCHECK(!object->IsDetached()); @@ -4474,6 +4482,7 @@ visitor->Trace(nodes_with_spelling_or_grammar_markers_); visitor->Trace(ax_tree_source_); visitor->Trace(dirty_objects_); + visitor->Trace(aria_notifications_); AXObjectCache::Trace(visitor); }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h index 03347b5..17a1189 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
@@ -39,10 +39,12 @@ #include "third_party/blink/public/mojom/permissions/permission_status.mojom-blink.h" #include "third_party/blink/public/mojom/render_accessibility.mojom-blink.h" #include "third_party/blink/public/web/web_ax_enums.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_aria_notification_options.h" #include "third_party/blink/renderer/core/accessibility/ax_object_cache_base.h" #include "third_party/blink/renderer/core/accessibility/blink_ax_event_intent.h" #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" +#include "third_party/blink/renderer/modules/accessibility/aria_notification.h" #include "third_party/blink/renderer/modules/accessibility/ax_object.h" #include "third_party/blink/renderer/modules/accessibility/blink_ax_tree_source.h" #include "third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.h" @@ -320,6 +322,10 @@ AXID GenerateAXID() const override; + void AddAriaNotification(Node*, + const String, + const AriaNotificationOptions*) override; + // Counts the number of times the document has been modified. Some attribute // values are cached as long as the modification count hasn't changed. int ModificationCount() const { return modification_count_; } @@ -843,6 +849,9 @@ // A set of currently active event intents. BlinkAXEventIntentsSet active_event_intents_; + // A set of aria notifications that have yet to be added to ax_tree_data. + HeapVector<Member<AriaNotification>> aria_notifications_; + bool is_frozen_ = false; // Used with Freeze(), Thaw() and IsFrozen() above. // Set of ID's of current AXObjects that need to be destroyed and recreated.
diff --git a/third_party/blink/renderer/modules/quota/deprecated_storage_quota.cc b/third_party/blink/renderer/modules/quota/deprecated_storage_quota.cc index 72d9aea..a4aa31f 100644 --- a/third_party/blink/renderer/modules/quota/deprecated_storage_quota.cc +++ b/third_party/blink/renderer/modules/quota/deprecated_storage_quota.cc
@@ -30,7 +30,10 @@ #include "third_party/blink/renderer/modules/quota/deprecated_storage_quota.h" +#include <algorithm> + #include "base/location.h" +#include "base/numerics/safe_conversions.h" #include "mojo/public/cpp/bindings/callback_helpers.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/task_type.h" @@ -50,7 +53,6 @@ namespace blink { -using mojom::blink::StorageType; using mojom::blink::UsageBreakdownPtr; namespace { @@ -78,9 +80,11 @@ void RequestStorageQuotaCallback(V8StorageQuotaCallback* success_callback, V8StorageErrorCallback* error_callback, + uint64_t requested_quota_in_bytes, mojom::blink::QuotaStatusCode status_code, int64_t usage_in_bytes, - int64_t granted_quota_in_bytes) { + int64_t quota_in_bytes, + UsageBreakdownPtr usage_breakdown) { if (status_code != mojom::blink::QuotaStatusCode::kOk) { if (error_callback) { error_callback->InvokeAndReportException(nullptr, @@ -90,7 +94,10 @@ } if (success_callback) { - success_callback->InvokeAndReportException(nullptr, granted_quota_in_bytes); + success_callback->InvokeAndReportException( + nullptr, + std::min(base::saturated_cast<int64_t>(requested_quota_in_bytes), + quota_in_bytes)); } } @@ -138,14 +145,10 @@ auto callback = WTF::BindOnce(&DeprecatedQueryStorageUsageAndQuotaCallback, WrapPersistent(success_callback), WrapPersistent(error_callback)); - // StorageType::kPersistent is deprecated as of crbug.com/1233525. - // Therefore all requests are for StorageType::kTemporary. GetQuotaHost(execution_context) - ->QueryStorageUsageAndQuota( - StorageType::kTemporary, - mojo::WrapCallbackWithDefaultInvokeIfNotRun( - std::move(callback), mojom::blink::QuotaStatusCode::kErrorAbort, - 0, 0, nullptr)); + ->QueryStorageUsageAndQuota(mojo::WrapCallbackWithDefaultInvokeIfNotRun( + std::move(callback), mojom::blink::QuotaStatusCode::kErrorAbort, 0, 0, + nullptr)); } void DeprecatedStorageQuota::requestQuota( @@ -158,24 +161,25 @@ // attribute, so the kQuotaRead use counter must be explicitly updated. UseCounter::Count(execution_context, WebFeature::kQuotaRead); - auto callback = WTF::BindOnce(&RequestStorageQuotaCallback, - WrapPersistent(success_callback), - WrapPersistent(error_callback)); + auto callback = WTF::BindOnce( + &RequestStorageQuotaCallback, WrapPersistent(success_callback), + WrapPersistent(error_callback), new_quota_in_bytes); if (execution_context->GetSecurityOrigin()->IsOpaque()) { // Unique origins cannot store persistent state. - std::move(callback).Run(mojom::blink::QuotaStatusCode::kErrorAbort, 0, 0); + std::move(callback).Run(mojom::blink::QuotaStatusCode::kErrorAbort, 0, 0, + nullptr); return; } // StorageType::kPersistent is deprecated as of crbug.com/1233525. - // Therefore all requests are for StorageType::kTemporary. + // Therefore requesting quota is no longer supported. To keep existing + // behavior, return the min of requested quota and total quota for the + // StorageKey. GetQuotaHost(execution_context) - ->RequestStorageQuota( - StorageType::kTemporary, new_quota_in_bytes, - mojo::WrapCallbackWithDefaultInvokeIfNotRun( - std::move(callback), mojom::blink::QuotaStatusCode::kErrorAbort, - 0, 0)); + ->QueryStorageUsageAndQuota(mojo::WrapCallbackWithDefaultInvokeIfNotRun( + std::move(callback), mojom::blink::QuotaStatusCode::kErrorAbort, 0, 0, + nullptr)); } void DeprecatedStorageQuota::Trace(Visitor* visitor) const {
diff --git a/third_party/blink/renderer/modules/quota/storage_manager.cc b/third_party/blink/renderer/modules/quota/storage_manager.cc index 1346f82e..2a873ae 100644 --- a/third_party/blink/renderer/modules/quota/storage_manager.cc +++ b/third_party/blink/renderer/modules/quota/storage_manager.cc
@@ -156,11 +156,9 @@ auto callback = resolver->WrapCallbackInScriptScope( WTF::BindOnce(&QueryStorageUsageAndQuotaCallback)); GetQuotaHost(execution_context) - ->QueryStorageUsageAndQuota( - mojom::blink::StorageType::kTemporary, - mojo::WrapCallbackWithDefaultInvokeIfNotRun( - std::move(callback), mojom::blink::QuotaStatusCode::kErrorAbort, - 0, 0, nullptr)); + ->QueryStorageUsageAndQuota(mojo::WrapCallbackWithDefaultInvokeIfNotRun( + std::move(callback), mojom::blink::QuotaStatusCode::kErrorAbort, 0, 0, + nullptr)); return promise; }
diff --git a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc index 35240933..3dcf7e30 100644 --- a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc +++ b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc
@@ -116,6 +116,7 @@ .WithURL(window->Url()) .WithTypeFrom("text/html") .WithExecutionContext(window) + .WithAgent(*window->GetAgent()) .CreateDocument(); Element* element = inert_document->CreateElementForBinding( AtomicString(local_name), exception_state);
diff --git a/third_party/blink/renderer/platform/graphics/color.cc b/third_party/blink/renderer/platform/graphics/color.cc index 177c9a75..e5be957 100644 --- a/third_party/blink/renderer/platform/graphics/color.cc +++ b/third_party/blink/renderer/platform/graphics/color.cc
@@ -821,4 +821,91 @@ return ColorInterpolationSpace::kOKLab; } +void Color::MultiplyAlpha(float alpha_multiplier) { + alpha_ *= alpha_multiplier; +} + +Color Color::InterpolateColors( + const Color& color1, + const Color& color2, + float mix_amount, + Color::ColorInterpolationSpace color_interpolation_space, + Color::HueInterpolationMethod hue_interpolation_method) { + // TODO(crbug.com/1362022): Can only do this if the color_interpolation_space + // matches. + if (mix_amount == 0.0f) + return color2; + if (mix_amount == 1.0f) + return color1; + + // TODO(crbug.com/1362022): We need to actually interpolate colors. + return Color::kDarkGray; +} + +String Color::ColorInterpolationSpaceToString( + Color::ColorInterpolationSpace color_space, + Color::HueInterpolationMethod hue_interpolation_method) { + StringBuilder result; + switch (color_space) { + case Color::ColorInterpolationSpace::kLab: + result.Append("lab"); + break; + case Color::ColorInterpolationSpace::kLCH: + result.Append("lch"); + break; + case Color::ColorInterpolationSpace::kOKLab: + result.Append("oklab"); + break; + case Color::ColorInterpolationSpace::kOKLCH: + result.Append("oklch"); + break; + case Color::ColorInterpolationSpace::kSRGBLinear: + result.Append("srgb-linear"); + break; + case Color::ColorInterpolationSpace::kSRGB: + result.Append("srgb"); + break; + case Color::ColorInterpolationSpace::kXYZD65: + result.Append("xyz-d65"); + break; + case Color::ColorInterpolationSpace::kXYZD50: + result.Append("xyz-d50"); + break; + case Color::ColorInterpolationSpace::kHSL: + result.Append("hsl"); + break; + case Color::ColorInterpolationSpace::kHWB: + result.Append("hwb"); + break; + case Color::ColorInterpolationSpace::kNone: + NOTREACHED(); + break; + } + + if (color_space == Color::ColorInterpolationSpace::kLCH || + color_space == Color::ColorInterpolationSpace::kOKLCH || + color_space == Color::ColorInterpolationSpace::kHSL || + color_space == Color::ColorInterpolationSpace::kHWB) { + switch (hue_interpolation_method) { + case Color::HueInterpolationMethod::kDecreasing: + result.Append(" decreasing hue"); + break; + case Color::HueInterpolationMethod::kIncreasing: + result.Append(" increasing hue"); + break; + case Color::HueInterpolationMethod::kLonger: + result.Append(" longer hue"); + break; + case Color::HueInterpolationMethod::kSpecified: + result.Append(" specified hue"); + break; + // Shorter is the default value and does not get serialized + case Color::HueInterpolationMethod::kShorter: + break; + } + } + + return result.ReleaseString(); +} + } // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/color.h b/third_party/blink/renderer/platform/graphics/color.h index 59a2f84..1c156531 100644 --- a/third_party/blink/renderer/platform/graphics/color.h +++ b/third_party/blink/renderer/platform/graphics/color.h
@@ -245,6 +245,22 @@ kDecreasing, kSpecified, }; + // For appending color interpolation spaces to the serialization of gradients + // and color-mix functions. + static String ColorInterpolationSpaceToString( + Color::ColorInterpolationSpace color_space, + Color::HueInterpolationMethod hue_interpolation_method); + + // TODO(crbug.com/1362022): This is just a stub right now. + static Color InterpolateColors( + const Color& color1, + const Color& color2, + float mix_amount, + Color::ColorInterpolationSpace color_interpolation_space, + Color::HueInterpolationMethod hue_interpolation_method = + Color::HueInterpolationMethod::kShorter); + + void MultiplyAlpha(float alpha_multiplier); private: constexpr explicit Color(RGBA32 color)
diff --git a/third_party/blink/renderer/platform/media/web_media_player_impl.cc b/third_party/blink/renderer/platform/media/web_media_player_impl.cc index 791da6c..39f28af 100644 --- a/third_party/blink/renderer/platform/media/web_media_player_impl.cc +++ b/third_party/blink/renderer/platform/media/web_media_player_impl.cc
@@ -129,10 +129,6 @@ return base::FeatureList::IsEnabled(media::kResumeBackgroundVideo); } -bool IsBackgroundVideoPauseOptimizationEnabled() { - return base::FeatureList::IsEnabled(media::kBackgroundVideoPauseOptimization); -} - bool IsNetworkStateError(WebMediaPlayer::NetworkState state) { bool result = state == WebMediaPlayer::kNetworkStateFormatError || state == WebMediaPlayer::kNetworkStateNetworkError || @@ -451,6 +447,8 @@ is_background_video_playback_enabled), is_background_video_track_optimization_supported_( is_background_video_track_optimization_supported), + should_pause_background_muted_audio_( + base::FeatureList::IsEnabled(media::kPauseBackgroundMutedAudio)), simple_watch_timer_( base::BindRepeating(&WebMediaPlayerImpl::OnSimpleWatchTimerTick, base::Unretained(this)), @@ -1148,6 +1146,15 @@ pipeline_metadata_.video_decoder_config.codec(), content_type); delegate_->DidMediaMetadataChange(delegate_id_, delegate_has_audio_, HasVideo(), content_type); + + // If we paused a background video since it was muted, the volume change + // should resume the playback. + if (paused_when_hidden_) { + paused_when_hidden_ = false; + // Calls UpdatePlayState() so return afterwards. + client_->ResumePlayback(); + return; + } } // The play state is updated because the player might have left the autoplay @@ -3626,82 +3633,68 @@ } bool WebMediaPlayerImpl::ShouldPausePlaybackWhenHidden() const { + DCHECK(main_task_runner_->BelongsToCurrentThread()); + + const bool preserve_audio = + should_pause_background_muted_audio_ + ? HasUnmutedAudio() || audio_source_provider_->IsAudioBeingCaptured() + : HasAudio(); + // Audio only stream is allowed to play when in background. - // TODO: We should check IsBackgroundOptimizationCandidate here. But we need - // to move the logic of checking video frames out of that function. - if (!HasVideo()) + if (!HasVideo() && preserve_audio) return false; + // MediaPlayer always signals audio and video, so use an empty natural size to + // determine if there's really video or not. if (using_media_player_renderer_ && - pipeline_metadata_.natural_size.IsEmpty()) { + pipeline_metadata_.natural_size.IsEmpty() && preserve_audio) { return false; } -#if BUILDFLAG(IS_ANDROID) - if (IsInPictureInPicture()) + // PiP is the only exception when background video playback is disabled. + if (HasVideo() && IsInPictureInPicture()) return false; -#endif + // This takes precedent over every restriction except PiP. if (!is_background_video_playback_enabled_) return true; - // If suspending background video, pause any video that's not remoted or - // not unlocked to play in the background. - if (IsBackgroundSuspendEnabled(this)) { -#if BUILDFLAG(IS_ANDROID) - if (is_flinging_) - return false; -#endif + if (is_flinging_) + return false; - return !HasAudio() || (IsResumeBackgroundVideosEnabled() && - video_locked_when_paused_when_hidden_); + // If suspending background video, pause any video that's not unlocked to play + // in the background. + if (IsBackgroundSuspendEnabled(this)) { + return !preserve_audio || (IsResumeBackgroundVideosEnabled() && + video_locked_when_paused_when_hidden_); } - // Otherwise only pause if the optimization is on and it's a video-only - // optimization candidate. - return IsBackgroundVideoPauseOptimizationEnabled() && !HasAudio() && - IsBackgroundOptimizationCandidate() && !is_flinging_; + if (HasVideo() && IsVideoBeingCaptured()) + return false; + + return !preserve_audio; } bool WebMediaPlayerImpl::ShouldDisableVideoWhenHidden() const { - // This optimization is behind the flag on all platforms, only for non-mse - // video. MSE video track switching on hide has gone through a field test. - // TODO(tmathmeyer): Passing load_type_ won't be needed after src= field - // testing is finished. see: http://crbug.com/709302 + DCHECK(main_task_runner_->BelongsToCurrentThread()); + if (!is_background_video_track_optimization_supported_) return false; - // Disable video track only for players with audio that match the criteria for - // being optimized. - return HasAudio() && IsBackgroundOptimizationCandidate(); -} - -bool WebMediaPlayerImpl::IsBackgroundOptimizationCandidate() const { - DCHECK(main_task_runner_->BelongsToCurrentThread()); - - // Don't optimize Picture-in-Picture players. - if (IsInPictureInPicture()) + // Only disable the video track on audio + video playbacks, otherwise they + // should be paused or left alone. + if (!HasVideo() || !HasAudio()) return false; -#if BUILDFLAG(IS_ANDROID) - // Don't optimize videos casted as part of RemotePlayback. - if (is_flinging_) - return false; -#endif - - // Don't optimize audio-only or streaming players. - if (!HasVideo() || IsStreaming()) + // Disabling tracks causes seeks which can cause problematic network delays + // on streaming resources. + if (IsStreaming()) return false; - // If frames are being captured, don't disable the track or pause the video. - if (IsVideoBeingCaptured()) + // In these cases something external needs the frames. + if (IsInPictureInPicture() || IsVideoBeingCaptured() || is_flinging_) return false; - // Video-only players are always optimized (paused). - // Don't check the keyframe distance and duration. - if (!HasAudio() && HasVideo()) - return true; - // Videos shorter than the maximum allowed keyframe distance can be optimized. base::TimeDelta duration = GetPipelineMediaDuration(); @@ -3719,6 +3712,8 @@ void WebMediaPlayerImpl::UpdateBackgroundVideoOptimizationState() { if (IsHidden()) { if (ShouldPausePlaybackWhenHidden()) { + update_background_status_cb_.Cancel(); + is_background_status_change_cancelled_ = true; PauseVideoIfNeeded(); } else if (is_background_status_change_cancelled_) { // Only trigger updates when we don't have one already scheduled.
diff --git a/third_party/blink/renderer/platform/media/web_media_player_impl.h b/third_party/blink/renderer/platform/media/web_media_player_impl.h index 86e80ef59..64f1c2b 100644 --- a/third_party/blink/renderer/platform/media/web_media_player_impl.h +++ b/third_party/blink/renderer/platform/media/web_media_player_impl.h
@@ -538,13 +538,6 @@ // pipeline's state. bool ShouldDisableVideoWhenHidden() const; - // Whether the video is suitable for background playback optimizations (either - // pausing it or disabling the video track). Uses metadata so has meaning only - // after the pipeline has started, otherwise returns false. - // The logical OR between the two methods above that is also used as their - // common implementation. - bool IsBackgroundOptimizationCandidate() const; - // If enabling or disabling background video optimization has been delayed, // because of the pipeline not running, seeking or resuming, this method // needs to be called to update the optimization state. @@ -1060,6 +1053,8 @@ // Whether background video optimization is supported on current platform. bool is_background_video_track_optimization_supported_ = true; + const bool should_pause_background_muted_audio_; + bool was_suspended_for_frame_closed_ = false; base::CancelableOnceClosure have_enough_after_lazy_load_cb_;
diff --git a/third_party/blink/renderer/platform/media/webaudiosourceprovider_impl.cc b/third_party/blink/renderer/platform/media/webaudiosourceprovider_impl.cc index a6d838ce..c059f070 100644 --- a/third_party/blink/renderer/platform/media/webaudiosourceprovider_impl.cc +++ b/third_party/blink/renderer/platform/media/webaudiosourceprovider_impl.cc
@@ -116,10 +116,7 @@ scoped_refptr<media::SwitchableAudioRendererSink> sink, media::MediaLog* media_log, base::OnceClosure on_set_client_callback /* = base::OnceClosure()*/) - : volume_(1.0), - state_(kStopped), - client_(nullptr), - sink_(std::move(sink)), + : sink_(std::move(sink)), tee_filter_(new TeeFilter()), media_log_(media_log), on_set_client_callback_(std::move(on_set_client_callback)) {} @@ -330,10 +327,12 @@ void WebAudioSourceProviderImpl::SetCopyAudioCallback(CopyAudioCB callback) { DCHECK(!callback.is_null()); tee_filter_->SetCopyAudioCallback(std::move(callback)); + has_copy_audio_callback_ = true; } void WebAudioSourceProviderImpl::ClearCopyAudioCallback() { tee_filter_->SetCopyAudioCallback(CopyAudioCB()); + has_copy_audio_callback_ = false; } int WebAudioSourceProviderImpl::RenderForTesting(media::AudioBus* audio_bus) { @@ -341,6 +340,10 @@ audio_bus); } +bool WebAudioSourceProviderImpl::IsAudioBeingCaptured() const { + return has_copy_audio_callback_ || client_; +} + void WebAudioSourceProviderImpl::OnSetFormat() { base::AutoLock auto_lock(sink_lock_); if (!client_)
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 480e6923..c0ccf66 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -541,6 +541,10 @@ status: {"Android": "", "default": "experimental"}, }, { + name: "ConfirmationOfAction", + status: "test", + }, + { name: "ConsolidatedMovementXY", public: true, },
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/agent_group_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/agent_group_scheduler_impl.cc index d15ada9..d1ff580 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/agent_group_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/agent_group_scheduler_impl.cc
@@ -128,7 +128,8 @@ } void AgentGroupSchedulerImpl::PerformMicrotaskCheckpoint() { - for (Agent* agent : *agents_) { + HeapHashSet<WeakMember<Agent>> agents(*agents_); + for (Agent* agent : agents) { agent->PerformMicrotaskCheckpoint(); } }
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc index a43e1b8..df740e7 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
@@ -1117,8 +1117,10 @@ // does not have that concept yet. // TODO(dtapuska): Move this to EndAgentGroupSchedulerScope so that we only // run the microtask checkpoint for a given AgentGroupScheduler. + WTF::HashSet<AgentGroupSchedulerImpl*> agent_group_schedulers( + main_thread_only().agent_group_schedulers); for (AgentGroupSchedulerImpl* agent_group_scheduler : - main_thread_only().agent_group_schedulers) { + agent_group_schedulers) { agent_group_scheduler->PerformMicrotaskCheckpoint(); } }
diff --git a/third_party/blink/renderer/platform/widget/input/input_handler_proxy.cc b/third_party/blink/renderer/platform/widget/input/input_handler_proxy.cc index 1e181c4..d232b3d0 100644 --- a/third_party/blink/renderer/platform/widget/input/input_handler_proxy.cc +++ b/third_party/blink/renderer/platform/widget/input/input_handler_proxy.cc
@@ -272,7 +272,7 @@ input_handler_->NotifyInputEvent(); int64_t trace_id = event->latency_info().trace_id(); - TRACE_EVENT("input,benchmark", "LatencyInfo.Flow", + TRACE_EVENT("input,benchmark,latencyInfo", "LatencyInfo.Flow", [trace_id](perfetto::EventContext ctx) { ChromeLatencyInfo* info = ctx.event()->set_chrome_latency_info();
diff --git a/third_party/blink/renderer/platform/widget/input/widget_base_input_handler.cc b/third_party/blink/renderer/platform/widget/input/widget_base_input_handler.cc index ffb5560..50467e7 100644 --- a/third_party/blink/renderer/platform/widget/input/widget_base_input_handler.cc +++ b/third_party/blink/renderer/platform/widget/input/widget_base_input_handler.cc
@@ -320,7 +320,7 @@ "WidgetBaseInputHandler::OnHandleInputEvent", "event", WebInputEvent::GetName(input_event.GetType())); int64_t trace_id = coalesced_event.latency_info().trace_id(); - TRACE_EVENT("input,benchmark", "LatencyInfo.Flow", + TRACE_EVENT("input,benchmark,latencyInfo", "LatencyInfo.Flow", [trace_id](perfetto::EventContext ctx) { ChromeLatencyInfo* info = ctx.event()->set_chrome_latency_info();
diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py index 51a58a4a..2938847 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py +++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py
@@ -158,6 +158,11 @@ 'due to excessive unexpected failures:') for builder in sorted(interrupted_builders): _log.warning(' %s', builder) + _log.warning('Please consider retry the failed builders or ' + 'give the builders more shards. See ' + 'https://chromium.googlesource.com/chromium/src/+/' + 'HEAD/docs/testing/web_test_expectations.md' + '#rebaselining-using-try-jobs') incomplete_builders = builders_without_results | interrupted_builders if options.fill_missing is None and incomplete_builders:
diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py index affedd1..5f6b0509 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py +++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py
@@ -808,6 +808,11 @@ 'WARNING: Some shards may have timed out or exited early due to ' 'excessive unexpected failures:\n', 'WARNING: MOCK Try Win\n', + 'WARNING: Please consider retry the failed builders or ' + 'give the builders more shards. See ' + 'https://chromium.googlesource.com/chromium/src/+/' + 'HEAD/docs/testing/web_test_expectations.md' + '#rebaselining-using-try-jobs\n', 'INFO: Would you like to continue?\n', 'INFO: Would you like to try to fill in missing results ' 'with available results?\n'
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng index 8faba47..eb3786a 100644 --- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng +++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -11,6 +11,7 @@ # Tests that fail in legacy but pass in NG # ====== New tests from wpt-importer added here ====== +crbug.com/626703 external/wpt/editing/crashtests/inserthorizontalrule-in-textarea-in-editor-and-undo-on-error-events.html [ Timeout ] crbug.com/626703 external/wpt/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-traversal-same-document-traversal-hashchange.html [ Timeout ] crbug.com/626703 external/wpt/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-traversal-same-document-traversal-pushstate.html [ Timeout ] crbug.com/626703 external/wpt/screen-orientation/non-fully-active.html [ Timeout ]
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials b/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials index 2c1646c..e827b7be 100644 --- a/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials +++ b/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials
@@ -53,6 +53,7 @@ crbug.com/1209233 external/wpt/html/cross-origin-opener-policy/reporting/navigation-reporting/reporting-redirect-with-same-origin-allow-popups.https.html [ Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 external/wpt/editing/crashtests/inserthorizontalrule-in-textarea-in-editor-and-undo-on-error-events.html [ Timeout ] crbug.com/626703 external/wpt/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-traversal-same-document-traversal-hashchange.html [ Timeout ] crbug.com/626703 external/wpt/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-traversal-same-document-traversal-pushstate.html [ Timeout ] crbug.com/626703 external/wpt/screen-orientation/non-fully-active.html [ Timeout ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 6eb7336..3870d95 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -3332,6 +3332,27 @@ crbug.com/626703 [ Win ] virtual/partitioned-cookies/http/tests/inspector-protocol/network/disabled-cache-navigation.js [ Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 external/wpt/css/css-fonts/rlh-in-monospace.html [ Failure ] +crbug.com/626703 external/wpt/css/selectors/nth-child-and-nth-last-child.html [ Failure ] +crbug.com/626703 external/wpt/css/selectors/nth-child-of-classname.html [ Failure ] +crbug.com/626703 external/wpt/css/selectors/nth-child-of-complex-selector.html [ Failure ] +crbug.com/626703 external/wpt/css/selectors/nth-child-of-compound-selector.html [ Failure ] +crbug.com/626703 external/wpt/css/selectors/nth-child-of-tagname.html [ Failure ] +crbug.com/626703 external/wpt/css/selectors/nth-child-specificity-1.html [ Failure ] +crbug.com/626703 external/wpt/css/selectors/nth-child-specificity-2.html [ Failure ] +crbug.com/626703 external/wpt/css/selectors/nth-child-specificity-3.html [ Failure ] +crbug.com/626703 external/wpt/css/selectors/nth-child-specificity-4.html [ Failure ] +crbug.com/626703 external/wpt/css/selectors/nth-last-child-of-classname.html [ Failure ] +crbug.com/626703 external/wpt/css/selectors/nth-last-child-of-complex-selector.html [ Failure ] +crbug.com/626703 external/wpt/css/selectors/nth-last-child-of-compound-selector.html [ Failure ] +crbug.com/626703 external/wpt/css/selectors/nth-last-child-of-style-sharing-1.html [ Failure ] +crbug.com/626703 external/wpt/css/selectors/nth-last-child-of-style-sharing-2.html [ Failure ] +crbug.com/626703 external/wpt/css/selectors/nth-last-child-of-tagname.html [ Failure ] +crbug.com/626703 external/wpt/css/selectors/nth-last-child-specificity-1.html [ Failure ] +crbug.com/626703 external/wpt/css/selectors/nth-last-child-specificity-2.html [ Failure ] +crbug.com/626703 external/wpt/css/selectors/nth-last-child-specificity-3.html [ Failure ] +crbug.com/626703 external/wpt/css/selectors/nth-last-child-specificity-4.html [ Failure ] +crbug.com/626703 external/wpt/editing/crashtests/inserthorizontalrule-in-textarea-in-editor-and-undo-on-error-events.html [ Timeout ] crbug.com/626703 external/wpt/screen-orientation/non-fully-active.html [ Timeout ] crbug.com/626703 [ Mac ] external/wpt/screen-orientation/lock-basic.html [ Failure ] crbug.com/626703 [ Mac ] external/wpt/screen-orientation/lock-sandboxed-iframe.html [ Failure ]
diff --git a/third_party/blink/web_tests/accessibility/confirmation-of-action-entry-point.html b/third_party/blink/web_tests/accessibility/confirmation-of-action-entry-point.html new file mode 100644 index 0000000..af1eb587 --- /dev/null +++ b/third_party/blink/web_tests/accessibility/confirmation-of-action-entry-point.html
@@ -0,0 +1,21 @@ +<!DOCTYPE HTML> +<html> +<head> +<script src="../resources/testharness.js"></script> +<script src="../resources/testharnessreport.js"></script> +<script type="text/javascript" src="../resources/js-test.js"></script> +</head> +<body> + <div id="atomic"></div> + <script> + test(function() { + document.ariaNotify('hello'); + document.ariaNotify('hello', { 'insertion_mode': 'queue', 'label': 'doc' }); + assert_throws_js(TypeError, () => document.ariaNotify()); + document.getElementById('atomic').ariaNotify('hello'); + document.getElementById('atomic').ariaNotify('hello', { 'insertion_mode': 'queue', 'label': 'doc' }); + assert_throws_js(TypeError, () => document.getElementById('atomic').ariaNotify()); + }); + </script> +</body> +</html>
diff --git a/third_party/blink/web_tests/compositing/lots-of-img-layers-with-opacity-expected.png b/third_party/blink/web_tests/compositing/lots-of-img-layers-with-opacity-expected.png index c081fa9..94b0471 100644 --- a/third_party/blink/web_tests/compositing/lots-of-img-layers-with-opacity-expected.png +++ b/third_party/blink/web_tests/compositing/lots-of-img-layers-with-opacity-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/compositing/perpendicular-layer-sorting-expected.png b/third_party/blink/web_tests/compositing/perpendicular-layer-sorting-expected.png index 786ecac..179b13c0 100644 --- a/third_party/blink/web_tests/compositing/perpendicular-layer-sorting-expected.png +++ b/third_party/blink/web_tests/compositing/perpendicular-layer-sorting-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index 61c11b1..5887d347 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -312,6 +312,13 @@ } }, "compositing": { + "opacity-and-transform-animation-crash.html": [ + "294a823cd8ee0b7e5f289d2b623d59c7ceaa9f18", + [ + null, + {} + ] + ], "root-element-filter-background-clip-text-crash.html": [ "e12e4bb80f40e09e189f7f239486be246ea67ade", [ @@ -2520,6 +2527,13 @@ null, {} ] + ], + "scroll-tree-parent-construction.html": [ + "8a5bf54253810b8dfd65eb3b5d193ad54e7831bb", + [ + null, + {} + ] ] }, "nested-positions-crash.html": [ @@ -3386,13 +3400,6 @@ null, {} ] - ], - "wm-propagation-table-internals-crash.html": [ - "8f5798cf09d7f6e85337bce4d628025d6e14f4c4", - [ - null, - {} - ] ] }, "cssom": { @@ -3690,6 +3697,13 @@ {} ] ], + "delete-in-designMode-without-explicitly-setting-focus.html": [ + "16e1808dc864b4862de46e20800f994dd8d9301f", + [ + null, + {} + ] + ], "delete-in-empty-editable-list-followed-by-non-editable-listitem.html": [ "9e872f5ac47a1f6bda848dfe4b61efcf6679a966", [ @@ -3795,6 +3809,13 @@ {} ] ], + "inserthorizontalrule-in-textarea-in-editor-and-undo-on-error-events.html": [ + "204f75a89fb9506fb02bc591a5390856185424a8", + [ + null, + {} + ] + ], "inserthtml-after-temporarily-removing-document-element.html": [ "7245fe3ddcc44d2c2a1485131ced5bde5cc927e5", [ @@ -3949,6 +3970,13 @@ {} ] ], + "normalize_document_at_DOMSubtreeModified_during_insertparagraph.html": [ + "a8cbaf7217a942d2b5351a05e89e65f2db6ba657", + [ + null, + {} + ] + ], "outdent-across-svg-boundary.html": [ "f652a2e23720eb14d851178dc459f37e5167f28c", [ @@ -15988,6 +16016,19 @@ {} ] ], + "fixedpos-with-link-with-inline-child-print.html": [ + "694e5376cbfab7ee52c1f27b9bf0fd23a2a91375", + [ + null, + [ + [ + "/css/css-break/fixedpos-with-link-with-inline-child-print-ref.html", + "==" + ] + ], + {} + ] + ], "float-with-large-margin-bottom-cross-page-001-print.html": [ "cd1026faf6491703b23aca67678911a8f1f2b17c", [ @@ -86194,6 +86235,58 @@ ], {} ] + ], + "grid-item-oof-008.html": [ + "a8ef5622a3bd303bee0e29e7348bba70f65976ec", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "grid-item-oof-009.html": [ + "6b50367b160191b57b56530a78b23e2185cd2e02", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "grid-item-oof-010.html": [ + "9b12550e6b2b82c5465c18d837e8fac9420e36de", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "grid-item-oof-011.html": [ + "81bf627587fb736b6ae9e75f9e2246c73bffd889", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] ] }, "ink-overflow-002.html": [ @@ -99982,6 +100075,19 @@ {} ] ], + "content-visibility-with-top-layer-hide-after-addition.html": [ + "434e504f80a5a547405e58b799f988e1bd145e3b", + [ + null, + [ + [ + "/css/css-contain/content-visibility/container-ref.html", + "==" + ] + ], + {} + ] + ], "dynamic-change-paint-fully-obscuring-child-001.html": [ "781a11ca40a36b4ce5d99c6c0b665ee2ef4d4e2c", [ @@ -118046,6 +118152,19 @@ {} ] ], + "font-size-xxx-large.html": [ + "44a30688754442f24d60010ae8001e59c7781b3f", + [ + null, + [ + [ + "/css/css-fonts/font-size-xxx-large-ref.html", + "==" + ] + ], + {} + ] + ], "font-size-zero-1-ref.html": [ "b468121c67aa6ceb69c71cb41cb1a4b5b2b3308e", [ @@ -119450,19 +119569,6 @@ {} ] ], - "font-weight-xxx-large.html": [ - "327106668fdf7bc130112f3fee4968c21a1daea4", - [ - null, - [ - [ - "/css/css-fonts/font-weight-xxx-large-ref.html", - "==" - ] - ], - {} - ] - ], "line-gap-override.html": [ "487fb2ea59d91cc57715a44e33198fc6223c1d68", [ @@ -119718,6 +119824,19 @@ {} ] ], + "rlh-in-monospace.html": [ + "26a57a78a551bdfafc65a893acd1fa5116d678e7", + [ + null, + [ + [ + "/css/css-fonts/rlh-in-monospace-ref.html", + "==" + ] + ], + {} + ] + ], "size-adjust-01.html": [ "024a22097e182d6ffdbfd16dd9832e2fe35bb0b9", [ @@ -121766,6 +121885,19 @@ ] }, "alignment": { + "grid-align-baseline-005.html": [ + "c217a3b6de67bf78bd5d9f119ae1a31b0b73b939", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "grid-baseline-001.html": [ "ef8c0e4d3403f6aab952ae844d84490d7e569055", [ @@ -128466,6 +128598,19 @@ {} ] ], + "line-names-009.html": [ + "bd8a7768720bafe1484a81c11a51cf8ec7331994", + [ + null, + [ + [ + "/css/css-grid/subgrid/line-names-009-ref.html", + "==" + ] + ], + {} + ] + ], "orthogonal-writing-mode-001.html": [ "1cf99a73e2ef7b0e3fe42bbf8c188fa4d2733979", [ @@ -137768,7 +137913,7 @@ ] ], "clip-path-animation-fixed-position.html": [ - "9ef49b6efda96445b6b1440e5b74ea2243063e07", + "a9f278d8837068028097d3db103a3e6b19cf8c4a", [ null, [ @@ -137777,7 +137922,23 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 10 + ], + [ + 0, + 150 + ] + ] + ] + ] + } ] ], "clip-path-animation-fragmented.html": [ @@ -167655,6 +167816,19 @@ {} ] ], + "hyphenate-limit-chars-001.html": [ + "d9748121038c35b95ab92743c457878ff5d9f830", + [ + null, + [ + [ + "/css/css-text/hyphens/reference/hyphenate-limit-chars-001-ref.html", + "==" + ] + ], + {} + ] + ], "hyphens-auto-001.html": [ "e7ba16f7a4f09d849a51b0873cc4f20146952a28", [ @@ -186888,6 +187062,34 @@ ] ] }, + "css-toggle": { + "toggle-visibility-z-ordering-001.tentative.html": [ + "50f5d35f19296bcc2d47a6d8490d0d3ce0549466", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "toggle-visibility-z-ordering-002.tentative.html": [ + "cc1ecb2a9cf7bab8edfd1ec018c6bdbb765288ff", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ] + }, "css-transforms": { "2d-rotate-001.html": [ "b4d81a07501d5e3a9617de847bc5361c9829014b", @@ -232127,6 +232329,253 @@ {} ] ], + "nth-child-and-nth-last-child.html": [ + "455063f916013a47b7034dfff7b553fd8bb0f036", + [ + null, + [ + [ + "/css/selectors/nth-child-and-nth-last-child-ref.html", + "==" + ] + ], + {} + ] + ], + "nth-child-of-classname.html": [ + "8ec3f43f7f481e4f3c65d03f6dfd2e12f6f59961", + [ + null, + [ + [ + "/css/selectors/nth-child-of-classname-ref.html", + "==" + ] + ], + {} + ] + ], + "nth-child-of-complex-selector.html": [ + "b751d83de2228ccfe6ed25e53d80b34be76732b2", + [ + null, + [ + [ + "/css/selectors/nth-child-of-complex-selector-ref.html", + "==" + ] + ], + {} + ] + ], + "nth-child-of-compound-selector.html": [ + "5efefe6eadfedfe3b2c670a31a26d1268ddfb8eb", + [ + null, + [ + [ + "/css/selectors/nth-child-of-compound-selector-ref.html", + "==" + ] + ], + {} + ] + ], + "nth-child-of-tagname.html": [ + "107e834296f7b457afda9394fdbb7838e3591594", + [ + null, + [ + [ + "/css/selectors/nth-child-of-tagname-ref.html", + "==" + ] + ], + {} + ] + ], + "nth-child-specificity-1.html": [ + "d0b084a719daf95d8a94ad34e6d1c58c557a089f", + [ + null, + [ + [ + "/css/selectors/nth-child-specificity-1-ref.html", + "==" + ] + ], + {} + ] + ], + "nth-child-specificity-2.html": [ + "a467e5e056a2daceb5f0a814416334e1e1d53f39", + [ + null, + [ + [ + "/css/selectors/nth-child-specificity-2-ref.html", + "==" + ] + ], + {} + ] + ], + "nth-child-specificity-3.html": [ + "f9c23b27ca17105380cba780644cf2b933050f2b", + [ + null, + [ + [ + "/css/selectors/nth-child-specificity-3-ref.html", + "==" + ] + ], + {} + ] + ], + "nth-child-specificity-4.html": [ + "6286b01f7ea7f6932eb24431a769add3db075ca2", + [ + null, + [ + [ + "/css/selectors/nth-child-specificity-4-ref.html", + "==" + ] + ], + {} + ] + ], + "nth-last-child-of-classname.html": [ + "770fda381f0c5f27806c17cc2caec1b6d939c350", + [ + null, + [ + [ + "/css/selectors/nth-last-child-of-classname-ref.html", + "==" + ] + ], + {} + ] + ], + "nth-last-child-of-complex-selector.html": [ + "0f1262c746f7341c1e59dfdbb9866e753eb03bb4", + [ + null, + [ + [ + "/css/selectors/nth-last-child-of-complex-selector-ref.html", + "==" + ] + ], + {} + ] + ], + "nth-last-child-of-compound-selector.html": [ + "a7aa40f50a28e09a36481a2c565d9c75c66a0341", + [ + null, + [ + [ + "/css/selectors/nth-last-child-of-compound-selector-ref.html", + "==" + ] + ], + {} + ] + ], + "nth-last-child-of-style-sharing-1.html": [ + "de3e26325619a06406fca1db96e1a9fd38987739", + [ + null, + [ + [ + "/css/selectors/nth-last-child-of-style-sharing-1-ref.html", + "==" + ] + ], + {} + ] + ], + "nth-last-child-of-style-sharing-2.html": [ + "19fc9af414eb5e7745e333af9ab1eb9baeaf724d", + [ + null, + [ + [ + "/css/selectors/nth-last-child-of-style-sharing-2-ref.html", + "==" + ] + ], + {} + ] + ], + "nth-last-child-of-tagname.html": [ + "ddfd6528cc5c51d1e2afaea578473a947da769de", + [ + null, + [ + [ + "/css/selectors/nth-last-child-of-tagname-ref.html", + "==" + ] + ], + {} + ] + ], + "nth-last-child-specificity-1.html": [ + "cc4f542fff3ed8397a1c9f605a591f0964d022e1", + [ + null, + [ + [ + "/css/selectors/nth-last-child-specificity-1-ref.html", + "==" + ] + ], + {} + ] + ], + "nth-last-child-specificity-2.html": [ + "3ddb43b62bd65a53f86ad1e73bd32182196d3bf1", + [ + null, + [ + [ + "/css/selectors/nth-last-child-specificity-2-ref.html", + "==" + ] + ], + {} + ] + ], + "nth-last-child-specificity-3.html": [ + "673b4350443b50c1cd0d53683a32ffc722c54678", + [ + null, + [ + [ + "/css/selectors/nth-last-child-specificity-3-ref.html", + "==" + ] + ], + {} + ] + ], + "nth-last-child-specificity-4.html": [ + "b690ea2b01714bfb6ee042dcbac728f77005cc4e", + [ + null, + [ + [ + "/css/selectors/nth-last-child-specificity-4-ref.html", + "==" + ] + ], + {} + ] + ], "of-type-selectors.xhtml": [ "73ec208b8f219d8d3b74984d65c8e72a997c8470", [ @@ -232896,7 +233345,7 @@ ] ], "css3-modsel-156.xml": [ - "f52b98f86b3b59f1d285b8888109eb84ead8cbd8", + "4717fb8a39516afc094d7458c8cbc6a9f41ec2fd", [ null, [ @@ -232909,7 +233358,7 @@ ] ], "css3-modsel-156b.xml": [ - "2f8ed8831320284354b958dd0937eae539501b15", + "28a6c985bb9228c33830620c63aa8305b40e063c", [ null, [ @@ -232922,7 +233371,7 @@ ] ], "css3-modsel-156c.xml": [ - "3a15c82323af32839f076496d869e24db292526a", + "cb888e1eb0a4e83d331e2fe509652994c70ce80d", [ null, [ @@ -253487,7 +253936,7 @@ ] }, "web-identity": [ - "f3a99e2f397f567096fb02bc73ea16e3c1bfca6a", + "836d87b73259ed39da1ce4ded371ee11b72fbc3a", [] ] }, @@ -253501,6 +253950,10 @@ ], "FileAPI": { "BlobURL": { + "cross-partition.tentative.https-expected.txt": [ + "baf1499f392564b77983a515b960d6849445989e", + [] + ], "support": { "file_test2.txt": [ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", @@ -256707,7 +257160,7 @@ [] ], "idlharness.https.window-expected.txt": [ - "4d3c7af3fdf238963230cab091a83c6ecdbe03b3", + "a4567ee7d274bd5efbf52f6d6e23170363721462", [] ], "resources": { @@ -256837,7 +257290,7 @@ [] ], "OWNERS": [ - "06ebddaa1d6ccd22ba2dedea7f2a46a6d9ca5718", + "1245fcd46148cb0aa2d7ba6dabdc51ee6c066213", [] ], "README.css": [ @@ -258983,7 +259436,7 @@ [] ], "OWNERS": [ - "3f8456354bd08a3cb87e767ca0eb508603f45f1b", + "24eebbdf6f5547a1c45be04bb52d5365f8ff325d", [] ], "README.md": [ @@ -259366,15 +259819,15 @@ ], "support": { "README.md": [ - "902a7caeebf3a2a8bca0e63ccb6ca257356f35f0", + "6fb064c42fa924fce037ea96b95912d0f9d26c7e", [] ], "accounts.py": [ - "e9828cfbb103c4873120fe59a9c0a10aee69e526", + "f645dfda4c764e5f81c61151ce32df051e96c041", [] ], "client_metadata.py": [ - "e9ae7221fb04211d81262e3a65e833c49c682bc7", + "f08b285259ef2acc26a1a1ae330dcb2ff4c87481", [] ], "echoing-nester.html": [ @@ -259408,7 +259861,7 @@ [] ], "fedcm-mojojs-helper.js": [ - "428a2fc847708377594817cb01d7a009cc43a35c", + "40ab729b1f9555f751611e845fac6360d0cbdd30", [] ], "fedcm.json": [ @@ -259440,7 +259893,7 @@ [] ], "token.py": [ - "1ce4348500cb1c7b4c66ca58ff6cab787c6fef98", + "2f5e807b6e0d344a761ecca4784684047c2ec777", [] ] } @@ -267162,18 +267615,34 @@ "e482c099c88b85d9041cd272c0463bf823370c12", [] ], + "parse-align-content-001.html.ini": [ + "5561dbc04e3435f9f23b400fab25054ffc90b8ee", + [] + ], "parse-align-content-003-expected.txt": [ "0506093f17c06f2dd3d89aece4e435b8e4fb67fb", [] ], + "parse-align-content-003.html.ini": [ + "84cd2b668041c706da5ccf901deb560064c6d03a", + [] + ], "place-content-shorthand-002-expected.txt": [ "099e47fdf5da3da0c5b5a3173884809768dabab2", [] ], + "place-content-shorthand-002.html.ini": [ + "62f9bcd7072a64623d9821db8d91c89a73646a56", + [] + ], "place-content-shorthand-006-expected.txt": [ "a8b0aef0c92a906d96761df9a95a42115bd187d3", [] ], + "place-content-shorthand-006.html.ini": [ + "1fe7b562d0d51c9070c57a6e31c3fff66ec508bf", + [] + ], "place-content-shorthand-007-ref.html": [ "67727f4fd26fb9e9e531f2f10ab745030fdcca05", [] @@ -267183,26 +267652,50 @@ "4252a3d642fb25adcb32c55b90635c5ef7822e90", [] ], + "inheritance.html.ini": [ + "40fa0307c8f5d8bbe9726fd2c1f3810b97aba34a", + [] + ], "parsing": { "align-content-computed-expected.txt": [ "10c90ab827c410e70d1608ddf58c07c3f5db3119", [] ], + "align-content-computed.html.ini": [ + "95b3cfd5f64a4c6e57295e189551fae87db71e20", + [] + ], "align-content-valid-expected.txt": [ "b53e2fba70186baffd0153cf8a152d188320a577", [] ], + "align-content-valid.html.ini": [ + "785880543878eebbb3db60db0488c693cba51fa7", + [] + ], "place-content-computed-expected.txt": [ "64ce3d07542a3a2802e13b5ee84c4bc851d7a33d", [] ], + "place-content-computed.html.ini": [ + "ea69725b408986f07b7180c4a8493096cd61480b", + [] + ], "place-content-shorthand-expected.txt": [ "081e3ae2517d2b597e7d563ee1bef8adb4981bc3", [] ], + "place-content-shorthand.html.ini": [ + "aa952acf797565d3af655c720c5de71d3ddd8d90", + [] + ], "place-content-valid-expected.txt": [ "a2749370f4164513acdd37bf1f5694da86d33d59", [] + ], + "place-content-valid.html.ini": [ + "e7c0b6f0634607c1198bd51298823ade1ced1d75", + [] ] }, "reference": { @@ -267230,14 +267723,26 @@ "69d7f347087d7a298090a76762714268aa11930a", [] ], + "self-align-safe-unsafe-flex-001.html.ini": [ + "3caf510d9e44d129da897e01f9c56e630de6ce58", + [] + ], "self-align-safe-unsafe-flex-002-ref.html": [ "92893d25da4e295b2073f62b6041ed2a215ca948", [] ], + "self-align-safe-unsafe-flex-002.html.ini": [ + "722b70a38212463ba394d494f72f026edfdd332e", + [] + ], "self-align-safe-unsafe-flex-003-ref.html": [ "279ec4bb0bff78a4abee9873f80c90cc5e96e169", [] ], + "self-align-safe-unsafe-flex-003.html.ini": [ + "5abadcfb746e6e872beb068c7f9c85920bbb3dcc", + [] + ], "self-align-safe-unsafe-grid-001-ref.html": [ "f644611795c729d5a507b600cc647b67e2bb44a6", [] @@ -269423,6 +269928,10 @@ "5c96f31a6ba193f6d86c7a66267581edd65260d2", [] ], + "fixedpos-with-link-with-inline-child-print-ref.html": [ + "f12d31acd9d077a24a4ba47bcdbb5b2a3029faf3", + [] + ], "flexbox": { "flex-fragmented-with-float-descendant-001-ref.html": [ "ead53ad704a08d06a2e88ed5e43b9bcaf55aa584", @@ -269885,7 +270394,7 @@ ], "animation": { "color-interpolation-expected.txt": [ - "7801d1906158665ebf895b3349f793f8c12b6737", + "224b3f8ba137295839a8b74e77ed74617464d171", [] ], "opacity-animation-ending-correctly-001-ref.html": [ @@ -270106,10 +270615,6 @@ [] ], "parsing": { - "color-computed-color-contrast-function-expected.txt": [ - "228a9e00715b2af16ca7000d957c5e7a270b845c", - [] - ], "color-computed-color-function-expected.txt": [ "8fc9beb50d8aaa0b95b16dec4349bcd098b9f855", [] @@ -270118,22 +270623,10 @@ "78784ba8f0b7df1d8d5f3cf2baae1e09bc2d453c", [] ], - "color-computed-lab-expected.txt": [ - "ca6b4000611a185f5b7c2de2ccfa3b107f258ee6", - [] - ], "color-computed-relative-color-expected.txt": [ "be289abfb3387cff3a93d7db69c738910fcc6a3f", [] ], - "color-contrast-computed-expected.txt": [ - "228a9e00715b2af16ca7000d957c5e7a270b845c", - [] - ], - "color-contrast-valid-expected.txt": [ - "3f70ccb23e7b7cadeba953eb40b2fe74dc8d08a6", - [] - ], "color-mix-computed-expected.txt": [ "78784ba8f0b7df1d8d5f3cf2baae1e09bc2d453c", [] @@ -270142,18 +270635,10 @@ "7116c476434c367b981875c49d710341feb20110", [] ], - "color-valid-color-contrast-function-expected.txt": [ - "3f70ccb23e7b7cadeba953eb40b2fe74dc8d08a6", - [] - ], "color-valid-color-mix-function-expected.txt": [ "7116c476434c367b981875c49d710341feb20110", [] ], - "color-valid-lab-expected.txt": [ - "cab5fd128eff5880d7b0159cda2e5e4e5b6ca51b", - [] - ], "color-valid-relative-color-expected.txt": [ "5bf4e6a04c36ce0bdc421bb588d5e07dd14b92a4", [] @@ -275637,6 +276122,10 @@ "098fca5ea76ff3dd31633dc1c7c7166fa7cf076a", [] ], + "font-size-xxx-large-ref.html": [ + "0cc1184a83a8d87edbaf0648e664dc1d9e1f0932", + [] + ], "font-size-zero-1-notref.html": [ "c24e3d91eb952e04943275ad86ced57556440513", [] @@ -276013,10 +276502,6 @@ "2078c80e743b10f629601e5d6d5c2837df61a1dd", [] ], - "font-weight-xxx-large-ref.html": [ - "0cc1184a83a8d87edbaf0648e664dc1d9e1f0932", - [] - ], "generic-family-keywords-001-expected.txt": [ "cb3001cdbfe8fcd75806421e4e32518ad439a3cb", [] @@ -276187,6 +276672,10 @@ [] ] }, + "rlh-in-monospace-ref.html": [ + "e60a59d71916ebef84299552e6524cd823f12e29", + [] + ], "size-adjust-01-ref.html": [ "765201d3552d70163bac26bf698218e1b1312f16", [] @@ -284052,6 +284541,10 @@ "262fa548ec53e13f7ee8da2505a6951a18945622", [] ], + "line-names-009-ref.html": [ + "103a35968d6c955757b2944289eab34b0e899a36", + [] + ], "orthogonal-writing-mode-001-ref.html": [ "4f0f6f962e633d8e3c7ddd78acf0247bd96e7715", [] @@ -292573,6 +293066,10 @@ "50a0ebd58542055dd972c8f3816a168d91db76e7", [] ], + "hyphenate-limit-chars-001-ref.html": [ + "c491fbca27bb77a7de9651bae28a1b6d5aef65c8", + [] + ], "hyphens-auto-001-ref.html": [ "c1355d0abba28491a126533c24039cffc6ee4eb0", [] @@ -298728,7 +299225,7 @@ [] ], "text-transform-expected.txt": [ - "965a95e569ce27efdbad41a264c3927ec7dad065", + "63ddb1d1b5ef494d69ecb4d31c48d6544c91bc44", [] ], "transform-box-expected.txt": [ @@ -301047,6 +301544,22 @@ ] } }, + "available-size-003.html.ini": [ + "04214dc08a371331df0817fc5ec6cc4d1dcf77b3", + [] + ], + "available-size-005.html.ini": [ + "be1ab8b62ff391ae9e6e3f6930658cb3589f551e", + [] + ], + "available-size-013.html.ini": [ + "223729b8064f2d5949eef49052d81e7988777a5a", + [] + ], + "available-size-014.html.ini": [ + "ce213f410c58fca2be536b765c4cb0ff2d237786", + [] + ], "background-position-vrl-018-ref.xht": [ "bda2fb623ec06dfd14e51bbe2d110c41bd986a3b", [] @@ -301171,6 +301684,14 @@ "4371a0d87628093e23d794b33b868042d93b50a0", [] ], + "direction-upright-001.html.ini": [ + "7e8be49a8711a81e571d4ef626b6c6c7956d03d3", + [] + ], + "direction-upright-002.html.ini": [ + "f603d89e8123778f042a2383ebc1c2785d74ad94", + [] + ], "direction-vlr-003-ref.xht": [ "f01f983898249c97ced81cff69f54e4d9042eef5", [] @@ -301335,10 +301856,18 @@ "9fea986c94cfe899ed0db2b8139f1e796d87eeec", [] ], + "logical-physical-mapping-001.html.ini": [ + "7cfca9aa7f27e070d50100f60a48aa6f521f4b3e", + [] + ], "margin-vrl-002-ref.xht": [ "975664cede317ca72f1dc65c30b3b6e390384bc7", [] ], + "mongolian-orientation-001.html.ini": [ + "2cc002053b9699998ef208bbbf7b8ef649cca7aa", + [] + ], "ortho-htb-alongside-vrl-floats-002-ref.xht": [ "bd5b1c1391a83809e6118578cd38e62cc5cbb6a5", [] @@ -301391,6 +301920,10 @@ "f96daef5661e09b360ec008974f05600d480e5cb", [] ], + "padding-percent-orthogonal-dynamic.html.ini": [ + "6fd65e9e0b7ea968fcc5cacba2045ce4413d383f", + [] + ], "reference": { "available-size-001-ref.html": [ "d59cde45f6e3be71762ca4acf2711f8d3b0bc50e", @@ -302281,6 +302814,10 @@ "d41cd933936d5d4d7734561c2b1a283b65523cb5", [] ], + "sizing-orthog-vlr-in-htb-008.xht.ini": [ + "ffeaa2428e05a885869c2481a911450cd70b1097", + [] + ], "sizing-orthog-vlr-in-htb-009-ref.xht": [ "4f55d0fb093e338a2d0a8f0ccb62848bbd2a77d2", [] @@ -302321,6 +302858,10 @@ "603732b7af8fe2e84f7f383e2f5288e6dfbcd8b4", [] ], + "sizing-orthog-vlr-in-htb-020.xht.ini": [ + "b16eb0eff34ecb9c14dd649898d9521f138a7a92", + [] + ], "sizing-orthog-vlr-in-htb-022-ref.xht": [ "73b85e8d8c6179a8f2445ed5677768ab613bea52", [] @@ -302353,6 +302894,10 @@ "76fc0844c2887850b2f343173bd05cc762eb6c65", [] ], + "sizing-orthog-vrl-in-htb-008.xht.ini": [ + "240d3ff258c2fc487e41a8cfab4af34510593f0b", + [] + ], "sizing-orthog-vrl-in-htb-009-ref.xht": [ "5a4b529806355f4740dcea06eff4b1e926055a97", [] @@ -302393,6 +302938,10 @@ "12f5d4c413e1d8d5a0afb1e668f65d05564a3546", [] ], + "sizing-orthog-vrl-in-htb-020.xht.ini": [ + "f404fb54413be61d56f5e93494edd90d8df7005c", + [] + ], "sizing-orthog-vrl-in-htb-022-ref.xht": [ "8b4bcea3cd89fefafb58406a7a1ca0c13d051c4e", [] @@ -302433,10 +302982,18 @@ "5502ba7ef1720c327f34de5ffaa8f09dec1377c1", [] ], + "slr-alongside-vlr-floats.html.ini": [ + "9c809177846e5a4d5746eba80dd8444c6ee11f69", + [] + ], "srl-alongside-vrl-floats-ref.html": [ "6f7ac1686b591750bcf49f61ca45f79953e94cf6", [] ], + "srl-alongside-vrl-floats.html.ini": [ + "c7efce6f6b7292b98683a614d844abd09bd40274", + [] + ], "support": { "100x100-lime.png": [ "1b947700808585e8c224cee096247eb5d30a1ded", @@ -303059,6 +303616,22 @@ "37445460b878e7fe24290f6e80d7cac6a9cb31b4", [] ], + "table-progression-vlr-003.html.ini": [ + "1dbd0c62cf99412509fafdb80332836e76a96b72", + [] + ], + "table-progression-vlr-004.html.ini": [ + "ce406436eed5b59dcf40958cbe8c927601659b04", + [] + ], + "table-progression-vrl-003.html.ini": [ + "057fcb2dfcfc326d8e5ce3e3ababbbd5631d3859", + [] + ], + "table-progression-vrl-004.html.ini": [ + "3582aa846b2f4e4ef4c4f8e2d845ff31959a6e73", + [] + ], "test-plan": { "img": { "figure-over_and_under-fail.svg": [ @@ -303151,26 +303724,58 @@ "b1971474e5c1dccbdeee552087b8aa6cb41001c8", [] ], + "text-combine-upright-compression-001.html.ini": [ + "3643a65380c249a25116f1ebf03ff04afc5df653", + [] + ], "text-combine-upright-compression-002-ref.html": [ "dd05022c07ba2abae5b820ea09fe2f2e94714b13", [] ], + "text-combine-upright-compression-002.html.ini": [ + "1c6816a2b5d18c0d20c70a2d5feb347fd5690a51", + [] + ], "text-combine-upright-compression-003-ref.html": [ "6c6ea736fd194dafa78e1ac7352504019faca823", [] ], + "text-combine-upright-compression-003.html.ini": [ + "9f66977875ef439089c1fc152e327f7efba1120b", + [] + ], "text-combine-upright-compression-004-ref.html": [ "cb6aa00359d5096bc037cef34b6b7f596a9a6e6b", [] ], + "text-combine-upright-compression-004.html.ini": [ + "c0a87c3e5a0a8a8d025ea515be1bb78beb430667", + [] + ], "text-combine-upright-compression-005-ref.html": [ "a158be2647b4dda6d2529ad6c191a012ba5d2cf5", [] ], + "text-combine-upright-compression-005.html.ini": [ + "97ce1a8cad85d44ad28332c14ed6a2311350efc9", + [] + ], + "text-combine-upright-compression-005a.html.ini": [ + "b089a7dbd6ac531933a02185fd2089b12c7d1e81", + [] + ], "text-combine-upright-compression-006-ref.html": [ "8a083f6806fa3a36a2f81bbe32a34a2928d9601d", [] ], + "text-combine-upright-compression-006.html.ini": [ + "2198aee33160cfabe1bf57c2eb6f3def4824544e", + [] + ], + "text-combine-upright-compression-006a.html.ini": [ + "5ec8b8918db2ccfa4f7956d002bc21c57cd6358b", + [] + ], "text-combine-upright-compression-007-ref.html": [ "a0cba009aa5a3f5b3e397821a3228651af32390d", [] @@ -303179,6 +303784,18 @@ "e1b7b34b562c8c125c5a6b2dfa885f679ebf812c", [] ], + "text-combine-upright-value-all-001.html.ini": [ + "fa41ee88b2d9403acd0cb54cd1d52bf1e52c87ef", + [] + ], + "text-combine-upright-value-all-002.html.ini": [ + "bba3a24790f27968df8597209a5d0ecacb47fe2b", + [] + ], + "text-combine-upright-value-all-003.html.ini": [ + "4dfb332c52906c8495a78fb6e0ab38be7bda48da", + [] + ], "text-indent-vlr-003-ref.xht": [ "12473d5b17310b60423173165d4ae6ce7ee35bd2", [] @@ -303319,30 +303936,94 @@ "766c85701d0a5a0913a1d228508f982f402347ed", [] ], + "wm-propagation-body-034.html.ini": [ + "3f9d15af8ac5107e32038780ce7e9cf743bb7f38", + [] + ], "wm-propagation-body-035-ref.html": [ "c3fdba1b749ecff4f422b93e83e58449186fd48a", [] ], + "wm-propagation-body-035.html.ini": [ + "f1fd1746158b2d236826b9fe3660f4143dbf562f", + [] + ], + "wm-propagation-body-038.html.ini": [ + "3bcf05fce5408095e5996b0a020ed92174b4136f", + [] + ], + "wm-propagation-body-039.html.ini": [ + "ac94de4dd1a9ca1b3ae8c7286b8f37aa969e70d4", + [] + ], "wm-propagation-body-042-ref.html": [ "d86e926463caa7f07b7b0146f03fec991959454a", [] ], + "wm-propagation-body-042.html.ini": [ + "504189cf0dc1fea60bb8ae7e2c50b23b57b78a21", + [] + ], + "wm-propagation-body-043.html.ini": [ + "9d3d7891c5a763ad84a97aad24416ca253f5eca1", + [] + ], "wm-propagation-body-044-ref.html": [ "9cf46c0b214652ca0bd7f28fe88c7943f6ccef8c", [] ], + "wm-propagation-body-046.html.ini": [ + "5e129bfd575b21c6fb103f72558ac9f5ca6101d3", + [] + ], "wm-propagation-body-047-ref.html": [ "80e95b35befc6de6d51a603c4ad5bc0ee4467703", [] ], + "wm-propagation-body-047.html.ini": [ + "04f054a546e6ba1bfcda4ae26ead714cf42357c2", + [] + ], + "wm-propagation-body-048.html.ini": [ + "02c43f51de14bdf9d21690f471923d704030a28f", + [] + ], "wm-propagation-body-049-ref.html": [ "fb5f2a3c4790733404e884ebe3562ef6e7002033", [] ], + "wm-propagation-body-049.html.ini": [ + "7e961b08d65bc76aa54ab93d807b090ab989e617", + [] + ], + "wm-propagation-body-050.html.ini": [ + "f8b2d8f441e8015f8c867b4fbcd21a787846e34b", + [] + ], + "wm-propagation-body-051.html.ini": [ + "344e4903ac4f585f365160fe37c023f12823d133", + [] + ], + "wm-propagation-body-052.html.ini": [ + "edb6fb7f4d8a7abe28337b054ddc461ed20e8b5d", + [] + ], + "wm-propagation-body-053.html.ini": [ + "6c5be36f73639268f5bdfa669b2277adb1f5ca60", + [] + ], "wm-propagation-body-054-ref.html": [ "1e6f6343b3c59e3654ef96037c92a89233cf3798", [] ], + "wm-propagation-body-054.html.ini": [ + "dd7a8a097d032ea2749b44f96ffdbd6e7b1b822d", + [] + ], + "wm-propagation-body-055.html.ini": [ + "e1baf0fac534d80fbd1de934cc87c7d273c9d543", + [] + ], "wm-propagation-body-contain-root-ref.html": [ "150eba8bc932dfa079509cb422a4212a7a141238", [] @@ -303355,6 +304036,10 @@ "30e72f0df706a62c8e0ad97327ff1a625af731d6", [] ], + "wm-propagation-body-scroll-offset-vertical-rl.html.ini": [ + "0e9114c6a6ec88969b55472d110a57ddacc036d5", + [] + ], "writing-mode-initial-ref.html": [ "6f7b84fa72ad042924dedba39503ed6ea40bbd20", [] @@ -303418,7 +304103,7 @@ [] ], "getComputedStyle-detached-subtree-expected.txt": [ - "ed6c7d939646d3a05c5bc0ef6709db1ac9bfe163", + "c4f7f27af8a36d9d548cd2cd1b844576c0ffb559", [] ], "getComputedStyle-insets-absolute-expected.txt": [ @@ -303430,7 +304115,7 @@ [] ], "getComputedStyle-pseudo-expected.txt": [ - "0fe62f5a2609fbf74cc72e3161e61810d20341af", + "b55571e7eb0c0b52bee0e50ecf234b108dfe69c3", [] ], "getComputedStyle-width-scroll.tentative-expected.txt": [ @@ -304873,18 +305558,42 @@ "63c0a2ea883b4e026c9f336a0fff75045514cd82", [] ], + "offset-path-ray-002.html.ini": [ + "0dc1929e3a51fe3eadd0276be189c778d007f978", + [] + ], "offset-path-ray-003-ref.html": [ "7261167cd7f0d66153eb97398b9d43d8ff7d9a3f", [] ], + "offset-path-ray-003.html.ini": [ + "6e6b6c0023a1082efc488421c9114f93b97305d7", + [] + ], + "offset-path-ray-004.html.ini": [ + "c5c4730e9340f8a3e63ec115cd7d3dca24994c55", + [] + ], "offset-path-ray-005-ref.html": [ "525d747053c1e460c3d1e3b8aead48e823594999", [] ], + "offset-path-ray-005.html.ini": [ + "576f2b68686a7ef35101a52715514a3d785755c1", + [] + ], + "offset-path-ray-006.html.ini": [ + "8cd450287ad41fc0fabcc993207b73ea04e4c8e1", + [] + ], "offset-path-ray-007-ref.html": [ "a48d9f0a2a046c042aad1d484adc90a393b0ea3e", [] ], + "offset-path-ray-007.html.ini": [ + "4b79075d659a56e8d3384c9dd7e3e7ca3ed8377d", + [] + ], "offset-path-ray-008-ref.html": [ "2c3720c44ce8fe305ad384167daf1de163b3301f", [] @@ -304893,30 +305602,58 @@ "95b54368759342f3cf0611d256e06f9534b5562e", [] ], + "offset-path-ray-009.html.ini": [ + "91127dabc38f3a44d493c310c20a270899ce46ad", + [] + ], "offset-path-ray-contain-001-ref.html": [ "24a823f9ca37c1edd1006fe8645c4c72791a4e11", [] ], + "offset-path-ray-contain-001.html.ini": [ + "f15f5cc1ad9a93171016106de138b681fd11fe92", + [] + ], "offset-path-ray-contain-002-ref.html": [ "92ccb13af86a672ddc085809cbe36815a697e133", [] ], + "offset-path-ray-contain-002.html.ini": [ + "0362210ac1f55262ab9bbb872309324ce4c134d3", + [] + ], "offset-path-ray-contain-003-ref.html": [ "3ad660eb2f2a2114d99a6d91a7a57146f6fece44", [] ], + "offset-path-ray-contain-003.html.ini": [ + "01290e50d0baec28f5a861a35b309ce7f305aa36", + [] + ], "offset-path-ray-contain-004-ref.html": [ "38b0d44fb1f0026e39c5201852faed50e77d0a66", [] ], + "offset-path-ray-contain-004.html.ini": [ + "eca174c11d13bfe17325e0ca2bb21353e9b292ca", + [] + ], "offset-path-ray-contain-005-ref.html": [ "c1dafc477d3b1fd6f3bfda1ea198ee8a6245cb0f", [] ], + "offset-path-ray-contain-005.html.ini": [ + "7fdbe8d8347067969b702384bb31588ba80bc922", + [] + ], "offset-path-shape-ref.html": [ "a659b287fdab1ed7bda453c36c17140e0c2740f2", [] ], + "offset-path-shape.html.ini": [ + "8a58266cb8f1884f2f015a476b52ef05ad2bfe04", + [] + ], "offset-path-string-ref.html": [ "5c5ff5f6f2ddc4696f2d51266199fe052464d9e6", [] @@ -304925,6 +305662,10 @@ "c5f8ec74e8782e095f9ac5eacc241f0fb8d5de88", [] ], + "offset-path-url.html.ini": [ + "fb7b890b1ace0c8fc297af4e659d3c109d9d2f5d", + [] + ], "offset-rotate-ref.html": [ "ec22768e96a1cd1efab206781b985cec8f006686", [] @@ -304934,13 +305675,25 @@ "2a043073fa24db4efb3d4de7d5436a830a7be478", [] ], + "offset-parsing-valid.html.ini": [ + "89922e1dee1ffe16d1d62b25db616c69e32d19a7", + [] + ], "offset-path-parsing-valid-expected.txt": [ "61a6efb3b6c1f5452db1ca51c05b39dfc34b3f48", [] ], + "offset-path-parsing-valid.html.ini": [ + "bab5614528b82a3cbfed47daf7f2d8b38ac4b749", + [] + ], "offset-shorthand-expected.txt": [ "740a2ecaa5678fc513cb38d4cb4fd85b44d6c089", [] + ], + "offset-shorthand.html.ini": [ + "62eb8f58bffb903886d94a8971b3fb2f32aa96f3", + [] ] } }, @@ -305211,6 +305964,82 @@ "1b2515a5cd1ec257fa8ebda2041699f5d4d09230", [] ], + "nth-child-and-nth-last-child-ref.html": [ + "447426a3e3a1c440b0c73ea9e321b9c5f7b15e7a", + [] + ], + "nth-child-of-classname-ref.html": [ + "b424e73b4508f255cbdbdcaf88446961e7814727", + [] + ], + "nth-child-of-complex-selector-ref.html": [ + "ba38f685c64c1200173eec9094ead353d7a1742b", + [] + ], + "nth-child-of-compound-selector-ref.html": [ + "3acec23e61ddb693918aa7531b84c8f3ed37cb5c", + [] + ], + "nth-child-of-tagname-ref.html": [ + "99c8262b4f36dd60e9bf6ee1afa5229579eb22a1", + [] + ], + "nth-child-specificity-1-ref.html": [ + "df70316c8d1b79a79a6077529145e116709e9fc8", + [] + ], + "nth-child-specificity-2-ref.html": [ + "1f7d376593050135773f57f02bf8de9d35ebb765", + [] + ], + "nth-child-specificity-3-ref.html": [ + "b13bc50f4158a1a423884228a3154066ea310720", + [] + ], + "nth-child-specificity-4-ref.html": [ + "b6f26c9cf4b062c11ba4ed7e7350a4d55de49401", + [] + ], + "nth-last-child-of-classname-ref.html": [ + "7df68b2aee50b4e0522212523effc3f23ef13a24", + [] + ], + "nth-last-child-of-complex-selector-ref.html": [ + "cda1902d1a64a96f35bbe07fd06288bc63b5e732", + [] + ], + "nth-last-child-of-compound-selector-ref.html": [ + "bc5c3ddbd56ceb0f9489c1ab5c574955c4fd5655", + [] + ], + "nth-last-child-of-style-sharing-1-ref.html": [ + "14ca8e42c7e3e22670da3c53a5ba5fd239080539", + [] + ], + "nth-last-child-of-style-sharing-2-ref.html": [ + "1ef071d56bbe0d3164b1cc21b3bf4949f9b10288", + [] + ], + "nth-last-child-of-tagname-ref.html": [ + "e0dcc6b0363bba7a85e29cc2e5d0904f8fef2f33", + [] + ], + "nth-last-child-specificity-1-ref.html": [ + "609279fdc5f0529273b84d46108d5f1a9fb2605d", + [] + ], + "nth-last-child-specificity-2-ref.html": [ + "70c44b8fac7c0cc22f0361194e52e5e389739a1a", + [] + ], + "nth-last-child-specificity-3-ref.html": [ + "8adc397d380fbdfa225ab0555bf00dc535b7388c", + [] + ], + "nth-last-child-specificity-4-ref.html": [ + "f0042d1114cac3178289879b83084648b0fe1772", + [] + ], "of-type-selectors-ref.xhtml": [ "ae866213df0112292c3bade7c48ad2d27f9a14f8", [] @@ -306254,7 +307083,7 @@ [] ], "testdriver.md": [ - "cc28008456fe5b1919eadfab30f60a113c7e3e60", + "82ad4ff624cebbd927f478bfbf29c104663d4e8a", [] ], "testharness-api.md": [ @@ -307042,7 +307871,7 @@ [] ], "selectors.js": [ - "decc983e93192587ef47f5b6ff6aca94f198a679", + "5e05547c9accf809db7c0b457cb98d7428b2f5d0", [] ], "support": { @@ -308164,6 +308993,10 @@ "typing-around-link-element-at-non-collapsed-selection.tentative_target=DesignMode_parent=b_child=i-expected.txt": [ "2cd75e33ab0d7c88da6bd362285873e7cf727fb9", [] + ], + "undo-insertparagraph-after-moving-split-nodes-expected.txt": [ + "6f8b410513a2d8fe3405c9209f6b9b8c42f6fb13", + [] ] }, "run": { @@ -310148,7 +310981,7 @@ [] ], "event-timing-test-utils.js": [ - "ab3f110c72d48b22e1a2350176647b322eaabeb7", + "fc4d1aee72627644d9257cb7a220b682c0ab4bb4", [] ], "slow-image.py": [ @@ -310679,7 +311512,7 @@ [] ], "OWNERS": [ - "c48f060b71ebd810af4ff0c3d167e2e4de56dfb1", + "a1e1bba3a061f1cac82cd0c87fc16c3d0d71b6a8", [] ], "README.md": [ @@ -310825,6 +311658,24 @@ ] } }, + "headers": { + "headers-basic.any-expected.txt": [ + "bc7e6fb7baf09cf58272c93c1798c96fd8f780c7", + [] + ], + "headers-basic.any.serviceworker-expected.txt": [ + "bc7e6fb7baf09cf58272c93c1798c96fd8f780c7", + [] + ], + "headers-basic.any.sharedworker-expected.txt": [ + "bc7e6fb7baf09cf58272c93c1798c96fd8f780c7", + [] + ], + "headers-basic.any.worker-expected.txt": [ + "bc7e6fb7baf09cf58272c93c1798c96fd8f780c7", + [] + ] + }, "idlharness.any-expected.txt": [ "e7dd305403874c89cddef0e1e2b74e6fe556d396", [] @@ -312057,7 +312908,7 @@ [] ], "helper.js": [ - "608a5297881b914a2cf3602f6b79f53a25354f98", + "725f9a7e43b2f4a852deb8a0d2f6394889434762", [] ], "helper.sub.js": [ @@ -312344,6 +313195,14 @@ "3a1859876d406cebe9a2bbc63952d019ddc5ed06", [] ], + "iframed.html": [ + "694884f7fb2db3258724df01b330d487b09ea4a5", + [] + ], + "iframer.html": [ + "304cc54ae4448b84bf43aad3279b2dd198add165", + [] + ], "preflight.py": [ "41daebf08d35c165512c9f745fe1252bb844a42f", [] @@ -312369,7 +313228,7 @@ [] ], "support.sub.js": [ - "3bf9ed009d5232e577eaa9bbb43e640a4b789c98", + "afa82d30d89478b8308b084aa11d86c4b6fb6b4f", [] ], "worker-fetcher.html": [ @@ -313883,11 +314742,11 @@ [] ], "FileSystemFileHandle-move.https.any-expected.txt": [ - "407d9d049e4a9bf73c69149c0a847bcb0d825bf8", + "421ba840365785e803ee96e95db363822bb62e94", [] ], "FileSystemFileHandle-move.https.any.worker-expected.txt": [ - "407d9d049e4a9bf73c69149c0a847bcb0d825bf8", + "421ba840365785e803ee96e95db363822bb62e94", [] ], "META.yml": [ @@ -314034,7 +314893,7 @@ [] ], "FileSystemFileHandle-move.js": [ - "c914bd82fa9cceecc6883a97e55ada4081eea923", + "a65251e4898a355f414c9d7c259f9e34479a1b3e", [] ], "FileSystemSyncAccessHandle-flush.js": [ @@ -315060,29 +315919,7 @@ "same-document-traversal-cross-document-nav-expected.txt": [ "a2cebc4ccd1f7dfaa2156351e6af89c0444cd969", [] - ], - "tentative": { - "cross-document-traversal-same-document-nav-expected.txt": [ - "4ceed7722c4ea66b83050c23c8bca51e0fc7854b", - [] - ], - "cross-document-traversal-same-document-traversal-expected.txt": [ - "acbb5ee19a71050385adcb6439fd6c3f0b425e0b", - [] - ], - "nav-cancelation-1-expected.txt": [ - "16fb35024af873f1a1e1e6548374a4cd9b21a83a", - [] - ], - "nav-cancelation-2.sub-expected.txt": [ - "d02213bc0797ff078c349be679d0bff4dc331039", - [] - ], - "same-document-traversal-same-document-nav-expected.txt": [ - "4ceed7722c4ea66b83050c23c8bca51e0fc7854b", - [] - ] - } + ] }, "read-media": { "pageload-video-expected.txt": [ @@ -324880,12 +325717,8 @@ }, "image-maps": { "image-map-processing-model": { - "hash-name-reference-expected.txt": [ - "8f80ec1decb5225f22cb5eda60a39bd599ec3f15", - [] - ], "hash-name-reference-test-data.html": [ - "735ba8cf08655a3a62f916f9e6d52d0bdb3aef80", + "1fb71431f7bd08348d56cee77ccaef6511959804", [] ] } @@ -326496,14 +327329,6 @@ "selection-pointer-expected.txt": [ "a46cb70594b81466ca0c856428b12ce23e940d36", [] - ], - "type-change-state-expected.txt": [ - "f8665a4fea603dc8e26aa0d8e4a2e4e4c58aa571", - [] - ], - "type-change-state-weekmonth-expected.txt": [ - "f9c1f754a793fbb90eee6555777833556629b6be", - [] ] }, "the-label-element": { @@ -332105,7 +332930,7 @@ [] ], "compute-pressure.idl": [ - "e855b30cd9bc8bdcb835a38be0e57b9d44d725d4", + "ae409fc3046d0f24526a5729d9422e7b06669d43", [] ], "console.idl": [ @@ -332228,10 +333053,6 @@ "3759199fc14d66c4045915f1404f742fe7513590", [] ], - "css-shared-element-transitions.idl": [ - "da2e9e43f7ea09982f103ca9393fee876e7b68d1", - [] - ], "css-toggle.tentative.idl": [ "5587019a290c2b90d0e46c05acf557916fb7db20", [] @@ -332248,6 +333069,10 @@ "595a424e01461e6cad1f364eb5c233dbbcf1e02a", [] ], + "css-view-transitions.idl": [ + "26c2e304066ee2e41f98acebeaacf0220124e797", + [] + ], "cssom-view.idl": [ "a61f17ea4885fb51dba7ef2d8b9780b4a67f5415", [] @@ -332333,7 +333158,7 @@ [] ], "fs.idl": [ - "0bda456e2d2d57c604dd12496fd827d0a427b406", + "ee05869254f4852dd544ee826676d3d1fff54a47", [] ], "fullscreen.idl": [ @@ -332677,7 +333502,7 @@ [] ], "screen-capture.idl": [ - "908fce2c6baa25b637a4a0d200a6d7423a1674ba", + "b8bd4652073cba12007e6840f64a379cfc1e4884", [] ], "screen-orientation.idl": [ @@ -332845,11 +333670,11 @@ [] ], "webauthn.idl": [ - "03a62306fc50c9fd3cc95695b93c917c945b086e", + "d35ebbfc919b399ce4a5edefec83958494e2ab1b", [] ], "webcodecs.idl": [ - "4854d9698b0144218684fbcc1b83804d496350c8", + "b92dd9df99d2d70716e5d013c44f9f9104d7fdea", [] ], "webcrypto-secure-curves.idl": [ @@ -332905,7 +333730,7 @@ [] ], "webrtc-stats.idl": [ - "ec8044955741c6e4fb4d36e5a09129846815ab21", + "237c7e474c974337caa37332101c16f9a8601f73", [] ], "webrtc-svc.idl": [ @@ -332921,7 +333746,7 @@ [] ], "webtransport.idl": [ - "ed21e2c350ef391ff91ab56e9248ed6d9e22907c", + "1aa5a512da711faf1dea192f7d4f57250a601e99", [] ], "webusb.idl": [ @@ -333302,7 +334127,7 @@ ] }, "lint.ignore": [ - "dd3f7b61a9ff2653577da9fc55a64495310c33f4", + "b8a4093ae998ced631dbccf758984721499ce973", [] ], "loading": { @@ -333548,7 +334373,7 @@ [] ], "utils.js": [ - "c022f1a5a7aeb747b3d75b66bf0502a43e861dec", + "36bd6c7bc28a762343202d1fc44ace6ddbf03467", [] ] }, @@ -335539,7 +336364,7 @@ [] ], "OWNERS": [ - "3f8456354bd08a3cb87e767ca0eb508603f45f1b", + "52ba67ed94406d86d34805a5c34aa3d8644799e4", [] ], "README.md": [ @@ -335925,7 +336750,7 @@ [] ], "OWNERS": [ - "565fba10ed212436d5f1c33e2656cd3722da753e", + "136f6d974686307d2f437c81894ede912ca656a5", [] ], "README.md": [ @@ -336153,6 +336978,18 @@ "4e5e1a000c9a67b7dbc591dd7d0abc5f279f363c", [] ], + "blank_page_prefetch.html": [ + "f8f29b35cc05ebf437ab81b52ab9225580a6126b", + [] + ], + "blank_page_prefetch.html.headers": [ + "771aba7f94c78a585cfefeaebfd6949232869e43", + [] + ], + "iframe-prefetch-transfer-size.html": [ + "fde01775b776d9a35b1ce8705f858bb9e750ce2e", + [] + ], "navigation-type-post-back.html": [ "8c19a2f5a5ffe4215184b22ded42c4741e9fa2a4", [] @@ -336819,6 +337656,26 @@ [] ] }, + "pending-beacon": { + "META.yml": [ + "04b88b5f72fccfe6b498c4fdd8c7b3e5212bce84", + [] + ], + "resources": { + "get_beacon.py": [ + "32cb9a9ba30638bf0e5c7e54655ae87e7085978d", + [] + ], + "pending_beacon-helper.js": [ + "6d1cc80d8b81c2737d688b030865496d79432e46", + [] + ], + "set_beacon.py": [ + "1c71f23e57849481b7deb204cb859ef25f6e4356", + [] + ] + } + }, "performance-timeline": { "DIR_METADATA": [ "17e24c0942c8113028f9267cb32724f45d651c53", @@ -336914,10 +337771,20 @@ "bd152e973e8fd520460a325d47beab8c25f45d31", [] ], + "non-fully-active.https-expected.txt": [ + "cf5b4c0a3f139efe60417b0caf548ac85e3835cc", + [] + ], "permissions-query-feature-policy-attribute.https.sub-expected.txt": [ "b3a521320e8acb70c2f2199d608d4bd3379934e0", [] - ] + ], + "resources": { + "empty.html": [ + "b0653f8c0cd7dbcb7d4be0617054685aa8fbb72a", + [] + ] + } }, "permissions-policy": { "DIR_METADATA": [ @@ -337461,7 +338328,7 @@ [] ], "pointerevent_support.js": [ - "636ccc124383f1989949667e69840a92765e73c1", + "696ea46748b99b4287dd9ad60303469843714b32", [] ], "pointerlock": { @@ -340442,7 +341309,7 @@ [] ], "mock-subapps.js": [ - "d8b3f08cb3d51fb28c771d57b7cec24cb8a83420", + "467d932465bb63b031e831b2f42f98ad2935d04f", [] ], "mock-textdetection.js": [ @@ -340547,7 +341414,7 @@ [] ], "testdriver.js": [ - "3474a3361043fda1301f0e242d74bee675d33f41", + "d23f9fb83b2565b79e75c8f80d6444ce88af9001", [] ], "testdriver.js.headers": [ @@ -340665,7 +341532,7 @@ [] ], "getdisplaymedia.https-expected.txt": [ - "c0c57062afbad884872a96a160d68bcc533a04e6", + "22a39e4a36601eae5cb351484a1f999c6a0686f4", [] ], "idlharness.https.window-expected.txt": [ @@ -340700,6 +341567,10 @@ "b4d17d2d48a94dffc0320236cad946850ec094e2", [] ], + "nested-documents-expected.txt": [ + "a8d359c0f0ae01d65e30349147fdea616782a1d8", + [] + ], "onchange-event-expected.txt": [ "eb540f79482eac6a678a28bbaf1232002629ee3d", [] @@ -340722,7 +341593,7 @@ [] ], "orientation-utils.js": [ - "f2fb045fa9509287b1bd3c3c351a26d23fe37091", + "2283158923a89a1c6f5fb3b64b558058fa58f258", [] ], "sandboxed-iframe-locking.html": [ @@ -345094,6 +345965,10 @@ } }, "storage-access-api": { + "DIR_METADATA": [ + "1da7c78a0f02e4a4a10aaf1e7da005be04c4fa75", + [] + ], "META.yml": [ "d3949fb19a4e155296021fade5a8a27d3564e727", [] @@ -345340,7 +346215,7 @@ "subapps": { "resources": { "subapps-helpers.js": [ - "4a79d21b37d9688a935fa49f163fea3e5a019872", + "1d50c402c3683e6dda49dfb75055f3b6c697d177", [] ] } @@ -346589,7 +347464,7 @@ [] ], "OWNERS": [ - "3f8456354bd08a3cb87e767ca0eb508603f45f1b", + "956a3a5fe69d11262639193b6221b26a8fc006cb", [] ], "default-policy-report-only.tentative.html.headers": [ @@ -347067,26 +347942,6 @@ ] } }, - "unload-beacon": { - "META.yml": [ - "70848e7ce20e104680acf812604a5802192c2276", - [] - ], - "resources": { - "get_beacon.py": [ - "32cb9a9ba30638bf0e5c7e54655ae87e7085978d", - [] - ], - "pending_beacon-helper.js": [ - "067bf60c4405558ef2bf076c3260f54edaad796f", - [] - ], - "set_beacon.py": [ - "1c71f23e57849481b7deb204cb859ef25f6e4356", - [] - ] - } - }, "upgrade-insecure-requests": { "DIR_METADATA": [ "a19d4eeecc75654a46966efa7badc560e5ebc3e1", @@ -347097,7 +347952,7 @@ [] ], "OWNERS": [ - "3f8456354bd08a3cb87e767ca0eb508603f45f1b", + "52ba67ed94406d86d34805a5c34aa3d8644799e4", [] ], "README.md": [ @@ -349375,11 +350230,11 @@ [] ], "idlharness.https.window-expected.txt": [ - "594cc255e80178b48d159e2b14cd69b36ee3bae8", + "475986c5e9bf0e0633b5f5d9b5dae13cb68d8c1f", [] ], "idlharness.https.window.js.ini": [ - "757d47fbebb7b57deb3be099c6d06e4b10939f0b", + "5cba4572594ff722e41cc08a39ff5a5ef9f56d58", [] ], "remote-desktop-client-override.tentative.https-expected.txt": [ @@ -350453,7 +351308,7 @@ [] ], "idlharness.https.any-expected.txt": [ - "d3ff6ff3a85ec4de9ef84c226f88183e664bcbe8", + "31a77c90cf9eeda8dba89af6c4f1375417e8a284", [] ], "idlharness.https.any.worker-expected.txt": [ @@ -350497,7 +351352,7 @@ [] ], "RTCConfiguration-iceServers-expected.txt": [ - "3ad5b66f049894c5e95fd82d2669d3c5447fc349", + "c333f28867d5e5430064213aaeee4cbcf978315a", [] ], "RTCConfiguration-iceTransportPolicy-expected.txt": [ @@ -350679,7 +351534,7 @@ [] ], "idlharness.https.window-expected.txt": [ - "c9ca12c2a86b5aa8b283b99f8a2b2feb18572a3a", + "19ec66a9b49417d0567dfb9bccefa01e2c96fea9", [] ], "legacy": { @@ -350969,10 +351824,6 @@ "rtp-stats-creation-expected.txt": [ "e0e519a4a5436f28d4035c3ee9511fb18e849dc1", [] - ], - "supported-stats-expected.txt": [ - "a1cbb24a5e3d64b5acf8c85476df2f5ae7249b0f", - [] ] }, "webrtc-svc": { @@ -357049,6 +357900,17 @@ {} ] ], + "BlobURL": { + "cross-partition.tentative.https.html": [ + "b6c3cae09045bb0b03c17a6e2080ed9b10fd982f", + [ + null, + { + "timeout": "long" + } + ] + ] + }, "FileReader": { "progress_event_bubbles_cancelable.html": [ "6a03243f934081b18cf456d741c3fc2d1660f9c3", @@ -385326,6 +386188,13 @@ {} ] ], + "style-src-injected-inline-style-allowed-with-content-hash.html": [ + "c7b482b580b0ba80ef7c023f09d8c1acc80cfac7", + [ + null, + {} + ] + ], "style-src-injected-inline-style-allowed.html": [ "0a691f683cb5c97db887173575edf519490d62aa", [ @@ -387758,6 +388627,24 @@ } ] ], + "get_all_cookies-default-samesite.html": [ + "099ac5112e1cbfb105171dcbe06e967d5b87f0f2", + [ + null, + { + "testdriver": true + } + ] + ], + "get_named_cookie-default-samesite.html": [ + "405473cc3a891ea53b0a8f52d3a4c342a71e6299", + [ + null, + { + "testdriver": true + } + ] + ], "iframe-reload.https.html": [ "d1916a805c36894d6440a7ffbb62544630c279ce", [ @@ -388225,14 +389112,14 @@ ] ], "fedcm-logout-rps.https.html": [ - "9a967772d84c221f84cea771a86bc572d0c5ae94", + "51b123003c1e39466a31c68904a4f5633f063697", [ null, {} ] ], "fedcm-network-requests.sub.https.html": [ - "9c21ccecf530c362b5aabed0d7097f9aa6fd1083", + "12a3813ac880301b428713e7383a737375833182", [ null, {} @@ -396405,7 +397292,7 @@ ] ], "font-shorthand-serialization-font-stretch.html": [ - "f5fff421ff9eedf30b5a028664f27e16d5cbd116", + "e39d6c6b198a0c04fd71194502a9c01cdc818072", [ null, {} @@ -407919,13 +408806,6 @@ null, {} ] - ], - "table-writing-mode-computed.html": [ - "36698ef2f50c9806bf086d218fc0600b2599d9b9", - [ - null, - {} - ] ] }, "percent-height-overflow-auto-in-restricted-block-size-cell.html": [ @@ -409960,6 +410840,27 @@ {} ] ], + "hyphenate-limit-chars-computed.html": [ + "cf18f25ba74800327dd590cd6192552936aee06d", + [ + null, + {} + ] + ], + "hyphenate-limit-chars-invalid.html": [ + "5a797fa8181d1ca16280067b6ed7031b2796d881", + [ + null, + {} + ] + ], + "hyphenate-limit-chars-valid.html": [ + "699ddd4ab0724095b5ab7ac80aeaba906051b84d", + [ + null, + {} + ] + ], "hyphens-computed.html": [ "094e47dab52b1833b721897c5e7eb9d35dbf3ed6", [ @@ -411017,6 +411918,13 @@ null, {} ] + ], + "toggle-visibility.tentative.html": [ + "0a720fd454bd8c74e7f7b5d750416b3fb7be20f1", + [ + null, + {} + ] ] }, "css-transforms": { @@ -414470,7 +415378,7 @@ ] ], "text-transform.html": [ - "7d6e9c35774b3a1ca62d05532fcf56076e85e3dd", + "8f636fad14ec54d76a6ba4c34ce800663b570e28", [ null, {} @@ -415607,6 +416515,13 @@ {} ] ], + "lh-unit-004.html": [ + "eab4df97b4db3c2d15115c5efa36dca391ec8785", + [ + null, + {} + ] + ], "line-break-ch-unit.html": [ "295b418f304a76cde4dba21a1d24022557882b18", [ @@ -419943,6 +420858,15 @@ } ] ], + "focus-visible-027.html": [ + "b4e7117f06cb17898690f10782bd1028ab791eb7", + [ + null, + { + "testdriver": true + } + ] + ], "focus-visible-script-focus-001.html": [ "df6d9158b7cf3e829343834f1c5a499a15016434", [ @@ -428979,6 +429903,16 @@ } ] ], + "undo-insertparagraph-after-moving-split-nodes.html": [ + "c61bcff9e9246abdabe8f5acc97b489db5708b94", + [ + null, + { + "testdriver": true, + "timeout": "long" + } + ] + ], "white-spaces-after-execCommand-delete.tentative.html": [ "1490bf06f55a6c2b1e10afc044b19b108e5dd482", [ @@ -442001,6 +442935,15 @@ } ] ], + "duration-with-target-low.html": [ + "11a8c3ae47af2d1890ea0e6c21c5b9f99dfdb2f1", + [ + null, + { + "testdriver": true + } + ] + ], "event-click-counts.html": [ "6c6563b95818ac56adbc06c9374798700ed41245", [ @@ -442191,7 +443134,7 @@ ] ], "large-duration-threshold.html": [ - "5665d42d3345742f5364b085b2c137156652e212", + "4eed8d97565939aed0b1f314f463ce5e4dc9e8fa", [ null, { @@ -442200,7 +443143,7 @@ ] ], "medium-duration-threshold.html": [ - "a827f2211b12550fee8d0f5d1258dfbe29c830d9", + "a2f79cf6febb2cc4b0c7ccd4bfeb42762baf0405", [ null, { @@ -442209,7 +443152,7 @@ ] ], "min-duration-threshold.html": [ - "443b38a27833377e4ebbbe307290addd439eb508", + "b7382f94579d3187d06faeb92c7f147b8994b2bf", [ null, { @@ -447048,7 +447991,7 @@ ] ], "headers-basic.any.js": [ - "398ddcfd3d6395120c727d837cea099bf0e7e489", + "ead1047645a15fa63fdbb665eaf8fc685b3bde7b", [ "fetch/api/headers/headers-basic.any.html", { @@ -454787,6 +455730,29 @@ } ] ], + "iframe.tentative.window.js": [ + "e91874d9c7efbdbfaaad650f9d734aae5eb4c4da", + [ + "fetch/private-network-access/iframe.tentative.window.html", + { + "script_metadata": [ + [ + "script", + "/common/utils.js" + ], + [ + "script", + "resources/support.sub.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], "mixed-content-fetch.tentative.https.window.js": [ "a5cddf49f1f4f923c79850e084bd4f66c1f6ca0c", [ @@ -510224,7 +511190,7 @@ ] ], "get_all_cookies.sub.html": [ - "8545d06be96d631b8465197c84e81ad38465a406", + "a145e5232d4d01e25ccbf93ae7cdab8ffb08c3f0", [ null, { @@ -510233,7 +511199,7 @@ ] ], "get_all_cookies.sub.https.html": [ - "08ab8cc3f43c4854eebe2a2ab6ef175cfbdc7c57", + "e340278031583032630624f264794befcad41181", [ null, { @@ -510242,7 +511208,7 @@ ] ], "get_named_cookie.sub.html": [ - "c3a8eed251eb8e3e1e7ae373f34c3748f759eb9f", + "3cbc784f763fd7c2b8d3d1d1424e5db62382f81c", [ null, { @@ -510251,7 +511217,7 @@ ] ], "get_named_cookie.sub.https.html": [ - "d316d4ec72b526f3bf43b1420c218b034bf8b365", + "d0d8612ac23f003c35f37b9aaa37fa410c338fac", [ null, { @@ -513084,14 +514050,14 @@ ] ], "containerNames.html": [ - "90dcd6d9aa52b431f267fae31ca53804a6885bfa", + "e6a9335dc7934afe637694ba21587b52afc1ab93", [ null, {} ] ], "containerTypes.html": [ - "2d48bf77b2450fe20ba603702141f58f21a4c28e", + "0e258050415162f7cd9aeeb93f5ebdc41de0d7a2", [ null, {} @@ -513158,7 +514124,7 @@ ] ], "longtask-in-childiframe.html": [ - "bc7d69c6957bf646ceb697223525918dc3cffee6", + "6618a88b896ae3de2806378f38b2a8e215e1b9d5", [ null, {} @@ -523310,6 +524276,20 @@ {} ] ], + "prefetch-transfer-size-executor.html": [ + "752051756963914bd44ca5594f18c7ce3ab563a8", + [ + null, + {} + ] + ], + "prefetch-transfer-size-iframe.html": [ + "316f78b95572ac17069169f59ae3316cf72192d1", + [ + null, + {} + ] + ], "secure-connection-start-non-zero.https.html": [ "e95468ef9122822bf8e443e356df0fd7cc8bd4cd", [ @@ -525118,6 +526098,134 @@ ] ] }, + "pending-beacon": { + "pending_beacon-basic.tentative.window.js": [ + "efc9ed2617e3b90b90302b06826ca729f60eb763", + [ + "pending-beacon/pending_beacon-basic.tentative.window.html", + { + "script_metadata": [ + [ + "script", + "./resources/pending_beacon-helper.js" + ] + ] + } + ] + ], + "pending_beacon-deactivate.tentative.window.js": [ + "74c0852adc322a7194ab0bc3aca83a358572d462", + [ + "pending-beacon/pending_beacon-deactivate.tentative.window.html", + { + "script_metadata": [ + [ + "script", + "./resources/pending_beacon-helper.js" + ] + ] + } + ] + ], + "pending_beacon-sendnow.tentative.window.js": [ + "00baccd0c1ab42c0dfa08def5f23ad6ba21eed9b", + [ + "pending-beacon/pending_beacon-sendnow.tentative.window.html", + { + "script_metadata": [ + [ + "script", + "/common/utils.js" + ], + [ + "script", + "./resources/pending_beacon-helper.js" + ] + ] + } + ] + ], + "pending_get_beacon-cors.tentative.https.window.js": [ + "10bb3a0bed7f4888aaab7c7f6551f4a9a447c60e", + [ + "pending-beacon/pending_get_beacon-cors.tentative.https.window.html", + { + "script_metadata": [ + [ + "script", + "/common/get-host-info.sub.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "./resources/pending_beacon-helper.js" + ] + ] + } + ] + ], + "pending_get_beacon-send.tentative.window.js": [ + "8c6e826af5b578b5893babb5e0ee90e37b37cc09", + [ + "pending-beacon/pending_get_beacon-send.tentative.window.html", + { + "script_metadata": [ + [ + "script", + "/common/utils.js" + ], + [ + "script", + "./resources/pending_beacon-helper.js" + ] + ] + } + ] + ], + "pending_post_beacon-cors.tentative.https.window.js": [ + "01511d22c1b7bc58cfd86ca3725b0514f292d058", + [ + "pending-beacon/pending_post_beacon-cors.tentative.https.window.html", + { + "script_metadata": [ + [ + "script", + "/common/get-host-info.sub.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "./resources/pending_beacon-helper.js" + ] + ] + } + ] + ], + "pending_post_beacon-sendwithdata.tentative.window.js": [ + "77e91479e8b990b2b8240dc3fd6853e4d25ab980", + [ + "pending-beacon/pending_post_beacon-sendwithdata.tentative.window.html", + { + "script_metadata": [ + [ + "script", + "/common/utils.js" + ], + [ + "script", + "./resources/pending_beacon-helper.js" + ] + ] + } + ] + ] + }, "performance-timeline": { "back-forward-cache-restoration.tentative.html": [ "733642fd03225a0877b93e8dcc09ec24e097935a", @@ -525297,6 +526405,15 @@ } ] ], + "navigation-id-initial-load.tentative.html": [ + "3228e12778b5d510dedcdd15977e2b021473f097", + [ + null, + { + "timeout": "long" + } + ] + ], "navigation-id-long-task-task-attribution.tentative.html": [ "662e17508b26dc671bf4ed25618a3b9ed9b0cac1", [ @@ -525972,6 +527089,15 @@ } ] ], + "non-fully-active.https.html": [ + "1c11afa3d94936ce8691a82dda052942f81b1cc2", + [ + null, + { + "testdriver": true + } + ] + ], "permissions-cg.https.html": [ "9a3d025346a64360de238e52da7903c4617e4a58", [ @@ -544197,7 +545323,7 @@ ] ], "getdisplaymedia.https.html": [ - "1c9eb449f55a514f5ff958e40fbf97089357f7bb", + "ad6cf480e536ebf31c0ceebba72815a88eb3659c", [ null, { @@ -544390,8 +545516,17 @@ } ] ], + "nested-documents.html": [ + "efaed9cec8103b1cb65762aeeb77884b66d0834f", + [ + null, + { + "testdriver": true + } + ] + ], "non-fully-active.html": [ - "61066ebd849ed8a554e688a721fdf8f301cf1f00", + "2590442a413789eba85f0af1ec475ded2c3e651e", [ null, { @@ -557939,21 +559074,21 @@ ] ], "list-error.tentative.https.html": [ - "b5aa4cbace474c6e2130bfbe16a5312d8bcb9fd9", + "1161318acd42c3f8d29796cba9bbd338ece2b428", [ null, {} ] ], "list-success.tentative.https.html": [ - "7622ac9238d4d6547ded1ce073206d10117ee06a", + "0ee02230e805b1085a901a64e102182e48e5738f", [ null, {} ] ], "remove-error.tentative.https.html": [ - "45b44655a3b5036328967cff9b7223722834e5bf", + "05305c4fafc5db90d13db4f7ac65a6c10154e710", [ null, {} @@ -562375,134 +563510,6 @@ } } }, - "unload-beacon": { - "pending_beacon-basic.tentative.window.js": [ - "efc9ed2617e3b90b90302b06826ca729f60eb763", - [ - "unload-beacon/pending_beacon-basic.tentative.window.html", - { - "script_metadata": [ - [ - "script", - "./resources/pending_beacon-helper.js" - ] - ] - } - ] - ], - "pending_beacon-deactivate.tentative.window.js": [ - "74c0852adc322a7194ab0bc3aca83a358572d462", - [ - "unload-beacon/pending_beacon-deactivate.tentative.window.html", - { - "script_metadata": [ - [ - "script", - "./resources/pending_beacon-helper.js" - ] - ] - } - ] - ], - "pending_beacon-sendnow.tentative.window.js": [ - "00baccd0c1ab42c0dfa08def5f23ad6ba21eed9b", - [ - "unload-beacon/pending_beacon-sendnow.tentative.window.html", - { - "script_metadata": [ - [ - "script", - "/common/utils.js" - ], - [ - "script", - "./resources/pending_beacon-helper.js" - ] - ] - } - ] - ], - "pending_get_beacon-cors.tentative.https.window.js": [ - "10bb3a0bed7f4888aaab7c7f6551f4a9a447c60e", - [ - "unload-beacon/pending_get_beacon-cors.tentative.https.window.html", - { - "script_metadata": [ - [ - "script", - "/common/get-host-info.sub.js" - ], - [ - "script", - "/common/utils.js" - ], - [ - "script", - "./resources/pending_beacon-helper.js" - ] - ] - } - ] - ], - "pending_get_beacon-send.tentative.window.js": [ - "8c6e826af5b578b5893babb5e0ee90e37b37cc09", - [ - "unload-beacon/pending_get_beacon-send.tentative.window.html", - { - "script_metadata": [ - [ - "script", - "/common/utils.js" - ], - [ - "script", - "./resources/pending_beacon-helper.js" - ] - ] - } - ] - ], - "pending_post_beacon-cors.tentative.https.window.js": [ - "01511d22c1b7bc58cfd86ca3725b0514f292d058", - [ - "unload-beacon/pending_post_beacon-cors.tentative.https.window.html", - { - "script_metadata": [ - [ - "script", - "/common/get-host-info.sub.js" - ], - [ - "script", - "/common/utils.js" - ], - [ - "script", - "./resources/pending_beacon-helper.js" - ] - ] - } - ] - ], - "pending_post_beacon-sendwithdata.tentative.window.js": [ - "77e91479e8b990b2b8240dc3fd6853e4d25ab980", - [ - "unload-beacon/pending_post_beacon-sendwithdata.tentative.window.html", - { - "script_metadata": [ - [ - "script", - "/common/utils.js" - ], - [ - "script", - "./resources/pending_beacon-helper.js" - ] - ] - } - ] - ] - }, "upgrade-insecure-requests": { "gen": { "iframe-blank-inherit.meta": { @@ -578831,7 +579838,7 @@ }, "webnn": { "idlharness.https.any.js": [ - "ffb5011864f6700601648c0b41e4fcc26fd48af5", + "5f538319417294fa99adb006a490beb5fea8d176", [ "webnn/idlharness.https.any.html", { @@ -596840,7 +597847,7 @@ ] ], "dedicated-worker-in-data-url-context.window.js": [ - "1b1ce232a739313d80ef5641aa799c978e53abea", + "124914012dbb53380739d384a09ab59299cd4086", [ "workers/dedicated-worker-in-data-url-context.window.html", { @@ -598383,7 +599390,7 @@ ] ], "shared-worker-in-data-url-context.window.js": [ - "f0cc98b75cbfd0d1bc084e445c47f3f6c7dd219c", + "b768c815d08d843fdf5b0e90eb7d538e019a5853", [ "workers/shared-worker-in-data-url-context.window.html", {
diff --git a/third_party/blink/web_tests/external/wpt/compute-pressure/idlharness.https.window-expected.txt b/third_party/blink/web_tests/external/wpt/compute-pressure/idlharness.https.window-expected.txt index 4d3c7af..a4567ee7 100644 --- a/third_party/blink/web_tests/external/wpt/compute-pressure/idlharness.https.window-expected.txt +++ b/third_party/blink/web_tests/external/wpt/compute-pressure/idlharness.https.window-expected.txt
@@ -23,5 +23,15 @@ PASS PressureObserver interface: observer must inherit property "takeRecords()" with the proper type PASS PressureObserver interface: observer must inherit property "supportedSources" with the proper type PASS PressureObserver interface: observer must inherit property "requestPermission()" with the proper type +FAIL PressureRecord interface: existence and properties of interface object assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing +FAIL PressureRecord interface object length assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing +FAIL PressureRecord interface object name assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing +FAIL PressureRecord interface: existence and properties of interface prototype object assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing +FAIL PressureRecord interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing +FAIL PressureRecord interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing +FAIL PressureRecord interface: attribute source assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing +FAIL PressureRecord interface: attribute state assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing +FAIL PressureRecord interface: attribute factors assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing +FAIL PressureRecord interface: attribute time assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/style-src/style-src-injected-inline-style-allowed-with-content-hash.html b/third_party/blink/web_tests/external/wpt/content-security-policy/style-src/style-src-injected-inline-style-allowed-with-content-hash.html new file mode 100644 index 0000000..c7b482b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/content-security-policy/style-src/style-src-injected-inline-style-allowed-with-content-hash.html
@@ -0,0 +1,46 @@ +<!doctype html> +<html> +<head> + <meta http-equiv="Content-Security-Policy" content="style-src 'self' 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU='; script-src 'self' 'unsafe-inline'"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + + <script> + var t = async_test("Inline injected style without text content should be allowed"); + document.addEventListener("securitypolicyviolation", t.unreached_func("Should not trigger a security policy violation")); + t.done(); + + const style_null_child = document.createElement("style"); + document.head.appendChild(style_null_child); + test(function() { + assert_not_equals(style_null_child.sheet, undefined, "style_null_child should have a stylesheet"); + assert_class_string(style_null_child.sheet, "CSSStyleSheet"); + }, "Inline style sheet should be created with null child node"); + + const style_empty_child = document.createElement("style"); + style_empty_child.appendChild(document.createTextNode("")); + document.head.appendChild(style_empty_child); + test(function() { + assert_not_equals(style_empty_child.sheet, undefined, "style_empty_child should have a stylesheet"); + assert_class_string(style_empty_child.sheet, "CSSStyleSheet"); + }, "Inline style should be created with empty-string child node"); + + const { sheet } = style_empty_child; + sheet.insertRule("#content { margin-left: 2px; }"); + </script> +</head> +<body> + <div id='log'></div> + + <div id="content">Lorem ipsum</div> + + <script> + test(function() { + var contentEl = document.getElementById("content"); + var background_color = getComputedStyle(contentEl).getPropertyValue('margin-left'); + assert_equals(background_color, "2px"); + }, "Inline style should be applied"); + </script> + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-mix-function-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-mix-function-expected.txt index 78784ba..f8f5292 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-mix-function-expected.txt +++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-mix-function-expected.txt
@@ -1,478 +1,478 @@ This is a testharness.js-based test. -Found 474 tests; 0 PASS, 474 FAIL, 0 TIMEOUT, 0 NOTRUN. -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%))' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%))' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%))' is a supported value for color. expected true got false +Found 474 tests; 22 PASS, 452 FAIL, 0 TIMEOUT, 0 NOTRUN. +FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%))' assert_equals: expected "rgb(84, 92, 61)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%))' assert_equals: expected "rgb(112, 106, 67)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in hsl, 25% hsl(120deg 10% 20%), hsl(30deg 30% 40%))' assert_true: 'color-mix(in hsl, 25% hsl(120deg 10% 20%), hsl(30deg 30% 40%))' is a supported value for color. expected true got false FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%), 25% hsl(30deg 30% 40%))' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20%), 25% hsl(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%) 25%)' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%) 75%)' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 30%, hsl(30deg 30% 40%) 90%)' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20%) 30%, hsl(30deg 30% 40%) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 12.5%, hsl(30deg 30% 40%) 37.5%)' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20%) 12.5%, hsl(30deg 30% 40%) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 0%, hsl(30deg 30% 40%))' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20%) 0%, hsl(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40% / .8))' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40% / .8))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%) 25%)' assert_equals: expected "rgb(61, 73, 54)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%) 75%)' assert_equals: expected "rgb(112, 106, 67)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 30%, hsl(30deg 30% 40%) 90%)' assert_equals: expected "rgb(112, 106, 67)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 12.5%, hsl(30deg 30% 40%) 37.5%)' assert_equals: expected "rgba(112, 106, 67, 0.5)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 0%, hsl(30deg 30% 40%))' +FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))' assert_equals: expected "rgba(95, 105, 65, 0.6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40% / .8))' assert_equals: expected "rgba(108, 103, 66, 0.85)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in hsl, 25% hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))' assert_true: 'color-mix(in hsl, 25% hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))' is a supported value for color. expected true got false FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4), 25% hsl(30deg 30% 40% / .8))' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20% / .4), 25% hsl(30deg 30% 40% / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8) 25%)' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 25%, hsl(30deg 30% 40% / .8) 75%)' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 25%, hsl(30deg 30% 40% / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 30%, hsl(30deg 30% 40% / .8) 90%)' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 30%, hsl(30deg 30% 40% / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 12.5%, hsl(30deg 30% 40% / .8) 37.5%)' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 12.5%, hsl(30deg 30% 40% / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 0%, hsl(30deg 30% 40% / .8))' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 0%, hsl(30deg 30% 40% / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' assert_true: 'color-mix(in hsl, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' assert_true: 'color-mix(in hsl, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' assert_true: 'color-mix(in hsl, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' assert_true: 'color-mix(in hsl, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' assert_true: 'color-mix(in hsl, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' assert_true: 'color-mix(in hsl, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl shorter hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' assert_true: 'color-mix(in hsl shorter hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl shorter hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' assert_true: 'color-mix(in hsl shorter hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl shorter hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' assert_true: 'color-mix(in hsl shorter hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl shorter hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' assert_true: 'color-mix(in hsl shorter hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl shorter hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' assert_true: 'color-mix(in hsl shorter hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl shorter hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' assert_true: 'color-mix(in hsl shorter hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl longer hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' assert_true: 'color-mix(in hsl longer hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl longer hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' assert_true: 'color-mix(in hsl longer hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl longer hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' assert_true: 'color-mix(in hsl longer hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl longer hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' assert_true: 'color-mix(in hsl longer hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl longer hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' assert_true: 'color-mix(in hsl longer hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl longer hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' assert_true: 'color-mix(in hsl longer hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl increasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' assert_true: 'color-mix(in hsl increasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl increasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' assert_true: 'color-mix(in hsl increasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl increasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' assert_true: 'color-mix(in hsl increasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl increasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' assert_true: 'color-mix(in hsl increasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl increasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' assert_true: 'color-mix(in hsl increasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl increasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' assert_true: 'color-mix(in hsl increasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl decreasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' assert_true: 'color-mix(in hsl decreasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl decreasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' assert_true: 'color-mix(in hsl decreasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl decreasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' assert_true: 'color-mix(in hsl decreasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl decreasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' assert_true: 'color-mix(in hsl decreasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl decreasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' assert_true: 'color-mix(in hsl decreasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl decreasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' assert_true: 'color-mix(in hsl decreasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl specified hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' assert_true: 'color-mix(in hsl specified hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl specified hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' assert_true: 'color-mix(in hsl specified hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl specified hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' assert_true: 'color-mix(in hsl specified hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl specified hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' assert_true: 'color-mix(in hsl specified hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl specified hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' assert_true: 'color-mix(in hsl specified hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl specified hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' assert_true: 'color-mix(in hsl specified hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(none none none), hsl(none none none))' assert_true: 'color-mix(in hsl, hsl(none none none), hsl(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(none none none), hsl(30deg 40% 80%))' assert_true: 'color-mix(in hsl, hsl(none none none), hsl(30deg 40% 80%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 20% 40%), hsl(none none none))' assert_true: 'color-mix(in hsl, hsl(120deg 20% 40%), hsl(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 20% none), hsl(30deg 40% 60%))' assert_true: 'color-mix(in hsl, hsl(120deg 20% none), hsl(30deg 40% 60%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 20% 40%), hsl(30deg 20% none))' assert_true: 'color-mix(in hsl, hsl(120deg 20% 40%), hsl(30deg 20% none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(none 20% 40%), hsl(30deg none 80%))' assert_true: 'color-mix(in hsl, hsl(none 20% 40%), hsl(30deg none 80%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40%))' assert_true: 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / 0.5))' assert_true: 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / none))' assert_true: 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hsl, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hsl, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8) 25%)' assert_equals: expected "rgba(68, 84, 59, 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 25%, hsl(30deg 30% 40% / .8) 75%)' assert_equals: expected "rgba(121, 114, 69, 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 30%, hsl(30deg 30% 40% / .8) 90%)' assert_equals: expected "rgba(121, 114, 69, 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 12.5%, hsl(30deg 30% 40% / .8) 37.5%)' assert_equals: expected "rgba(121, 114, 69, 0.35)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 0%, hsl(30deg 30% 40% / .8))' +FAIL Property color value 'color-mix(in hsl, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' assert_equals: expected "rgb(191, 170, 64)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' assert_equals: expected "rgb(191, 170, 64)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' assert_equals: expected "rgb(191, 85, 64)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' assert_equals: expected "rgb(191, 85, 64)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' assert_equals: expected "rgb(191, 64, 85)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' assert_equals: expected "rgb(191, 64, 85)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl shorter hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' assert_equals: expected "rgb(191, 170, 64)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl shorter hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' assert_equals: expected "rgb(191, 170, 64)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl shorter hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' assert_equals: expected "rgb(191, 85, 64)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl shorter hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' assert_equals: expected "rgb(191, 85, 64)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl shorter hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' assert_equals: expected "rgb(191, 64, 85)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl shorter hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' assert_equals: expected "rgb(191, 64, 85)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl longer hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' assert_equals: expected "rgb(64, 85, 191)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl longer hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' assert_equals: expected "rgb(64, 85, 191)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl longer hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' assert_equals: expected "rgb(64, 170, 191)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl longer hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' assert_equals: expected "rgb(64, 170, 191)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl longer hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' assert_equals: expected "rgb(64, 191, 170)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl longer hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' assert_equals: expected "rgb(64, 191, 170)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl increasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' assert_equals: expected "rgb(191, 170, 64)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl increasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' assert_equals: expected "rgb(64, 85, 191)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl increasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' assert_equals: expected "rgb(64, 170, 191)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl increasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' assert_equals: expected "rgb(191, 85, 64)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl increasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' assert_equals: expected "rgb(64, 191, 170)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl increasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' assert_equals: expected "rgb(191, 64, 85)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl decreasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' assert_equals: expected "rgb(64, 85, 191)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl decreasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' assert_equals: expected "rgb(191, 170, 64)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl decreasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' assert_equals: expected "rgb(191, 85, 64)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl decreasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' assert_equals: expected "rgb(64, 170, 191)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl decreasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' assert_equals: expected "rgb(191, 64, 85)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl decreasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' assert_equals: expected "rgb(64, 191, 170)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl specified hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' assert_equals: expected "rgb(191, 170, 64)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl specified hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' assert_equals: expected "rgb(191, 170, 64)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl specified hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' assert_equals: expected "rgb(64, 170, 191)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl specified hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' assert_equals: expected "rgb(64, 170, 191)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl specified hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' assert_equals: expected "rgb(64, 191, 170)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl specified hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' assert_equals: expected "rgb(64, 191, 170)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(none none none), hsl(none none none))' assert_equals: expected "rgb(0, 0, 0)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(none none none), hsl(30deg 40% 80%))' assert_equals: expected "rgb(224, 204, 184)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(120deg 20% 40%), hsl(none none none))' assert_equals: expected "rgb(82, 122, 82)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(120deg 20% none), hsl(30deg 40% 60%))' assert_equals: expected "rgb(168, 184, 122)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(120deg 20% 40%), hsl(30deg 20% none))' assert_equals: expected "rgb(112, 122, 82)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(none 20% 40%), hsl(30deg none 80%))' assert_equals: expected "rgb(173, 153, 133)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40%))' assert_equals: expected "rgb(143, 143, 61)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / 0.5))' assert_equals: expected "rgba(143, 143, 61, 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / none))' assert_equals: expected "rgba(143, 143, 61, 0)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)' assert_equals: expected "rgb(0, 249, 66)" but got "color(display-p3 0 1 0)" +FAIL Property color value 'color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' assert_equals: expected "rgb(255, 255, 255)" but got "lab(100 104.3 -50.9)" +FAIL Property color value 'color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' assert_equals: expected "rgb(42, 0, 34)" but got "lab(0 104.3 -50.9)" +FAIL Property color value 'color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)' assert_equals: expected "rgb(255, 255, 255)" but got "lch(100 116 334)" +FAIL Property color value 'color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)' assert_equals: expected "rgb(42, 0, 34)" but got "lch(0 116 334)" +FAIL Property color value 'color-mix(in hsl, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' assert_equals: expected "rgb(255, 255, 255)" but got "oklab(100 0.365 -0.16)" +FAIL Property color value 'color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' assert_equals: expected "rgb(0, 0, 0)" but got "oklab(0 0.365 -0.16)" +FAIL Property color value 'color-mix(in hsl, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' assert_equals: expected "rgb(255, 255, 255)" but got "oklch(100 0.399 336.3)" +FAIL Property color value 'color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' assert_equals: expected "rgb(0, 0, 0)" but got "oklch(0 0.399 336.3)" +FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%))' assert_equals: expected "rgb(147, 179, 52)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%))' assert_equals: expected "rgb(166, 153, 64)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in hwb, 25% hwb(120deg 10% 20%), hwb(30deg 30% 40%))' assert_true: 'color-mix(in hwb, 25% hwb(120deg 10% 20%), hwb(30deg 30% 40%))' is a supported value for color. expected true got false FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%) 25%)' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%) 75%)' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 30%, hwb(30deg 30% 40%) 90%)' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%) 30%, hwb(30deg 30% 40%) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 12.5%, hwb(30deg 30% 40%) 37.5%)' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%) 12.5%, hwb(30deg 30% 40%) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 0%, hwb(30deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%) 0%, hwb(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%) 25%)' assert_equals: expected "rgb(96, 191, 39)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%) 75%)' assert_equals: expected "rgb(166, 153, 64)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 30%, hwb(30deg 30% 40%) 90%)' assert_equals: expected "rgb(166, 153, 64)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 12.5%, hwb(30deg 30% 40%) 37.5%)' assert_equals: expected "rgba(166, 153, 64, 0.5)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 0%, hwb(30deg 30% 40%))' +FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))' assert_equals: expected "rgba(143, 170, 60, 0.6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8))' assert_equals: expected "rgba(160, 149, 70, 0.7)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in hwb, 25% hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))' assert_true: 'color-mix(in hwb, 25% hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))' is a supported value for color. expected true got false FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40% / .8))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40% / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8) 25%)' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8) 75%)' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 30%, hwb(30deg 30% 40% / .8) 90%)' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 30%, hwb(30deg 30% 40% / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 12.5%, hwb(30deg 30% 40% / .8) 37.5%)' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 12.5%, hwb(30deg 30% 40% / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 0%, hwb(30deg 30% 40% / .8))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 0%, hwb(30deg 30% 40% / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb shorter hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' assert_true: 'color-mix(in hwb shorter hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb shorter hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' assert_true: 'color-mix(in hwb shorter hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb shorter hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' assert_true: 'color-mix(in hwb shorter hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb shorter hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' assert_true: 'color-mix(in hwb shorter hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb shorter hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' assert_true: 'color-mix(in hwb shorter hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb shorter hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' assert_true: 'color-mix(in hwb shorter hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb longer hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' assert_true: 'color-mix(in hwb longer hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb longer hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' assert_true: 'color-mix(in hwb longer hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb longer hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' assert_true: 'color-mix(in hwb longer hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb longer hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' assert_true: 'color-mix(in hwb longer hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb longer hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' assert_true: 'color-mix(in hwb longer hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb longer hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' assert_true: 'color-mix(in hwb longer hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb increasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' assert_true: 'color-mix(in hwb increasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb increasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' assert_true: 'color-mix(in hwb increasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb increasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' assert_true: 'color-mix(in hwb increasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb increasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' assert_true: 'color-mix(in hwb increasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb increasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' assert_true: 'color-mix(in hwb increasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb increasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' assert_true: 'color-mix(in hwb increasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb decreasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' assert_true: 'color-mix(in hwb decreasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb decreasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' assert_true: 'color-mix(in hwb decreasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb decreasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' assert_true: 'color-mix(in hwb decreasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb decreasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' assert_true: 'color-mix(in hwb decreasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb decreasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' assert_true: 'color-mix(in hwb decreasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb decreasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' assert_true: 'color-mix(in hwb decreasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb specified hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' assert_true: 'color-mix(in hwb specified hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb specified hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' assert_true: 'color-mix(in hwb specified hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb specified hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' assert_true: 'color-mix(in hwb specified hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb specified hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' assert_true: 'color-mix(in hwb specified hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb specified hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' assert_true: 'color-mix(in hwb specified hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb specified hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' assert_true: 'color-mix(in hwb specified hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(none none none), hwb(none none none))' assert_true: 'color-mix(in hwb, hwb(none none none), hwb(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(none none none), hwb(30deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(none none none), hwb(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(none none none))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% none), hwb(30deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(120deg 10% none), hwb(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% none))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(none 10% 20%), hwb(30deg none 40%))' assert_true: 'color-mix(in hwb, hwb(none 10% 20%), hwb(30deg none 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / 0.5))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / none))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hwb, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hwb, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 30deg), lch(50 60 70deg))' assert_true: 'color-mix(in lch, lch(10 20 30deg), lch(50 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 30deg) 25%, lch(50 60 70deg))' assert_true: 'color-mix(in lch, lch(10 20 30deg) 25%, lch(50 60 70deg))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8) 25%)' assert_equals: expected "rgba(98, 184, 46, 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8) 75%)' assert_equals: expected "rgba(160, 149, 70, 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 30%, hwb(30deg 30% 40% / .8) 90%)' assert_equals: expected "rgba(160, 149, 70, 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 12.5%, hwb(30deg 30% 40% / .8) 37.5%)' assert_equals: expected "rgba(160, 149, 70, 0.35)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 0%, hwb(30deg 30% 40% / .8))' +FAIL Property color value 'color-mix(in hwb, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' assert_equals: expected "rgb(153, 140, 77)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' assert_equals: expected "rgb(153, 140, 77)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' assert_equals: expected "rgb(153, 89, 77)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' assert_equals: expected "rgb(153, 89, 77)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' assert_equals: expected "rgb(153, 77, 89)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' assert_equals: expected "rgb(153, 77, 89)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb shorter hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' assert_equals: expected "rgb(153, 140, 77)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb shorter hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' assert_equals: expected "rgb(153, 140, 77)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb shorter hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' assert_equals: expected "rgb(153, 89, 77)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb shorter hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' assert_equals: expected "rgb(153, 89, 77)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb shorter hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' assert_equals: expected "rgb(153, 77, 89)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb shorter hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' assert_equals: expected "rgb(153, 77, 89)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb longer hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' assert_equals: expected "rgb(77, 89, 153)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb longer hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' assert_equals: expected "rgb(77, 89, 153)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb longer hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' assert_equals: expected "rgb(77, 140, 153)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb longer hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' assert_equals: expected "rgb(77, 140, 153)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb longer hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' assert_equals: expected "rgb(77, 153, 140)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb longer hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' assert_equals: expected "rgb(77, 153, 140)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb increasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' assert_equals: expected "rgb(153, 140, 77)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb increasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' assert_equals: expected "rgb(77, 89, 153)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb increasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' assert_equals: expected "rgb(77, 140, 153)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb increasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' assert_equals: expected "rgb(153, 89, 77)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb increasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' assert_equals: expected "rgb(77, 153, 140)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb increasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' assert_equals: expected "rgb(153, 77, 89)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb decreasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' assert_equals: expected "rgb(77, 89, 153)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb decreasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' assert_equals: expected "rgb(153, 140, 77)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb decreasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' assert_equals: expected "rgb(153, 89, 77)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb decreasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' assert_equals: expected "rgb(77, 140, 153)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb decreasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' assert_equals: expected "rgb(153, 77, 89)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb decreasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' assert_equals: expected "rgb(77, 153, 140)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb specified hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' assert_equals: expected "rgb(153, 140, 77)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb specified hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' assert_equals: expected "rgb(153, 140, 77)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb specified hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' assert_equals: expected "rgb(77, 140, 153)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb specified hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' assert_equals: expected "rgb(77, 140, 153)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb specified hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' assert_equals: expected "rgb(77, 153, 140)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb specified hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' assert_equals: expected "rgb(77, 153, 140)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(none none none), hwb(none none none))' assert_equals: expected "rgb(255, 0, 0)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(none none none), hwb(30deg 30% 40%))' assert_equals: expected "rgb(153, 115, 77)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(none none none))' assert_equals: expected "rgb(26, 204, 26)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% none), hwb(30deg 30% 40%))' assert_equals: expected "rgb(127, 153, 51)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% none))' assert_equals: expected "rgb(166, 204, 51)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(none 10% 20%), hwb(30deg none 40%))' assert_equals: expected "rgb(179, 102, 26)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40%))' assert_equals: expected "rgb(147, 179, 51)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / 0.5))' assert_equals: expected "rgba(147, 179, 51, 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / none))' assert_equals: expected "rgba(147, 179, 51, 0)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)' assert_equals: expected "rgb(0, 249, 66)" but got "color(display-p3 0 1 0)" +FAIL Property color value 'color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' assert_equals: expected "rgb(255, 255, 255)" but got "lab(100 104.3 -50.9)" +FAIL Property color value 'color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' assert_equals: expected "rgb(42, 0, 34)" but got "lab(0 104.3 -50.9)" +FAIL Property color value 'color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)' assert_equals: expected "rgb(255, 255, 255)" but got "lch(100 116 334)" +FAIL Property color value 'color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)' assert_equals: expected "rgb(42, 0, 34)" but got "lch(0 116 334)" +FAIL Property color value 'color-mix(in hwb, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' assert_equals: expected "rgb(255, 255, 255)" but got "oklab(100 0.365 -0.16)" +FAIL Property color value 'color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' assert_equals: expected "rgb(0, 0, 0)" but got "oklab(0 0.365 -0.16)" +FAIL Property color value 'color-mix(in hwb, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' assert_equals: expected "rgb(255, 255, 255)" but got "oklch(100 0.399 336.3)" +FAIL Property color value 'color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' assert_equals: expected "rgb(0, 0, 0)" but got "oklch(0 0.399 336.3)" +FAIL Property color value 'color-mix(in lch, lch(10 20 30deg), lch(50 60 70deg))' assert_equals: expected "lch(30 40 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(10 20 30deg) 25%, lch(50 60 70deg))' assert_equals: expected "lch(40 50 60)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in lch, 25% lch(10 20 30deg), lch(50 60 70deg))' assert_true: 'color-mix(in lch, 25% lch(10 20 30deg), lch(50 60 70deg))' is a supported value for color. expected true got false FAIL Property color value 'color-mix(in lch, lch(10 20 30deg), 25% lch(50 60 70deg))' assert_true: 'color-mix(in lch, lch(10 20 30deg), 25% lch(50 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 30deg), lch(50 60 70deg) 25%)' assert_true: 'color-mix(in lch, lch(10 20 30deg), lch(50 60 70deg) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 30deg) 25%, lch(50 60 70deg) 75%)' assert_true: 'color-mix(in lch, lch(10 20 30deg) 25%, lch(50 60 70deg) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 30deg) 30%, lch(50 60 70deg) 90%)' assert_true: 'color-mix(in lch, lch(10 20 30deg) 30%, lch(50 60 70deg) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 30deg) 12.5%, lch(50 60 70deg) 37.5%)' assert_true: 'color-mix(in lch, lch(10 20 30deg) 12.5%, lch(50 60 70deg) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 30deg) 0%, lch(50 60 70deg))' assert_true: 'color-mix(in lch, lch(10 20 30deg) 0%, lch(50 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / .4), lch(50 60 70deg / .8))' assert_true: 'color-mix(in lch, lch(10 20 30deg / .4), lch(50 60 70deg / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / .4) 25%, lch(50 60 70deg / .8))' assert_true: 'color-mix(in lch, lch(10 20 30deg / .4) 25%, lch(50 60 70deg / .8))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in lch, lch(10 20 30deg), lch(50 60 70deg) 25%)' assert_equals: expected "lch(20 30 40)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(10 20 30deg) 25%, lch(50 60 70deg) 75%)' assert_equals: expected "lch(40 50 60)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(10 20 30deg) 30%, lch(50 60 70deg) 90%)' assert_equals: expected "lch(40 50 60)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(10 20 30deg) 12.5%, lch(50 60 70deg) 37.5%)' assert_equals: expected "lch(40 50 60 / 0.5)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in lch, lch(10 20 30deg) 0%, lch(50 60 70deg))' +FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / .4), lch(50 60 70deg / .8))' assert_equals: expected "lch(36.666664 46.666664 50 / 0.6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / .4) 25%, lch(50 60 70deg / .8))' assert_equals: expected "lch(44.285713 54.285717 60 / 0.7)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in lch, 25% lch(10 20 30deg / .4), lch(50 60 70deg / .8))' assert_true: 'color-mix(in lch, 25% lch(10 20 30deg / .4), lch(50 60 70deg / .8))' is a supported value for color. expected true got false FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / .4), 25% lch(50 60 70deg / .8))' assert_true: 'color-mix(in lch, lch(10 20 30deg / .4), 25% lch(50 60 70deg / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / .4), lch(50 60 70deg / .8) 25%)' assert_true: 'color-mix(in lch, lch(10 20 30deg / .4), lch(50 60 70deg / .8) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / .4) 25%, lch(50 60 70deg / .8) 75%)' assert_true: 'color-mix(in lch, lch(10 20 30deg / .4) 25%, lch(50 60 70deg / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / .4) 30%, lch(50 60 70deg / .8) 90%)' assert_true: 'color-mix(in lch, lch(10 20 30deg / .4) 30%, lch(50 60 70deg / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / .4) 12.5%, lch(50 60 70deg / .8) 37.5%)' assert_true: 'color-mix(in lch, lch(10 20 30deg / .4) 12.5%, lch(50 60 70deg / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / .4) 0%, lch(50 60 70deg / .8))' assert_true: 'color-mix(in lch, lch(10 20 30deg / .4) 0%, lch(50 60 70deg / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(100 0 40deg), lch(100 0 60deg))' assert_true: 'color-mix(in lch, lch(100 0 40deg), lch(100 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(100 0 60deg), lch(100 0 40deg))' assert_true: 'color-mix(in lch, lch(100 0 60deg), lch(100 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(100 0 50deg), lch(100 0 330deg))' assert_true: 'color-mix(in lch, lch(100 0 50deg), lch(100 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(100 0 330deg), lch(100 0 50deg))' assert_true: 'color-mix(in lch, lch(100 0 330deg), lch(100 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(100 0 20deg), lch(100 0 320deg))' assert_true: 'color-mix(in lch, lch(100 0 20deg), lch(100 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(100 0 320deg), lch(100 0 20deg))' assert_true: 'color-mix(in lch, lch(100 0 320deg), lch(100 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch shorter hue, lch(100 0 40deg), lch(100 0 60deg))' assert_true: 'color-mix(in lch shorter hue, lch(100 0 40deg), lch(100 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch shorter hue, lch(100 0 60deg), lch(100 0 40deg))' assert_true: 'color-mix(in lch shorter hue, lch(100 0 60deg), lch(100 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch shorter hue, lch(100 0 50deg), lch(100 0 330deg))' assert_true: 'color-mix(in lch shorter hue, lch(100 0 50deg), lch(100 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch shorter hue, lch(100 0 330deg), lch(100 0 50deg))' assert_true: 'color-mix(in lch shorter hue, lch(100 0 330deg), lch(100 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch shorter hue, lch(100 0 20deg), lch(100 0 320deg))' assert_true: 'color-mix(in lch shorter hue, lch(100 0 20deg), lch(100 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch shorter hue, lch(100 0 320deg), lch(100 0 20deg))' assert_true: 'color-mix(in lch shorter hue, lch(100 0 320deg), lch(100 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch longer hue, lch(100 0 40deg), lch(100 0 60deg))' assert_true: 'color-mix(in lch longer hue, lch(100 0 40deg), lch(100 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch longer hue, lch(100 0 60deg), lch(100 0 40deg))' assert_true: 'color-mix(in lch longer hue, lch(100 0 60deg), lch(100 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch longer hue, lch(100 0 50deg), lch(100 0 330deg))' assert_true: 'color-mix(in lch longer hue, lch(100 0 50deg), lch(100 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch longer hue, lch(100 0 330deg), lch(100 0 50deg))' assert_true: 'color-mix(in lch longer hue, lch(100 0 330deg), lch(100 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch longer hue, lch(100 0 20deg), lch(100 0 320deg))' assert_true: 'color-mix(in lch longer hue, lch(100 0 20deg), lch(100 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch longer hue, lch(100 0 320deg), lch(100 0 20deg))' assert_true: 'color-mix(in lch longer hue, lch(100 0 320deg), lch(100 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch increasing hue, lch(100 0 40deg), lch(100 0 60deg))' assert_true: 'color-mix(in lch increasing hue, lch(100 0 40deg), lch(100 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch increasing hue, lch(100 0 60deg), lch(100 0 40deg))' assert_true: 'color-mix(in lch increasing hue, lch(100 0 60deg), lch(100 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch increasing hue, lch(100 0 50deg), lch(100 0 330deg))' assert_true: 'color-mix(in lch increasing hue, lch(100 0 50deg), lch(100 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch increasing hue, lch(100 0 330deg), lch(100 0 50deg))' assert_true: 'color-mix(in lch increasing hue, lch(100 0 330deg), lch(100 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch increasing hue, lch(100 0 20deg), lch(100 0 320deg))' assert_true: 'color-mix(in lch increasing hue, lch(100 0 20deg), lch(100 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch increasing hue, lch(100 0 320deg), lch(100 0 20deg))' assert_true: 'color-mix(in lch increasing hue, lch(100 0 320deg), lch(100 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch decreasing hue, lch(100 0 40deg), lch(100 0 60deg))' assert_true: 'color-mix(in lch decreasing hue, lch(100 0 40deg), lch(100 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch decreasing hue, lch(100 0 60deg), lch(100 0 40deg))' assert_true: 'color-mix(in lch decreasing hue, lch(100 0 60deg), lch(100 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch decreasing hue, lch(100 0 50deg), lch(100 0 330deg))' assert_true: 'color-mix(in lch decreasing hue, lch(100 0 50deg), lch(100 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch decreasing hue, lch(100 0 330deg), lch(100 0 50deg))' assert_true: 'color-mix(in lch decreasing hue, lch(100 0 330deg), lch(100 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch decreasing hue, lch(100 0 20deg), lch(100 0 320deg))' assert_true: 'color-mix(in lch decreasing hue, lch(100 0 20deg), lch(100 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch decreasing hue, lch(100 0 320deg), lch(100 0 20deg))' assert_true: 'color-mix(in lch decreasing hue, lch(100 0 320deg), lch(100 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch specified hue, lch(100 0 40deg), lch(100 0 60deg))' assert_true: 'color-mix(in lch specified hue, lch(100 0 40deg), lch(100 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch specified hue, lch(100 0 60deg), lch(100 0 40deg))' assert_true: 'color-mix(in lch specified hue, lch(100 0 60deg), lch(100 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch specified hue, lch(100 0 50deg), lch(100 0 330deg))' assert_true: 'color-mix(in lch specified hue, lch(100 0 50deg), lch(100 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch specified hue, lch(100 0 330deg), lch(100 0 50deg))' assert_true: 'color-mix(in lch specified hue, lch(100 0 330deg), lch(100 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch specified hue, lch(100 0 20deg), lch(100 0 320deg))' assert_true: 'color-mix(in lch specified hue, lch(100 0 20deg), lch(100 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch specified hue, lch(100 0 320deg), lch(100 0 20deg))' assert_true: 'color-mix(in lch specified hue, lch(100 0 320deg), lch(100 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(none none none), lch(none none none))' assert_true: 'color-mix(in lch, lch(none none none), lch(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(none none none), lch(50 60 70deg))' assert_true: 'color-mix(in lch, lch(none none none), lch(50 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 30deg), lch(none none none))' assert_true: 'color-mix(in lch, lch(10 20 30deg), lch(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 none), lch(50 60 70deg))' assert_true: 'color-mix(in lch, lch(10 20 none), lch(50 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 30deg), lch(50 60 none))' assert_true: 'color-mix(in lch, lch(10 20 30deg), lch(50 60 none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(none 20 30deg), lch(50 none 70deg))' assert_true: 'color-mix(in lch, lch(none 20 30deg), lch(50 none 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / none), lch(50 60 70deg))' assert_true: 'color-mix(in lch, lch(10 20 30deg / none), lch(50 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / none), lch(50 60 70deg / 0.5))' assert_true: 'color-mix(in lch, lch(10 20 30deg / none), lch(50 60 70deg / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / none), lch(50 60 70deg / none))' assert_true: 'color-mix(in lch, lch(10 20 30deg / none), lch(50 60 70deg / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg), oklch(50 60 70deg))' assert_true: 'color-mix(in oklch, oklch(10 20 30deg), oklch(50 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg) 25%, oklch(50 60 70deg))' assert_true: 'color-mix(in oklch, oklch(10 20 30deg) 25%, oklch(50 60 70deg))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / .4), lch(50 60 70deg / .8) 25%)' assert_equals: expected "lch(26 36 40 / 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / .4) 25%, lch(50 60 70deg / .8) 75%)' assert_equals: expected "lch(44.285713 54.285717 60 / 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / .4) 30%, lch(50 60 70deg / .8) 90%)' assert_equals: expected "lch(44.285713 54.285717 60 / 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / .4) 12.5%, lch(50 60 70deg / .8) 37.5%)' assert_equals: expected "lch(44.285713 54.285717 60 / 0.35)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in lch, lch(10 20 30deg / .4) 0%, lch(50 60 70deg / .8))' +FAIL Property color value 'color-mix(in lch, lch(100 0 40deg), lch(100 0 60deg))' assert_equals: expected "lch(100 0 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(100 0 60deg), lch(100 0 40deg))' assert_equals: expected "lch(100 0 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(100 0 50deg), lch(100 0 330deg))' assert_equals: expected "lch(100 0 10)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(100 0 330deg), lch(100 0 50deg))' assert_equals: expected "lch(100 0 10)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(100 0 20deg), lch(100 0 320deg))' assert_equals: expected "lch(100 0 350)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(100 0 320deg), lch(100 0 20deg))' assert_equals: expected "lch(100 0 350)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch shorter hue, lch(100 0 40deg), lch(100 0 60deg))' assert_equals: expected "lch(100 0 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch shorter hue, lch(100 0 60deg), lch(100 0 40deg))' assert_equals: expected "lch(100 0 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch shorter hue, lch(100 0 50deg), lch(100 0 330deg))' assert_equals: expected "lch(100 0 10)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch shorter hue, lch(100 0 330deg), lch(100 0 50deg))' assert_equals: expected "lch(100 0 10)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch shorter hue, lch(100 0 20deg), lch(100 0 320deg))' assert_equals: expected "lch(100 0 350)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch shorter hue, lch(100 0 320deg), lch(100 0 20deg))' assert_equals: expected "lch(100 0 350)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch longer hue, lch(100 0 40deg), lch(100 0 60deg))' assert_equals: expected "lch(100 0 230)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch longer hue, lch(100 0 60deg), lch(100 0 40deg))' assert_equals: expected "lch(100 0 230)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch longer hue, lch(100 0 50deg), lch(100 0 330deg))' assert_equals: expected "lch(100 0 190)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch longer hue, lch(100 0 330deg), lch(100 0 50deg))' assert_equals: expected "lch(100 0 190)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch longer hue, lch(100 0 20deg), lch(100 0 320deg))' assert_equals: expected "lch(100 0 170)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch longer hue, lch(100 0 320deg), lch(100 0 20deg))' assert_equals: expected "lch(100 0 170)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch increasing hue, lch(100 0 40deg), lch(100 0 60deg))' assert_equals: expected "lch(100 0 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch increasing hue, lch(100 0 60deg), lch(100 0 40deg))' assert_equals: expected "lch(100 0 230)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch increasing hue, lch(100 0 50deg), lch(100 0 330deg))' assert_equals: expected "lch(100 0 190)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch increasing hue, lch(100 0 330deg), lch(100 0 50deg))' assert_equals: expected "lch(100 0 10)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch increasing hue, lch(100 0 20deg), lch(100 0 320deg))' assert_equals: expected "lch(100 0 170)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch increasing hue, lch(100 0 320deg), lch(100 0 20deg))' assert_equals: expected "lch(100 0 350)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch decreasing hue, lch(100 0 40deg), lch(100 0 60deg))' assert_equals: expected "lch(100 0 230)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch decreasing hue, lch(100 0 60deg), lch(100 0 40deg))' assert_equals: expected "lch(100 0 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch decreasing hue, lch(100 0 50deg), lch(100 0 330deg))' assert_equals: expected "lch(100 0 10)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch decreasing hue, lch(100 0 330deg), lch(100 0 50deg))' assert_equals: expected "lch(100 0 190)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch decreasing hue, lch(100 0 20deg), lch(100 0 320deg))' assert_equals: expected "lch(100 0 350)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch decreasing hue, lch(100 0 320deg), lch(100 0 20deg))' assert_equals: expected "lch(100 0 170)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch specified hue, lch(100 0 40deg), lch(100 0 60deg))' assert_equals: expected "lch(100 0 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch specified hue, lch(100 0 60deg), lch(100 0 40deg))' assert_equals: expected "lch(100 0 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch specified hue, lch(100 0 50deg), lch(100 0 330deg))' assert_equals: expected "lch(100 0 190)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch specified hue, lch(100 0 330deg), lch(100 0 50deg))' assert_equals: expected "lch(100 0 190)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch specified hue, lch(100 0 20deg), lch(100 0 320deg))' assert_equals: expected "lch(100 0 170)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch specified hue, lch(100 0 320deg), lch(100 0 20deg))' assert_equals: expected "lch(100 0 170)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(none none none), lch(none none none))' assert_equals: expected "lch(none none none)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(none none none), lch(50 60 70deg))' assert_equals: expected "lch(50 60 70)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(10 20 30deg), lch(none none none))' assert_equals: expected "lch(10 20 30)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(10 20 none), lch(50 60 70deg))' assert_equals: expected "lch(30 40 70)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(10 20 30deg), lch(50 60 none))' assert_equals: expected "lch(30 40 30)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(none 20 30deg), lch(50 none 70deg))' assert_equals: expected "lch(50 20 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / none), lch(50 60 70deg))' assert_equals: expected "lch(30 40 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / none), lch(50 60 70deg / 0.5))' assert_equals: expected "lch(30 40 50 / 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lch, lch(10 20 30deg / none), lch(50 60 70deg / none))' assert_equals: expected "lch(30 40 50 / none)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg), oklch(50 60 70deg))' assert_equals: expected "oklch(30 40 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg) 25%, oklch(50 60 70deg))' assert_equals: expected "oklch(40 50 60)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in oklch, 25% oklch(10 20 30deg), oklch(50 60 70deg))' assert_true: 'color-mix(in oklch, 25% oklch(10 20 30deg), oklch(50 60 70deg))' is a supported value for color. expected true got false FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg), 25% oklch(50 60 70deg))' assert_true: 'color-mix(in oklch, oklch(10 20 30deg), 25% oklch(50 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg), oklch(50 60 70deg) 25%)' assert_true: 'color-mix(in oklch, oklch(10 20 30deg), oklch(50 60 70deg) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg) 25%, oklch(50 60 70deg) 75%)' assert_true: 'color-mix(in oklch, oklch(10 20 30deg) 25%, oklch(50 60 70deg) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg) 30%, oklch(50 60 70deg) 90%)' assert_true: 'color-mix(in oklch, oklch(10 20 30deg) 30%, oklch(50 60 70deg) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg) 12.5%, oklch(50 60 70deg) 37.5%)' assert_true: 'color-mix(in oklch, oklch(10 20 30deg) 12.5%, oklch(50 60 70deg) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg) 0%, oklch(50 60 70deg))' assert_true: 'color-mix(in oklch, oklch(10 20 30deg) 0%, oklch(50 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / .4), oklch(50 60 70deg / .8))' assert_true: 'color-mix(in oklch, oklch(10 20 30deg / .4), oklch(50 60 70deg / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / .4) 25%, oklch(50 60 70deg / .8))' assert_true: 'color-mix(in oklch, oklch(10 20 30deg / .4) 25%, oklch(50 60 70deg / .8))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg), oklch(50 60 70deg) 25%)' assert_equals: expected "oklch(20 30 40)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg) 25%, oklch(50 60 70deg) 75%)' assert_equals: expected "oklch(40 50 60)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg) 30%, oklch(50 60 70deg) 90%)' assert_equals: expected "oklch(40 50 60)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg) 12.5%, oklch(50 60 70deg) 37.5%)' assert_equals: expected "oklch(40 50 60 / 0.5)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in oklch, oklch(10 20 30deg) 0%, oklch(50 60 70deg))' +FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / .4), oklch(50 60 70deg / .8))' assert_equals: expected "oklch(36.666664 46.666664 50 / 0.6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / .4) 25%, oklch(50 60 70deg / .8))' assert_equals: expected "oklch(44.285713 54.285717 60 / 0.7)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in oklch, 25% oklch(10 20 30deg / .4), oklch(50 60 70deg / .8))' assert_true: 'color-mix(in oklch, 25% oklch(10 20 30deg / .4), oklch(50 60 70deg / .8))' is a supported value for color. expected true got false FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / .4), 25% oklch(50 60 70deg / .8))' assert_true: 'color-mix(in oklch, oklch(10 20 30deg / .4), 25% oklch(50 60 70deg / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / .4), oklch(50 60 70deg / .8) 25%)' assert_true: 'color-mix(in oklch, oklch(10 20 30deg / .4), oklch(50 60 70deg / .8) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / .4) 25%, oklch(50 60 70deg / .8) 75%)' assert_true: 'color-mix(in oklch, oklch(10 20 30deg / .4) 25%, oklch(50 60 70deg / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / .4) 30%, oklch(50 60 70deg / .8) 90%)' assert_true: 'color-mix(in oklch, oklch(10 20 30deg / .4) 30%, oklch(50 60 70deg / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / .4) 12.5%, oklch(50 60 70deg / .8) 37.5%)' assert_true: 'color-mix(in oklch, oklch(10 20 30deg / .4) 12.5%, oklch(50 60 70deg / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / .4) 0%, oklch(50 60 70deg / .8))' assert_true: 'color-mix(in oklch, oklch(10 20 30deg / .4) 0%, oklch(50 60 70deg / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(100 0 40deg), oklch(100 0 60deg))' assert_true: 'color-mix(in oklch, oklch(100 0 40deg), oklch(100 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(100 0 60deg), oklch(100 0 40deg))' assert_true: 'color-mix(in oklch, oklch(100 0 60deg), oklch(100 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(100 0 50deg), oklch(100 0 330deg))' assert_true: 'color-mix(in oklch, oklch(100 0 50deg), oklch(100 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(100 0 330deg), oklch(100 0 50deg))' assert_true: 'color-mix(in oklch, oklch(100 0 330deg), oklch(100 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(100 0 20deg), oklch(100 0 320deg))' assert_true: 'color-mix(in oklch, oklch(100 0 20deg), oklch(100 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(100 0 320deg), oklch(100 0 20deg))' assert_true: 'color-mix(in oklch, oklch(100 0 320deg), oklch(100 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch shorter hue, oklch(100 0 40deg), oklch(100 0 60deg))' assert_true: 'color-mix(in oklch shorter hue, oklch(100 0 40deg), oklch(100 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch shorter hue, oklch(100 0 60deg), oklch(100 0 40deg))' assert_true: 'color-mix(in oklch shorter hue, oklch(100 0 60deg), oklch(100 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch shorter hue, oklch(100 0 50deg), oklch(100 0 330deg))' assert_true: 'color-mix(in oklch shorter hue, oklch(100 0 50deg), oklch(100 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch shorter hue, oklch(100 0 330deg), oklch(100 0 50deg))' assert_true: 'color-mix(in oklch shorter hue, oklch(100 0 330deg), oklch(100 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch shorter hue, oklch(100 0 20deg), oklch(100 0 320deg))' assert_true: 'color-mix(in oklch shorter hue, oklch(100 0 20deg), oklch(100 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch shorter hue, oklch(100 0 320deg), oklch(100 0 20deg))' assert_true: 'color-mix(in oklch shorter hue, oklch(100 0 320deg), oklch(100 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch longer hue, oklch(100 0 40deg), oklch(100 0 60deg))' assert_true: 'color-mix(in oklch longer hue, oklch(100 0 40deg), oklch(100 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch longer hue, oklch(100 0 60deg), oklch(100 0 40deg))' assert_true: 'color-mix(in oklch longer hue, oklch(100 0 60deg), oklch(100 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch longer hue, oklch(100 0 50deg), oklch(100 0 330deg))' assert_true: 'color-mix(in oklch longer hue, oklch(100 0 50deg), oklch(100 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch longer hue, oklch(100 0 330deg), oklch(100 0 50deg))' assert_true: 'color-mix(in oklch longer hue, oklch(100 0 330deg), oklch(100 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch longer hue, oklch(100 0 20deg), oklch(100 0 320deg))' assert_true: 'color-mix(in oklch longer hue, oklch(100 0 20deg), oklch(100 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch longer hue, oklch(100 0 320deg), oklch(100 0 20deg))' assert_true: 'color-mix(in oklch longer hue, oklch(100 0 320deg), oklch(100 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch increasing hue, oklch(100 0 40deg), oklch(100 0 60deg))' assert_true: 'color-mix(in oklch increasing hue, oklch(100 0 40deg), oklch(100 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch increasing hue, oklch(100 0 60deg), oklch(100 0 40deg))' assert_true: 'color-mix(in oklch increasing hue, oklch(100 0 60deg), oklch(100 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch increasing hue, oklch(100 0 50deg), oklch(100 0 330deg))' assert_true: 'color-mix(in oklch increasing hue, oklch(100 0 50deg), oklch(100 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch increasing hue, oklch(100 0 330deg), oklch(100 0 50deg))' assert_true: 'color-mix(in oklch increasing hue, oklch(100 0 330deg), oklch(100 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch increasing hue, oklch(100 0 20deg), oklch(100 0 320deg))' assert_true: 'color-mix(in oklch increasing hue, oklch(100 0 20deg), oklch(100 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch increasing hue, oklch(100 0 320deg), oklch(100 0 20deg))' assert_true: 'color-mix(in oklch increasing hue, oklch(100 0 320deg), oklch(100 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch decreasing hue, oklch(100 0 40deg), oklch(100 0 60deg))' assert_true: 'color-mix(in oklch decreasing hue, oklch(100 0 40deg), oklch(100 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch decreasing hue, oklch(100 0 60deg), oklch(100 0 40deg))' assert_true: 'color-mix(in oklch decreasing hue, oklch(100 0 60deg), oklch(100 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch decreasing hue, oklch(100 0 50deg), oklch(100 0 330deg))' assert_true: 'color-mix(in oklch decreasing hue, oklch(100 0 50deg), oklch(100 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch decreasing hue, oklch(100 0 330deg), oklch(100 0 50deg))' assert_true: 'color-mix(in oklch decreasing hue, oklch(100 0 330deg), oklch(100 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch decreasing hue, oklch(100 0 20deg), oklch(100 0 320deg))' assert_true: 'color-mix(in oklch decreasing hue, oklch(100 0 20deg), oklch(100 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch decreasing hue, oklch(100 0 320deg), oklch(100 0 20deg))' assert_true: 'color-mix(in oklch decreasing hue, oklch(100 0 320deg), oklch(100 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch specified hue, oklch(100 0 40deg), oklch(100 0 60deg))' assert_true: 'color-mix(in oklch specified hue, oklch(100 0 40deg), oklch(100 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch specified hue, oklch(100 0 60deg), oklch(100 0 40deg))' assert_true: 'color-mix(in oklch specified hue, oklch(100 0 60deg), oklch(100 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch specified hue, oklch(100 0 50deg), oklch(100 0 330deg))' assert_true: 'color-mix(in oklch specified hue, oklch(100 0 50deg), oklch(100 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch specified hue, oklch(100 0 330deg), oklch(100 0 50deg))' assert_true: 'color-mix(in oklch specified hue, oklch(100 0 330deg), oklch(100 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch specified hue, oklch(100 0 20deg), oklch(100 0 320deg))' assert_true: 'color-mix(in oklch specified hue, oklch(100 0 20deg), oklch(100 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch specified hue, oklch(100 0 320deg), oklch(100 0 20deg))' assert_true: 'color-mix(in oklch specified hue, oklch(100 0 320deg), oklch(100 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(none none none), oklch(none none none))' assert_true: 'color-mix(in oklch, oklch(none none none), oklch(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(none none none), oklch(50 60 70deg))' assert_true: 'color-mix(in oklch, oklch(none none none), oklch(50 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg), oklch(none none none))' assert_true: 'color-mix(in oklch, oklch(10 20 30deg), oklch(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 none), oklch(50 60 70deg))' assert_true: 'color-mix(in oklch, oklch(10 20 none), oklch(50 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg), oklch(50 60 none))' assert_true: 'color-mix(in oklch, oklch(10 20 30deg), oklch(50 60 none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(none 20 30deg), oklch(50 none 70deg))' assert_true: 'color-mix(in oklch, oklch(none 20 30deg), oklch(50 none 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / none), oklch(50 60 70deg))' assert_true: 'color-mix(in oklch, oklch(10 20 30deg / none), oklch(50 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / none), oklch(50 60 70deg / 0.5))' assert_true: 'color-mix(in oklch, oklch(10 20 30deg / none), oklch(50 60 70deg / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / none), oklch(50 60 70deg / none))' assert_true: 'color-mix(in oklch, oklch(10 20 30deg / none), oklch(50 60 70deg / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 30), lab(50 60 70))' assert_true: 'color-mix(in lab, lab(10 20 30), lab(50 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70))' assert_true: 'color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / .4), oklch(50 60 70deg / .8) 25%)' assert_equals: expected "oklch(26 36 40 / 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / .4) 25%, oklch(50 60 70deg / .8) 75%)' assert_equals: expected "oklch(44.285713 54.285717 60 / 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / .4) 30%, oklch(50 60 70deg / .8) 90%)' assert_equals: expected "oklch(44.285713 54.285717 60 / 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / .4) 12.5%, oklch(50 60 70deg / .8) 37.5%)' assert_equals: expected "oklch(44.285713 54.285717 60 / 0.35)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in oklch, oklch(10 20 30deg / .4) 0%, oklch(50 60 70deg / .8))' +FAIL Property color value 'color-mix(in oklch, oklch(100 0 40deg), oklch(100 0 60deg))' assert_equals: expected "oklch(100 0 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(100 0 60deg), oklch(100 0 40deg))' assert_equals: expected "oklch(100 0 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(100 0 50deg), oklch(100 0 330deg))' assert_equals: expected "oklch(100 0 10)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(100 0 330deg), oklch(100 0 50deg))' assert_equals: expected "oklch(100 0 10)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(100 0 20deg), oklch(100 0 320deg))' assert_equals: expected "oklch(100 0 350)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(100 0 320deg), oklch(100 0 20deg))' assert_equals: expected "oklch(100 0 350)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch shorter hue, oklch(100 0 40deg), oklch(100 0 60deg))' assert_equals: expected "oklch(100 0 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch shorter hue, oklch(100 0 60deg), oklch(100 0 40deg))' assert_equals: expected "oklch(100 0 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch shorter hue, oklch(100 0 50deg), oklch(100 0 330deg))' assert_equals: expected "oklch(100 0 10)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch shorter hue, oklch(100 0 330deg), oklch(100 0 50deg))' assert_equals: expected "oklch(100 0 10)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch shorter hue, oklch(100 0 20deg), oklch(100 0 320deg))' assert_equals: expected "oklch(100 0 350)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch shorter hue, oklch(100 0 320deg), oklch(100 0 20deg))' assert_equals: expected "oklch(100 0 350)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch longer hue, oklch(100 0 40deg), oklch(100 0 60deg))' assert_equals: expected "oklch(100 0 230)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch longer hue, oklch(100 0 60deg), oklch(100 0 40deg))' assert_equals: expected "oklch(100 0 230)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch longer hue, oklch(100 0 50deg), oklch(100 0 330deg))' assert_equals: expected "oklch(100 0 190)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch longer hue, oklch(100 0 330deg), oklch(100 0 50deg))' assert_equals: expected "oklch(100 0 190)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch longer hue, oklch(100 0 20deg), oklch(100 0 320deg))' assert_equals: expected "oklch(100 0 170)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch longer hue, oklch(100 0 320deg), oklch(100 0 20deg))' assert_equals: expected "oklch(100 0 170)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch increasing hue, oklch(100 0 40deg), oklch(100 0 60deg))' assert_equals: expected "oklch(100 0 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch increasing hue, oklch(100 0 60deg), oklch(100 0 40deg))' assert_equals: expected "oklch(100 0 230)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch increasing hue, oklch(100 0 50deg), oklch(100 0 330deg))' assert_equals: expected "oklch(100 0 190)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch increasing hue, oklch(100 0 330deg), oklch(100 0 50deg))' assert_equals: expected "oklch(100 0 10)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch increasing hue, oklch(100 0 20deg), oklch(100 0 320deg))' assert_equals: expected "oklch(100 0 170)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch increasing hue, oklch(100 0 320deg), oklch(100 0 20deg))' assert_equals: expected "oklch(100 0 350)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch decreasing hue, oklch(100 0 40deg), oklch(100 0 60deg))' assert_equals: expected "oklch(100 0 230)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch decreasing hue, oklch(100 0 60deg), oklch(100 0 40deg))' assert_equals: expected "oklch(100 0 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch decreasing hue, oklch(100 0 50deg), oklch(100 0 330deg))' assert_equals: expected "oklch(100 0 10)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch decreasing hue, oklch(100 0 330deg), oklch(100 0 50deg))' assert_equals: expected "oklch(100 0 190)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch decreasing hue, oklch(100 0 20deg), oklch(100 0 320deg))' assert_equals: expected "oklch(100 0 350)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch decreasing hue, oklch(100 0 320deg), oklch(100 0 20deg))' assert_equals: expected "oklch(100 0 170)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch specified hue, oklch(100 0 40deg), oklch(100 0 60deg))' assert_equals: expected "oklch(100 0 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch specified hue, oklch(100 0 60deg), oklch(100 0 40deg))' assert_equals: expected "oklch(100 0 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch specified hue, oklch(100 0 50deg), oklch(100 0 330deg))' assert_equals: expected "oklch(100 0 190)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch specified hue, oklch(100 0 330deg), oklch(100 0 50deg))' assert_equals: expected "oklch(100 0 190)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch specified hue, oklch(100 0 20deg), oklch(100 0 320deg))' assert_equals: expected "oklch(100 0 170)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch specified hue, oklch(100 0 320deg), oklch(100 0 20deg))' assert_equals: expected "oklch(100 0 170)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(none none none), oklch(none none none))' assert_equals: expected "oklch(none none none)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(none none none), oklch(50 60 70deg))' assert_equals: expected "oklch(50 60 70)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg), oklch(none none none))' assert_equals: expected "oklch(10 20 30)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(10 20 none), oklch(50 60 70deg))' assert_equals: expected "oklch(30 40 70)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg), oklch(50 60 none))' assert_equals: expected "oklch(30 40 30)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(none 20 30deg), oklch(50 none 70deg))' assert_equals: expected "oklch(50 20 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / none), oklch(50 60 70deg))' assert_equals: expected "oklch(30 40 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / none), oklch(50 60 70deg / 0.5))' assert_equals: expected "oklch(30 40 50 / 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklch, oklch(10 20 30deg / none), oklch(50 60 70deg / none))' assert_equals: expected "oklch(30 40 50 / none)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lab, lab(10 20 30), lab(50 60 70))' assert_equals: expected "lab(30 40 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70))' assert_equals: expected "lab(40 50 60)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in lab, 25% lab(10 20 30), lab(50 60 70))' assert_true: 'color-mix(in lab, 25% lab(10 20 30), lab(50 60 70))' is a supported value for color. expected true got false FAIL Property color value 'color-mix(in lab, lab(10 20 30), 25% lab(50 60 70))' assert_true: 'color-mix(in lab, lab(10 20 30), 25% lab(50 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 30), lab(50 60 70) 25%)' assert_true: 'color-mix(in lab, lab(10 20 30), lab(50 60 70) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70) 75%)' assert_true: 'color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 30) 30%, lab(50 60 70) 90%)' assert_true: 'color-mix(in lab, lab(10 20 30) 30%, lab(50 60 70) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 30) 12.5%, lab(50 60 70) 37.5%)' assert_true: 'color-mix(in lab, lab(10 20 30) 12.5%, lab(50 60 70) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 30) 0%, lab(50 60 70))' assert_true: 'color-mix(in lab, lab(10 20 30) 0%, lab(50 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 30 / .4), lab(50 60 70 / .8))' assert_true: 'color-mix(in lab, lab(10 20 30 / .4), lab(50 60 70 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 30 / .4) 25%, lab(50 60 70 / .8))' assert_true: 'color-mix(in lab, lab(10 20 30 / .4) 25%, lab(50 60 70 / .8))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in lab, lab(10 20 30), lab(50 60 70) 25%)' assert_equals: expected "lab(20 30 40)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70) 75%)' assert_equals: expected "lab(40 50 60)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lab, lab(10 20 30) 30%, lab(50 60 70) 90%)' assert_equals: expected "lab(40 50 60)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lab, lab(10 20 30) 12.5%, lab(50 60 70) 37.5%)' assert_equals: expected "lab(40 50 60 / 0.5)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in lab, lab(10 20 30) 0%, lab(50 60 70))' +FAIL Property color value 'color-mix(in lab, lab(10 20 30 / .4), lab(50 60 70 / .8))' assert_equals: expected "lab(36.666664 46.666664 56.666664 / 0.6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lab, lab(10 20 30 / .4) 25%, lab(50 60 70 / .8))' assert_equals: expected "lab(44.285713 54.285717 64.28571 / 0.7)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in lab, 25% lab(10 20 30 / .4), lab(50 60 70 / .8))' assert_true: 'color-mix(in lab, 25% lab(10 20 30 / .4), lab(50 60 70 / .8))' is a supported value for color. expected true got false FAIL Property color value 'color-mix(in lab, lab(10 20 30 / .4), 25% lab(50 60 70 / .8))' assert_true: 'color-mix(in lab, lab(10 20 30 / .4), 25% lab(50 60 70 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 30 / .4), lab(50 60 70 / .8) 25%)' assert_true: 'color-mix(in lab, lab(10 20 30 / .4), lab(50 60 70 / .8) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 30 / .4) 25%, lab(50 60 70 / .8) 75%)' assert_true: 'color-mix(in lab, lab(10 20 30 / .4) 25%, lab(50 60 70 / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 30 / .4) 30%, lab(50 60 70 / .8) 90%)' assert_true: 'color-mix(in lab, lab(10 20 30 / .4) 30%, lab(50 60 70 / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 30 / .4) 12.5%, lab(50 60 70 / .8) 37.5%)' assert_true: 'color-mix(in lab, lab(10 20 30 / .4) 12.5%, lab(50 60 70 / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 30 / .4) 0%, lab(50 60 70 / .8))' assert_true: 'color-mix(in lab, lab(10 20 30 / .4) 0%, lab(50 60 70 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(none none none), lab(none none none))' assert_true: 'color-mix(in lab, lab(none none none), lab(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(none none none), lab(50 60 70))' assert_true: 'color-mix(in lab, lab(none none none), lab(50 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 30), lab(none none none))' assert_true: 'color-mix(in lab, lab(10 20 30), lab(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 none), lab(50 60 70))' assert_true: 'color-mix(in lab, lab(10 20 none), lab(50 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 30), lab(50 60 none))' assert_true: 'color-mix(in lab, lab(10 20 30), lab(50 60 none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(none 20 30), lab(50 none 70))' assert_true: 'color-mix(in lab, lab(none 20 30), lab(50 none 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 30 / none), lab(50 60 70))' assert_true: 'color-mix(in lab, lab(10 20 30 / none), lab(50 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 30 / none), lab(50 60 70 / 0.5))' assert_true: 'color-mix(in lab, lab(10 20 30 / none), lab(50 60 70 / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10 20 30 / none), lab(50 60 70 / none))' assert_true: 'color-mix(in lab, lab(10 20 30 / none), lab(50 60 70 / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 30), oklab(50 60 70))' assert_true: 'color-mix(in oklab, oklab(10 20 30), oklab(50 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 30) 25%, oklab(50 60 70))' assert_true: 'color-mix(in oklab, oklab(10 20 30) 25%, oklab(50 60 70))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in lab, lab(10 20 30 / .4), lab(50 60 70 / .8) 25%)' assert_equals: expected "lab(26 36 46 / 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lab, lab(10 20 30 / .4) 25%, lab(50 60 70 / .8) 75%)' assert_equals: expected "lab(44.285713 54.285717 64.28571 / 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lab, lab(10 20 30 / .4) 30%, lab(50 60 70 / .8) 90%)' assert_equals: expected "lab(44.285713 54.285717 64.28571 / 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lab, lab(10 20 30 / .4) 12.5%, lab(50 60 70 / .8) 37.5%)' assert_equals: expected "lab(44.285713 54.285717 64.28571 / 0.35)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in lab, lab(10 20 30 / .4) 0%, lab(50 60 70 / .8))' +FAIL Property color value 'color-mix(in lab, lab(none none none), lab(none none none))' assert_equals: expected "lab(none none none)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lab, lab(none none none), lab(50 60 70))' assert_equals: expected "lab(50 60 70)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lab, lab(10 20 30), lab(none none none))' assert_equals: expected "lab(10 20 30)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lab, lab(10 20 none), lab(50 60 70))' assert_equals: expected "lab(30 40 70)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lab, lab(10 20 30), lab(50 60 none))' assert_equals: expected "lab(30 40 30)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lab, lab(none 20 30), lab(50 none 70))' assert_equals: expected "lab(50 20 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lab, lab(10 20 30 / none), lab(50 60 70))' assert_equals: expected "lab(30 40 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lab, lab(10 20 30 / none), lab(50 60 70 / 0.5))' assert_equals: expected "lab(30 40 50 / 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in lab, lab(10 20 30 / none), lab(50 60 70 / none))' assert_equals: expected "lab(30 40 50 / none)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklab, oklab(10 20 30), oklab(50 60 70))' assert_equals: expected "oklab(30 40 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklab, oklab(10 20 30) 25%, oklab(50 60 70))' assert_equals: expected "oklab(40 50 60)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in oklab, 25% oklab(10 20 30), oklab(50 60 70))' assert_true: 'color-mix(in oklab, 25% oklab(10 20 30), oklab(50 60 70))' is a supported value for color. expected true got false FAIL Property color value 'color-mix(in oklab, oklab(10 20 30), 25% oklab(50 60 70))' assert_true: 'color-mix(in oklab, oklab(10 20 30), 25% oklab(50 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 30), oklab(50 60 70) 25%)' assert_true: 'color-mix(in oklab, oklab(10 20 30), oklab(50 60 70) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 30) 25%, oklab(50 60 70) 75%)' assert_true: 'color-mix(in oklab, oklab(10 20 30) 25%, oklab(50 60 70) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 30) 30%, oklab(50 60 70) 90%)' assert_true: 'color-mix(in oklab, oklab(10 20 30) 30%, oklab(50 60 70) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 30) 12.5%, oklab(50 60 70) 37.5%)' assert_true: 'color-mix(in oklab, oklab(10 20 30) 12.5%, oklab(50 60 70) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 30) 0%, oklab(50 60 70))' assert_true: 'color-mix(in oklab, oklab(10 20 30) 0%, oklab(50 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / .4), oklab(50 60 70 / .8))' assert_true: 'color-mix(in oklab, oklab(10 20 30 / .4), oklab(50 60 70 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / .4) 25%, oklab(50 60 70 / .8))' assert_true: 'color-mix(in oklab, oklab(10 20 30 / .4) 25%, oklab(50 60 70 / .8))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in oklab, oklab(10 20 30), oklab(50 60 70) 25%)' assert_equals: expected "oklab(20 30 40)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklab, oklab(10 20 30) 25%, oklab(50 60 70) 75%)' assert_equals: expected "oklab(40 50 60)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklab, oklab(10 20 30) 30%, oklab(50 60 70) 90%)' assert_equals: expected "oklab(40 50 60)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklab, oklab(10 20 30) 12.5%, oklab(50 60 70) 37.5%)' assert_equals: expected "oklab(40 50 60 / 0.5)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in oklab, oklab(10 20 30) 0%, oklab(50 60 70))' +FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / .4), oklab(50 60 70 / .8))' assert_equals: expected "oklab(36.666664 46.666664 56.666664 / 0.6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / .4) 25%, oklab(50 60 70 / .8))' assert_equals: expected "oklab(44.285713 54.285717 64.28571 / 0.7)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in oklab, 25% oklab(10 20 30 / .4), oklab(50 60 70 / .8))' assert_true: 'color-mix(in oklab, 25% oklab(10 20 30 / .4), oklab(50 60 70 / .8))' is a supported value for color. expected true got false FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / .4), 25% oklab(50 60 70 / .8))' assert_true: 'color-mix(in oklab, oklab(10 20 30 / .4), 25% oklab(50 60 70 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / .4), oklab(50 60 70 / .8) 25%)' assert_true: 'color-mix(in oklab, oklab(10 20 30 / .4), oklab(50 60 70 / .8) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / .4) 25%, oklab(50 60 70 / .8) 75%)' assert_true: 'color-mix(in oklab, oklab(10 20 30 / .4) 25%, oklab(50 60 70 / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / .4) 30%, oklab(50 60 70 / .8) 90%)' assert_true: 'color-mix(in oklab, oklab(10 20 30 / .4) 30%, oklab(50 60 70 / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / .4) 12.5%, oklab(50 60 70 / .8) 37.5%)' assert_true: 'color-mix(in oklab, oklab(10 20 30 / .4) 12.5%, oklab(50 60 70 / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / .4) 0%, oklab(50 60 70 / .8))' assert_true: 'color-mix(in oklab, oklab(10 20 30 / .4) 0%, oklab(50 60 70 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(none none none), oklab(none none none))' assert_true: 'color-mix(in oklab, oklab(none none none), oklab(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(none none none), oklab(50 60 70))' assert_true: 'color-mix(in oklab, oklab(none none none), oklab(50 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 30), oklab(none none none))' assert_true: 'color-mix(in oklab, oklab(10 20 30), oklab(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 none), oklab(50 60 70))' assert_true: 'color-mix(in oklab, oklab(10 20 none), oklab(50 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 30), oklab(50 60 none))' assert_true: 'color-mix(in oklab, oklab(10 20 30), oklab(50 60 none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(none 20 30), oklab(50 none 70))' assert_true: 'color-mix(in oklab, oklab(none 20 30), oklab(50 none 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / none), oklab(50 60 70))' assert_true: 'color-mix(in oklab, oklab(10 20 30 / none), oklab(50 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / none), oklab(50 60 70 / 0.5))' assert_true: 'color-mix(in oklab, oklab(10 20 30 / none), oklab(50 60 70 / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / none), oklab(50 60 70 / none))' assert_true: 'color-mix(in oklab, oklab(10 20 30 / none), oklab(50 60 70 / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / .4), oklab(50 60 70 / .8) 25%)' assert_equals: expected "oklab(26 36 46 / 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / .4) 25%, oklab(50 60 70 / .8) 75%)' assert_equals: expected "oklab(44.285713 54.285717 64.28571 / 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / .4) 30%, oklab(50 60 70 / .8) 90%)' assert_equals: expected "oklab(44.285713 54.285717 64.28571 / 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / .4) 12.5%, oklab(50 60 70 / .8) 37.5%)' assert_equals: expected "oklab(44.285713 54.285717 64.28571 / 0.35)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in oklab, oklab(10 20 30 / .4) 0%, oklab(50 60 70 / .8))' +FAIL Property color value 'color-mix(in oklab, oklab(none none none), oklab(none none none))' assert_equals: expected "oklab(none none none)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklab, oklab(none none none), oklab(50 60 70))' assert_equals: expected "oklab(50 60 70)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklab, oklab(10 20 30), oklab(none none none))' assert_equals: expected "oklab(10 20 30)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklab, oklab(10 20 none), oklab(50 60 70))' assert_equals: expected "oklab(30 40 70)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklab, oklab(10 20 30), oklab(50 60 none))' assert_equals: expected "oklab(30 40 30)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklab, oklab(none 20 30), oklab(50 none 70))' assert_equals: expected "oklab(50 20 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / none), oklab(50 60 70))' assert_equals: expected "oklab(30 40 50)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / none), oklab(50 60 70 / 0.5))' assert_equals: expected "oklab(30 40 50 / 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in oklab, oklab(10 20 30 / none), oklab(50 60 70 / none))' assert_equals: expected "oklab(30 40 50 / none)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7))' assert_equals: expected "color(srgb 0.3 0.4 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7))' assert_equals: expected "color(srgb 0.4 0.5 0.6)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in srgb, 25% color(srgb .1 .2 .3), color(srgb .5 .6 .7))' assert_true: 'color-mix(in srgb, 25% color(srgb .1 .2 .3), color(srgb .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7) 25%)' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7) 25%)' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7) 25%)' assert_equals: expected "color(srgb 0.2 0.3 0.4)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3), 25% color(srgb .5 .6 .7))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3), 25% color(srgb .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7) 75%)' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 30%, color(srgb .5 .6 .7) 90%)' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3) 30%, color(srgb .5 .6 .7) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 12.5%, color(srgb .5 .6 .7) 37.5%)' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3) 12.5%, color(srgb .5 .6 .7) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 0%, color(srgb .5 .6 .7))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3) 0%, color(srgb .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .5), color(srgb .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / .5), color(srgb .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7) 75%)' assert_equals: expected "color(srgb 0.4 0.5 0.6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 30%, color(srgb .5 .6 .7) 90%)' assert_equals: expected "color(srgb 0.4 0.5 0.6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 12.5%, color(srgb .5 .6 .7) 37.5%)' assert_equals: expected "color(srgb 0.4 0.5 0.6 / 0.5)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 0%, color(srgb .5 .6 .7))' +FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .5), color(srgb .5 .6 .7 / .8))' assert_equals: expected "color(srgb 0.3461539 0.4461539 0.5461539 / 0.65)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8))' assert_equals: expected "color(srgb 0.44285715 0.54285717 0.64285713 / 0.7)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in srgb, 25% color(srgb .1 .2 .3 / .4), color(srgb .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb, 25% color(srgb .1 .2 .3 / .4), color(srgb .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4), color(srgb .5 .6 .7 / .8) 25%)' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / .4), color(srgb .5 .6 .7 / .8) 25%)' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4), color(srgb .5 .6 .7 / .8) 25%)' assert_equals: expected "color(srgb 0.26000002 0.36 0.46 / 0.5)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4), 25% color(srgb .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / .4), 25% color(srgb .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8) 75%)' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 30%, color(srgb .5 .6 .7 / .8) 90%)' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 30%, color(srgb .5 .6 .7 / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 12.5%, color(srgb .5 .6 .7 / .8) 37.5%)' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 12.5%, color(srgb .5 .6 .7 / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 0%, color(srgb .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 0%, color(srgb .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb 2 3 4 / 5), color(srgb 4 6 8 / 10))' assert_true: 'color-mix(in srgb, color(srgb 2 3 4 / 5), color(srgb 4 6 8 / 10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb -2 -3 -4), color(srgb -4 -6 -8))' assert_true: 'color-mix(in srgb, color(srgb -2 -3 -4), color(srgb -4 -6 -8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb -2 -3 -4 / -5), color(srgb -4 -6 -8 / -10))' assert_true: 'color-mix(in srgb, color(srgb -2 -3 -4 / -5), color(srgb -4 -6 -8 / -10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb none none none), color(srgb none none none))' assert_true: 'color-mix(in srgb, color(srgb none none none), color(srgb none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb none none none), color(srgb .5 .6 .7))' assert_true: 'color-mix(in srgb, color(srgb none none none), color(srgb .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb none none none))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 none), color(srgb .5 .6 .7))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 none), color(srgb .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 none))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb none .2 .3), color(srgb .5 none .7))' assert_true: 'color-mix(in srgb, color(srgb none .2 .3), color(srgb .5 none .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7 / 0.5))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7 / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7 / none))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7 / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 25%, color(srgb-linear .5 .6 .7))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 25%, color(srgb-linear .5 .6 .7))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8) 75%)' assert_equals: expected "color(srgb 0.44285715 0.54285717 0.64285713 / 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 30%, color(srgb .5 .6 .7 / .8) 90%)' assert_equals: expected "color(srgb 0.44285715 0.54285717 0.64285713 / 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 12.5%, color(srgb .5 .6 .7 / .8) 37.5%)' assert_equals: expected "color(srgb 0.44285715 0.54285717 0.64285713 / 0.35)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 0%, color(srgb .5 .6 .7 / .8))' +FAIL Property color value 'color-mix(in srgb, color(srgb 2 3 4 / 5), color(srgb 4 6 8 / 10))' assert_equals: expected "color(srgb 3 4.5 6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb, color(srgb -2 -3 -4), color(srgb -4 -6 -8))' assert_equals: expected "color(srgb -3 -4.5 -6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb, color(srgb -2 -3 -4 / -5), color(srgb -4 -6 -8 / -10))' assert_equals: expected "color(srgb 0 0 0 / 0)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb, color(srgb none none none), color(srgb none none none))' assert_equals: expected "color(srgb none none none)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb, color(srgb none none none), color(srgb .5 .6 .7))' assert_equals: expected "color(srgb 0.5 0.6 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb none none none))' assert_equals: expected "color(srgb 0.1 0.2 0.3)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 none), color(srgb .5 .6 .7))' assert_equals: expected "color(srgb 0.3 0.4 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 none))' assert_equals: expected "color(srgb 0.3 0.4 0.3)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb, color(srgb none .2 .3), color(srgb .5 none .7))' assert_equals: expected "color(srgb 0.5 0.2 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7))' assert_equals: expected "color(srgb 0.3 0.4 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7 / 0.5))' assert_equals: expected "color(srgb 0.3 0.4 0.5 / 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7 / none))' assert_equals: expected "color(srgb 0.3 0.4 0.5 / none)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))' assert_equals: expected "color(srgb-linear 0.3 0.4 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 25%, color(srgb-linear .5 .6 .7))' assert_equals: expected "color(srgb-linear 0.4 0.5 0.6)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in srgb-linear, 25% color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))' assert_true: 'color-mix(in srgb-linear, 25% color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7) 25%)' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7) 25%)' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7) 25%)' assert_equals: expected "color(srgb-linear 0.2 0.3 0.4)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), 25% color(srgb-linear .5 .6 .7))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), 25% color(srgb-linear .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 25%, color(srgb-linear .5 .6 .7) 75%)' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 25%, color(srgb-linear .5 .6 .7) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 30%, color(srgb-linear .5 .6 .7) 90%)' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 30%, color(srgb-linear .5 .6 .7) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 12.5%, color(srgb-linear .5 .6 .7) 37.5%)' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 12.5%, color(srgb-linear .5 .6 .7) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 0%, color(srgb-linear .5 .6 .7))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 0%, color(srgb-linear .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .5), color(srgb-linear .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .5), color(srgb-linear .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 25%, color(srgb-linear .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 25%, color(srgb-linear .5 .6 .7 / .8))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 25%, color(srgb-linear .5 .6 .7) 75%)' assert_equals: expected "color(srgb-linear 0.4 0.5 0.6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 30%, color(srgb-linear .5 .6 .7) 90%)' assert_equals: expected "color(srgb-linear 0.4 0.5 0.6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 12.5%, color(srgb-linear .5 .6 .7) 37.5%)' assert_equals: expected "color(srgb-linear 0.4 0.5 0.6 / 0.5)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 0%, color(srgb-linear .5 .6 .7))' +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .5), color(srgb-linear .5 .6 .7 / .8))' assert_equals: expected "color(srgb-linear 0.3461539 0.4461539 0.5461539 / 0.65)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 25%, color(srgb-linear .5 .6 .7 / .8))' assert_equals: expected "color(srgb-linear 0.44285715 0.54285717 0.64285713 / 0.7)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in srgb-linear, 25% color(srgb-linear .1 .2 .3 / .4), color(srgb-linear .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb-linear, 25% color(srgb-linear .1 .2 .3 / .4), color(srgb-linear .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4), color(srgb-linear .5 .6 .7 / .8) 25%)' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4), color(srgb-linear .5 .6 .7 / .8) 25%)' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4), color(srgb-linear .5 .6 .7 / .8) 25%)' assert_equals: expected "color(srgb-linear 0.26000002 0.36 0.46 / 0.5)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4), 25% color(srgb-linear .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4), 25% color(srgb-linear .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 25%, color(srgb-linear .5 .6 .7 / .8) 75%)' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 25%, color(srgb-linear .5 .6 .7 / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 30%, color(srgb-linear .5 .6 .7 / .8) 90%)' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 30%, color(srgb-linear .5 .6 .7 / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 12.5%, color(srgb-linear .5 .6 .7 / .8) 37.5%)' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 12.5%, color(srgb-linear .5 .6 .7 / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 0%, color(srgb-linear .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 0%, color(srgb-linear .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear 2 3 4 / 5), color(srgb-linear 4 6 8 / 10))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear 2 3 4 / 5), color(srgb-linear 4 6 8 / 10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear -2 -3 -4), color(srgb-linear -4 -6 -8))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear -2 -3 -4), color(srgb-linear -4 -6 -8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear -2 -3 -4 / -5), color(srgb-linear -4 -6 -8 / -10))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear -2 -3 -4 / -5), color(srgb-linear -4 -6 -8 / -10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear none none none), color(srgb-linear none none none))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear none none none), color(srgb-linear none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear none none none), color(srgb-linear .5 .6 .7))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear none none none), color(srgb-linear .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear none none none))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 none), color(srgb-linear .5 .6 .7))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 none), color(srgb-linear .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 none))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear none .2 .3), color(srgb-linear .5 none .7))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear none .2 .3), color(srgb-linear .5 none .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7 / 0.5))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7 / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7 / none))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7 / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 .7))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 25%, color(xyz .5 .6 .7))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3) 25%, color(xyz .5 .6 .7))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 25%, color(srgb-linear .5 .6 .7 / .8) 75%)' assert_equals: expected "color(srgb-linear 0.44285715 0.54285717 0.64285713 / 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 30%, color(srgb-linear .5 .6 .7 / .8) 90%)' assert_equals: expected "color(srgb-linear 0.44285715 0.54285717 0.64285713 / 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 12.5%, color(srgb-linear .5 .6 .7 / .8) 37.5%)' assert_equals: expected "color(srgb-linear 0.44285715 0.54285717 0.64285713 / 0.35)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 0%, color(srgb-linear .5 .6 .7 / .8))' +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear 2 3 4 / 5), color(srgb-linear 4 6 8 / 10))' assert_equals: expected "color(srgb-linear 3 4.5 6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear -2 -3 -4), color(srgb-linear -4 -6 -8))' assert_equals: expected "color(srgb-linear -3 -4.5 -6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear -2 -3 -4 / -5), color(srgb-linear -4 -6 -8 / -10))' assert_equals: expected "color(srgb-linear 0 0 0 / 0)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear none none none), color(srgb-linear none none none))' assert_equals: expected "color(srgb-linear none none none)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear none none none), color(srgb-linear .5 .6 .7))' assert_equals: expected "color(srgb-linear 0.5 0.6 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear none none none))' assert_equals: expected "color(srgb-linear 0.1 0.2 0.3)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 none), color(srgb-linear .5 .6 .7))' assert_equals: expected "color(srgb-linear 0.3 0.4 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 none))' assert_equals: expected "color(srgb-linear 0.3 0.4 0.3)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear none .2 .3), color(srgb-linear .5 none .7))' assert_equals: expected "color(srgb-linear 0.5 0.2 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7))' assert_equals: expected "color(srgb-linear 0.3 0.4 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7 / 0.5))' assert_equals: expected "color(srgb-linear 0.3 0.4 0.5 / 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7 / none))' assert_equals: expected "color(srgb-linear 0.3 0.4 0.5 / none)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 .7))' assert_equals: expected "color(xyz-d65 0.3 0.4 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 25%, color(xyz .5 .6 .7))' assert_equals: expected "color(xyz-d65 0.4 0.5 0.6)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in xyz, 25% color(xyz .1 .2 .3), color(xyz .5 .6 .7))' assert_true: 'color-mix(in xyz, 25% color(xyz .1 .2 .3), color(xyz .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 .7) 25%)' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 .7) 25%)' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 .7) 25%)' assert_equals: expected "color(xyz-d65 0.2 0.3 0.4)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3), 25% color(xyz .5 .6 .7))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3), 25% color(xyz .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 25%, color(xyz .5 .6 .7) 75%)' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3) 25%, color(xyz .5 .6 .7) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 30%, color(xyz .5 .6 .7) 90%)' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3) 30%, color(xyz .5 .6 .7) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 12.5%, color(xyz .5 .6 .7) 37.5%)' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3) 12.5%, color(xyz .5 .6 .7) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 0%, color(xyz .5 .6 .7))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3) 0%, color(xyz .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .5), color(xyz .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / .5), color(xyz .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 25%, color(xyz .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 25%, color(xyz .5 .6 .7 / .8))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 25%, color(xyz .5 .6 .7) 75%)' assert_equals: expected "color(xyz-d65 0.4 0.5 0.6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 30%, color(xyz .5 .6 .7) 90%)' assert_equals: expected "color(xyz-d65 0.4 0.5 0.6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 12.5%, color(xyz .5 .6 .7) 37.5%)' assert_equals: expected "color(xyz-d65 0.4 0.5 0.6 / 0.5)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 0%, color(xyz .5 .6 .7))' +FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .5), color(xyz .5 .6 .7 / .8))' assert_equals: expected "color(xyz-d65 0.3461539 0.4461539 0.5461539 / 0.65)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 25%, color(xyz .5 .6 .7 / .8))' assert_equals: expected "color(xyz-d65 0.44285715 0.54285717 0.64285713 / 0.7)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in xyz, 25% color(xyz .1 .2 .3 / .4), color(xyz .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz, 25% color(xyz .1 .2 .3 / .4), color(xyz .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4), color(xyz .5 .6 .7 / .8) 25%)' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / .4), color(xyz .5 .6 .7 / .8) 25%)' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4), color(xyz .5 .6 .7 / .8) 25%)' assert_equals: expected "color(xyz-d65 0.26000002 0.36 0.46 / 0.5)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4), 25% color(xyz .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / .4), 25% color(xyz .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 25%, color(xyz .5 .6 .7 / .8) 75%)' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 25%, color(xyz .5 .6 .7 / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 30%, color(xyz .5 .6 .7 / .8) 90%)' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 30%, color(xyz .5 .6 .7 / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 12.5%, color(xyz .5 .6 .7 / .8) 37.5%)' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 12.5%, color(xyz .5 .6 .7 / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 0%, color(xyz .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 0%, color(xyz .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz 2 3 4 / 5), color(xyz 4 6 8 / 10))' assert_true: 'color-mix(in xyz, color(xyz 2 3 4 / 5), color(xyz 4 6 8 / 10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz -2 -3 -4), color(xyz -4 -6 -8))' assert_true: 'color-mix(in xyz, color(xyz -2 -3 -4), color(xyz -4 -6 -8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz -2 -3 -4 / -5), color(xyz -4 -6 -8 / -10))' assert_true: 'color-mix(in xyz, color(xyz -2 -3 -4 / -5), color(xyz -4 -6 -8 / -10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz none none none), color(xyz none none none))' assert_true: 'color-mix(in xyz, color(xyz none none none), color(xyz none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz none none none), color(xyz .5 .6 .7))' assert_true: 'color-mix(in xyz, color(xyz none none none), color(xyz .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz none none none))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 none), color(xyz .5 .6 .7))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 none), color(xyz .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 none))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz none .2 .3), color(xyz .5 none .7))' assert_true: 'color-mix(in xyz, color(xyz none .2 .3), color(xyz .5 none .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7 / 0.5))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7 / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7 / none))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7 / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 25%, color(xyz .5 .6 .7 / .8) 75%)' assert_equals: expected "color(xyz-d65 0.44285715 0.54285717 0.64285713 / 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 30%, color(xyz .5 .6 .7 / .8) 90%)' assert_equals: expected "color(xyz-d65 0.44285715 0.54285717 0.64285713 / 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 12.5%, color(xyz .5 .6 .7 / .8) 37.5%)' assert_equals: expected "color(xyz-d65 0.44285715 0.54285717 0.64285713 / 0.35)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 0%, color(xyz .5 .6 .7 / .8))' +FAIL Property color value 'color-mix(in xyz, color(xyz 2 3 4 / 5), color(xyz 4 6 8 / 10))' assert_equals: expected "color(xyz-d65 3 4.5 6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz, color(xyz -2 -3 -4), color(xyz -4 -6 -8))' assert_equals: expected "color(xyz-d65 -3 -4.5 -6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz, color(xyz -2 -3 -4 / -5), color(xyz -4 -6 -8 / -10))' assert_equals: expected "color(xyz-d65 0 0 0 / 0)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz, color(xyz none none none), color(xyz none none none))' assert_equals: expected "color(xyz-d65 none none none)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz, color(xyz none none none), color(xyz .5 .6 .7))' assert_equals: expected "color(xyz-d65 0.5 0.6 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz none none none))' assert_equals: expected "color(xyz-d65 0.1 0.2 0.3)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 none), color(xyz .5 .6 .7))' assert_equals: expected "color(xyz-d65 0.3 0.4 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 none))' assert_equals: expected "color(xyz-d65 0.3 0.4 0.3)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz, color(xyz none .2 .3), color(xyz .5 none .7))' assert_equals: expected "color(xyz-d65 0.5 0.2 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7))' assert_equals: expected "color(xyz-d65 0.3 0.4 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7 / 0.5))' assert_equals: expected "color(xyz-d65 0.3 0.4 0.5 / 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7 / none))' assert_equals: expected "color(xyz-d65 0.3 0.4 0.5 / none)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))' assert_equals: expected "color(xyz-d50 0.3 0.4 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7))' assert_equals: expected "color(xyz-d50 0.4 0.5 0.6)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in xyz-d50, 25% color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))' assert_true: 'color-mix(in xyz-d50, 25% color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7) 25%)' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7) 25%)' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7) 25%)' assert_equals: expected "color(xyz-d50 0.2 0.3 0.4)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), 25% color(xyz-d50 .5 .6 .7))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), 25% color(xyz-d50 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7) 75%)' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 30%, color(xyz-d50 .5 .6 .7) 90%)' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 30%, color(xyz-d50 .5 .6 .7) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 12.5%, color(xyz-d50 .5 .6 .7) 37.5%)' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 12.5%, color(xyz-d50 .5 .6 .7) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 0%, color(xyz-d50 .5 .6 .7))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 0%, color(xyz-d50 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .5), color(xyz-d50 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .5), color(xyz-d50 .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7) 75%)' assert_equals: expected "color(xyz-d50 0.4 0.5 0.6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 30%, color(xyz-d50 .5 .6 .7) 90%)' assert_equals: expected "color(xyz-d50 0.4 0.5 0.6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 12.5%, color(xyz-d50 .5 .6 .7) 37.5%)' assert_equals: expected "color(xyz-d50 0.4 0.5 0.6 / 0.5)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 0%, color(xyz-d50 .5 .6 .7))' +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .5), color(xyz-d50 .5 .6 .7 / .8))' assert_equals: expected "color(xyz-d50 0.3461539 0.4461539 0.5461539 / 0.65)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8))' assert_equals: expected "color(xyz-d50 0.44285715 0.54285717 0.64285713 / 0.7)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in xyz-d50, 25% color(xyz-d50 .1 .2 .3 / .4), color(xyz-d50 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d50, 25% color(xyz-d50 .1 .2 .3 / .4), color(xyz-d50 .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4), color(xyz-d50 .5 .6 .7 / .8) 25%)' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4), color(xyz-d50 .5 .6 .7 / .8) 25%)' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4), color(xyz-d50 .5 .6 .7 / .8) 25%)' assert_equals: expected "color(xyz-d50 0.26000002 0.36 0.46 / 0.5)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4), 25% color(xyz-d50 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4), 25% color(xyz-d50 .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8) 75%)' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 30%, color(xyz-d50 .5 .6 .7 / .8) 90%)' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 30%, color(xyz-d50 .5 .6 .7 / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 12.5%, color(xyz-d50 .5 .6 .7 / .8) 37.5%)' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 12.5%, color(xyz-d50 .5 .6 .7 / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 0%, color(xyz-d50 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 0%, color(xyz-d50 .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 2 3 4 / 5), color(xyz-d50 4 6 8 / 10))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 2 3 4 / 5), color(xyz-d50 4 6 8 / 10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 -2 -3 -4), color(xyz-d50 -4 -6 -8))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 -2 -3 -4), color(xyz-d50 -4 -6 -8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 -2 -3 -4 / -5), color(xyz-d50 -4 -6 -8 / -10))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 -2 -3 -4 / -5), color(xyz-d50 -4 -6 -8 / -10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 none none none), color(xyz-d50 none none none))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 none none none), color(xyz-d50 none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 none none none), color(xyz-d50 .5 .6 .7))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 none none none), color(xyz-d50 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 none none none))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 none), color(xyz-d50 .5 .6 .7))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 none), color(xyz-d50 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 none))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 none .2 .3), color(xyz-d50 .5 none .7))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 none .2 .3), color(xyz-d50 .5 none .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7 / 0.5))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7 / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7 / none))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7 / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 25%, color(xyz-d65 .5 .6 .7))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 25%, color(xyz-d65 .5 .6 .7))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8) 75%)' assert_equals: expected "color(xyz-d50 0.44285715 0.54285717 0.64285713 / 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 30%, color(xyz-d50 .5 .6 .7 / .8) 90%)' assert_equals: expected "color(xyz-d50 0.44285715 0.54285717 0.64285713 / 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 12.5%, color(xyz-d50 .5 .6 .7 / .8) 37.5%)' assert_equals: expected "color(xyz-d50 0.44285715 0.54285717 0.64285713 / 0.35)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 0%, color(xyz-d50 .5 .6 .7 / .8))' +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 2 3 4 / 5), color(xyz-d50 4 6 8 / 10))' assert_equals: expected "color(xyz-d50 3 4.5 6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 -2 -3 -4), color(xyz-d50 -4 -6 -8))' assert_equals: expected "color(xyz-d50 -3 -4.5 -6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 -2 -3 -4 / -5), color(xyz-d50 -4 -6 -8 / -10))' assert_equals: expected "color(xyz-d50 0 0 0 / 0)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 none none none), color(xyz-d50 none none none))' assert_equals: expected "color(xyz-d50 none none none)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 none none none), color(xyz-d50 .5 .6 .7))' assert_equals: expected "color(xyz-d50 0.5 0.6 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 none none none))' assert_equals: expected "color(xyz-d50 0.1 0.2 0.3)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 none), color(xyz-d50 .5 .6 .7))' assert_equals: expected "color(xyz-d50 0.3 0.4 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 none))' assert_equals: expected "color(xyz-d50 0.3 0.4 0.3)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 none .2 .3), color(xyz-d50 .5 none .7))' assert_equals: expected "color(xyz-d50 0.5 0.2 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7))' assert_equals: expected "color(xyz-d50 0.3 0.4 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7 / 0.5))' assert_equals: expected "color(xyz-d50 0.3 0.4 0.5 / 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7 / none))' assert_equals: expected "color(xyz-d50 0.3 0.4 0.5 / none)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))' assert_equals: expected "color(xyz-d65 0.3 0.4 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 25%, color(xyz-d65 .5 .6 .7))' assert_equals: expected "color(xyz-d65 0.4 0.5 0.6)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in xyz-d65, 25% color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))' assert_true: 'color-mix(in xyz-d65, 25% color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7) 25%)' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7) 25%)' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7) 25%)' assert_equals: expected "color(xyz-d65 0.2 0.3 0.4)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), 25% color(xyz-d65 .5 .6 .7))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), 25% color(xyz-d65 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 25%, color(xyz-d65 .5 .6 .7) 75%)' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 25%, color(xyz-d65 .5 .6 .7) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 30%, color(xyz-d65 .5 .6 .7) 90%)' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 30%, color(xyz-d65 .5 .6 .7) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 12.5%, color(xyz-d65 .5 .6 .7) 37.5%)' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 12.5%, color(xyz-d65 .5 .6 .7) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 0%, color(xyz-d65 .5 .6 .7))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 0%, color(xyz-d65 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .5), color(xyz-d65 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .5), color(xyz-d65 .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 25%, color(xyz-d65 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 25%, color(xyz-d65 .5 .6 .7 / .8))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 25%, color(xyz-d65 .5 .6 .7) 75%)' assert_equals: expected "color(xyz-d65 0.4 0.5 0.6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 30%, color(xyz-d65 .5 .6 .7) 90%)' assert_equals: expected "color(xyz-d65 0.4 0.5 0.6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 12.5%, color(xyz-d65 .5 .6 .7) 37.5%)' assert_equals: expected "color(xyz-d65 0.4 0.5 0.6 / 0.5)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 0%, color(xyz-d65 .5 .6 .7))' +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .5), color(xyz-d65 .5 .6 .7 / .8))' assert_equals: expected "color(xyz-d65 0.3461539 0.4461539 0.5461539 / 0.65)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 25%, color(xyz-d65 .5 .6 .7 / .8))' assert_equals: expected "color(xyz-d65 0.44285715 0.54285717 0.64285713 / 0.7)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in xyz-d65, 25% color(xyz-d65 .1 .2 .3 / .4), color(xyz-d65 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d65, 25% color(xyz-d65 .1 .2 .3 / .4), color(xyz-d65 .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4), color(xyz-d65 .5 .6 .7 / .8) 25%)' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4), color(xyz-d65 .5 .6 .7 / .8) 25%)' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4), color(xyz-d65 .5 .6 .7 / .8) 25%)' assert_equals: expected "color(xyz-d65 0.26000002 0.36 0.46 / 0.5)" but got "rgb(128, 128, 128)" FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4), 25% color(xyz-d65 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4), 25% color(xyz-d65 .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 25%, color(xyz-d65 .5 .6 .7 / .8) 75%)' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 25%, color(xyz-d65 .5 .6 .7 / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 30%, color(xyz-d65 .5 .6 .7 / .8) 90%)' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 30%, color(xyz-d65 .5 .6 .7 / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 12.5%, color(xyz-d65 .5 .6 .7 / .8) 37.5%)' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 12.5%, color(xyz-d65 .5 .6 .7 / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 0%, color(xyz-d65 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 0%, color(xyz-d65 .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 2 3 4 / 5), color(xyz-d65 4 6 8 / 10))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 2 3 4 / 5), color(xyz-d65 4 6 8 / 10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 -2 -3 -4), color(xyz-d65 -4 -6 -8))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 -2 -3 -4), color(xyz-d65 -4 -6 -8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 -2 -3 -4 / -5), color(xyz-d65 -4 -6 -8 / -10))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 -2 -3 -4 / -5), color(xyz-d65 -4 -6 -8 / -10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 none none none), color(xyz-d65 none none none))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 none none none), color(xyz-d65 none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 none none none), color(xyz-d65 .5 .6 .7))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 none none none), color(xyz-d65 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 none none none))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 none), color(xyz-d65 .5 .6 .7))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 none), color(xyz-d65 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 none))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 none .2 .3), color(xyz-d65 .5 none .7))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 none .2 .3), color(xyz-d65 .5 none .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7 / 0.5))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7 / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7 / none))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7 / none))' is a supported value for color. expected true got false +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 25%, color(xyz-d65 .5 .6 .7 / .8) 75%)' assert_equals: expected "color(xyz-d65 0.44285715 0.54285717 0.64285713 / 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 30%, color(xyz-d65 .5 .6 .7 / .8) 90%)' assert_equals: expected "color(xyz-d65 0.44285715 0.54285717 0.64285713 / 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 12.5%, color(xyz-d65 .5 .6 .7 / .8) 37.5%)' assert_equals: expected "color(xyz-d65 0.44285715 0.54285717 0.64285713 / 0.35)" but got "rgba(128, 128, 128, 0.5)" +PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 0%, color(xyz-d65 .5 .6 .7 / .8))' +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 2 3 4 / 5), color(xyz-d65 4 6 8 / 10))' assert_equals: expected "color(xyz-d65 3 4.5 6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 -2 -3 -4), color(xyz-d65 -4 -6 -8))' assert_equals: expected "color(xyz-d65 -3 -4.5 -6)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 -2 -3 -4 / -5), color(xyz-d65 -4 -6 -8 / -10))' assert_equals: expected "color(xyz-d65 0 0 0 / 0)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 none none none), color(xyz-d65 none none none))' assert_equals: expected "color(xyz-d65 none none none)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 none none none), color(xyz-d65 .5 .6 .7))' assert_equals: expected "color(xyz-d65 0.5 0.6 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 none none none))' assert_equals: expected "color(xyz-d65 0.1 0.2 0.3)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 none), color(xyz-d65 .5 .6 .7))' assert_equals: expected "color(xyz-d65 0.3 0.4 0.7)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 none))' assert_equals: expected "color(xyz-d65 0.3 0.4 0.3)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 none .2 .3), color(xyz-d65 .5 none .7))' assert_equals: expected "color(xyz-d65 0.5 0.2 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7))' assert_equals: expected "color(xyz-d65 0.3 0.4 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7 / 0.5))' assert_equals: expected "color(xyz-d65 0.3 0.4 0.5 / 0.5)" but got "rgb(128, 128, 128)" +FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7 / none))' assert_equals: expected "color(xyz-d65 0.3 0.4 0.5 / none)" but got "rgb(128, 128, 128)" Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-invalid-color-mix-function-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-invalid-color-mix-function-expected.txt new file mode 100644 index 0000000..5635c3e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-invalid-color-mix-function-expected.txt
@@ -0,0 +1,133 @@ +This is a testharness.js-based test. +Found 129 tests; 109 PASS, 20 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) -10%, hsl(30deg 30% 40%))" should not set the property value +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 150%, hsl(30deg 30% 40%))" should not set the property value assert_equals: expected "" but got "color-mix(hsl, rgb(46, 56, 46) 150%, rgb(133, 102, 71))" +PASS e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 0%, hsl(30deg 30% 40%) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% 40%) -10%, hsl(30deg 30% 40% 80%))" should not set the property value +PASS e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% 40%) 150%, hsl(30deg 30% 40% 80%))" should not set the property value +PASS e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% 40%) 0%, hsl(30deg 30% 40% 80%) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in hsl hue, hsl(120deg 10% 20%), hsl(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hsl shorter, hsl(120deg 10% 20%), hsl(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hsl foo, hsl(120deg 10% 20%), hsl(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hsl hsl(120deg 10% 20%), hsl(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) hsl(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(hsl(120deg 10% 20%), hsl(30deg 30% 40%), in hsl)" should not set the property value +PASS e.style['color'] = "color-mix(hsl(120deg 10% 20%), hsl(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) -10%, hwb(30deg 30% 40%))" should not set the property value +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) 150%, hwb(30deg 30% 40%))" should not set the property value assert_equals: expected "" but got "color-mix(hwb, rgb(26, 204, 26) 150%, rgb(153, 115, 77))" +PASS e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) 0%, hwb(30deg 30% 40%) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% 40%) -10%, hwb(30deg 30% 40% 80%))" should not set the property value +PASS e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% 40%) 150%, hwb(30deg 30% 40% 80%))" should not set the property value +PASS e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% 40%) 0%, hwb(30deg 30% 40% 80%) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in hwb hue, hwb(120deg 10% 20%), hwb(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hwb shorter, hwb(120deg 10% 20%), hwb(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hwb foo, hwb(120deg 10% 20%), hwb(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hwb hwb(120deg 10% 20%), hwb(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) hwb(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(hwb(120deg 10% 20%), hwb(30deg 30% 40%), in hwb)" should not set the property value +PASS e.style['color'] = "color-mix(hwb(120deg 10% 20%), hwb(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in lch, lch(10% 20 30deg) -10%, lch(50% 60 70deg))" should not set the property value +FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg) 150%, lch(50% 60 70deg))" should not set the property value assert_equals: expected "" but got "color-mix(lch, lch(10 20 30) 150%, lch(50 60 70))" +PASS e.style['color'] = "color-mix(in lch, lch(10% 20 30deg) 0%, lch(50% 60 70deg) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in lch, lch(10% 20 30deg / .4) -10%, lch(50% 60 70deg / .8))" should not set the property value +FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg / .4) 150%, lch(50% 60 70deg / .8))" should not set the property value assert_equals: expected "" but got "color-mix(lch, lch(10 20 30 / 0.4) 150%, lch(50 60 70 / 0.8))" +PASS e.style['color'] = "color-mix(in lch, lch(10% 20 30deg / .4) 0%, lch(50% 60 70deg / .8) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in lch hue, lch(10% 20 30deg), lch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in lch shorter, lch(10% 20 30deg), lch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in lch foo, lch(10% 20 30deg), lch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in lch lch(10% 20 30deg), lch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in lch, lch(10% 20 30deg) lch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(lch(10% 20 30deg), lch(50% 60 70deg), in lch)" should not set the property value +PASS e.style['color'] = "color-mix(lch(10% 20 30deg), lch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg) -10%, oklch(50% 60 70deg))" should not set the property value +FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg) 150%, oklch(50% 60 70deg))" should not set the property value assert_equals: expected "" but got "color-mix(oklch, oklch(10 20 30) 150%, oklch(50 60 70))" +PASS e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg) 0%, oklch(50% 60 70deg) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg / .4) -10%, oklch(50% 60 70deg / .8))" should not set the property value +FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg / .4) 150%, oklch(50% 60 70deg / .8))" should not set the property value assert_equals: expected "" but got "color-mix(oklch, oklch(10 20 30 / 0.4) 150%, oklch(50 60 70 / 0.8))" +PASS e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg / .4) 0%, oklch(50% 60 70deg / .8) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in oklch hue, oklch(10% 20 30deg), oklch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in oklch shorter, oklch(10% 20 30deg), oklch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in oklch foo, oklch(10% 20 30deg), oklch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in oklch oklch(10% 20 30deg), oklch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg) oklch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(oklch(10% 20 30deg), oklch(50% 60 70deg), in oklch)" should not set the property value +PASS e.style['color'] = "color-mix(oklch(10% 20 30deg), oklch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in lab, lab(10% 20 30) -10%, lab(50% 60 70))" should not set the property value +FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30) 150%, lab(50% 60 70))" should not set the property value assert_equals: expected "" but got "color-mix(lab, lab(10 20 30) 150%, lab(50 60 70))" +PASS e.style['color'] = "color-mix(in lab, lab(10% 20 30) 0%, lab(50% 60 70) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in lab, lab(10% 20 30 / .4) -10%, lab(50% 60 70 / .8))" should not set the property value +FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30 / .4) 150%, lab(50% 60 70 / .8))" should not set the property value assert_equals: expected "" but got "color-mix(lab, lab(10 20 30 / 0.4) 150%, lab(50 60 70 / 0.8))" +PASS e.style['color'] = "color-mix(in lab, lab(10% 20 30 / .4) 0%, lab(50% 60 70 / .8) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in lab longer hue, lab(10% 20 30), lab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(in lab lab(10% 20 30), lab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(in lab, lab(10% 20 30) lab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(lab(10% 20 30), lab(50% 60 70), in lab)" should not set the property value +PASS e.style['color'] = "color-mix(lab(10% 20 30), lab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(in oklab, oklab(10% 20 30) -10%, oklab(50% 60 70))" should not set the property value +FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30) 150%, oklab(50% 60 70))" should not set the property value assert_equals: expected "" but got "color-mix(oklab, oklab(10 20 30) 150%, oklab(50 60 70))" +PASS e.style['color'] = "color-mix(in oklab, oklab(10% 20 30) 0%, oklab(50% 60 70) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in oklab, oklab(10% 20 30 / .4) -10%, oklab(50% 60 70 / .8))" should not set the property value +FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30 / .4) 150%, oklab(50% 60 70 / .8))" should not set the property value assert_equals: expected "" but got "color-mix(oklab, oklab(10 20 30 / 0.4) 150%, oklab(50 60 70 / 0.8))" +PASS e.style['color'] = "color-mix(in oklab, oklab(10% 20 30 / .4) 0%, oklab(50% 60 70 / .8) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in oklab longer hue, oklab(10% 20 30), oklab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(in oklab oklab(10% 20 30), oklab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(in oklab, oklab(10% 20 30) oklab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(oklab(10% 20 30), oklab(50% 60 70), in oklab)" should not set the property value +PASS e.style['color'] = "color-mix(oklab(10% 20 30), oklab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) -10%, color(srgb .5 .6 .7))" should not set the property value +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) 150%, color(srgb .5 .6 .7))" should not set the property value assert_equals: expected "" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3) 150%, color(srgb 0.5 0.6 0.7))" +PASS e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) 0%, color(srgb .5 .6 .7) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) -10%, color(srgb .5 .6 .7 / .8))" should not set the property value +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 150%, color(srgb .5 .6 .7 / .8))" should not set the property value assert_equals: expected "" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3 / 0.4) 150%, color(srgb 0.5 0.6 0.7 / 0.8))" +PASS e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 0%, color(srgb .5 .6 .7 / .8) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in srgb longer hue, color(srgb .1 .2 .3), color(srgb .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb color(srgb .1 .2 .3), color(srgb .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) color(srgb .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(color(srgb .1 .2 .3), color(srgb .5 .6 .7), in srgb)" should not set the property value +PASS e.style['color'] = "color-mix(color(srgb .1 .2 .3), color(srgb .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) -10%, color(srgb-linear .5 .6 .7))" should not set the property value +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 150%, color(srgb-linear .5 .6 .7))" should not set the property value assert_equals: expected "" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3) 150%, color(srgb-linear 0.5 0.6 0.7))" +PASS e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 0%, color(srgb-linear .5 .6 .7) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) -10%, color(srgb-linear .5 .6 .7 / .8))" should not set the property value +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 150%, color(srgb-linear .5 .6 .7 / .8))" should not set the property value assert_equals: expected "" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3 / 0.4) 150%, color(srgb-linear 0.5 0.6 0.7 / 0.8))" +PASS e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 0%, color(srgb-linear .5 .6 .7 / .8) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in srgb-linear longer hue, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb-linear color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) color(srgb-linear .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7), in srgb-linear)" should not set the property value +PASS e.style['color'] = "color-mix(color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) -10%, color(xyz .5 .6 .7))" should not set the property value +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) 150%, color(xyz .5 .6 .7))" should not set the property value assert_equals: expected "" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3) 150%, color(xyz-d65 0.5 0.6 0.7))" +PASS e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) 0%, color(xyz .5 .6 .7) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) -10%, color(xyz .5 .6 .7 / .8))" should not set the property value +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 150%, color(xyz .5 .6 .7 / .8))" should not set the property value assert_equals: expected "" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / 0.4) 150%, color(xyz-d65 0.5 0.6 0.7 / 0.8))" +PASS e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 0%, color(xyz .5 .6 .7 / .8) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in xyz longer hue, color(xyz .1 .2 .3), color(xyz .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz color(xyz .1 .2 .3), color(xyz .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) color(xyz .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(color(xyz .1 .2 .3), color(xyz .5 .6 .7), in xyz)" should not set the property value +PASS e.style['color'] = "color-mix(color(xyz .1 .2 .3), color(xyz .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) -10%, color(xyz-d50 .5 .6 .7))" should not set the property value +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 150%, color(xyz-d50 .5 .6 .7))" should not set the property value assert_equals: expected "" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3) 150%, color(xyz-d50 0.5 0.6 0.7))" +PASS e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 0%, color(xyz-d50 .5 .6 .7) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) -10%, color(xyz-d50 .5 .6 .7 / .8))" should not set the property value +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 150%, color(xyz-d50 .5 .6 .7 / .8))" should not set the property value assert_equals: expected "" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3 / 0.4) 150%, color(xyz-d50 0.5 0.6 0.7 / 0.8))" +PASS e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 0%, color(xyz-d50 .5 .6 .7 / .8) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d50 longer hue, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d50 color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) color(xyz-d50 .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7), in xyz-d50)" should not set the property value +PASS e.style['color'] = "color-mix(color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) -10%, color(xyz-d65 .5 .6 .7))" should not set the property value +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 150%, color(xyz-d65 .5 .6 .7))" should not set the property value assert_equals: expected "" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3) 150%, color(xyz-d65 0.5 0.6 0.7))" +PASS e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 0%, color(xyz-d65 .5 .6 .7) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) -10%, color(xyz-d65 .5 .6 .7 / .8))" should not set the property value +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 150%, color(xyz-d65 .5 .6 .7 / .8))" should not set the property value assert_equals: expected "" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / 0.4) 150%, color(xyz-d65 0.5 0.6 0.7 / 0.8))" +PASS e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 0%, color(xyz-d65 .5 .6 .7 / .8) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d65 longer hue, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d65 color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) color(xyz-d65 .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7), in xyz-d65)" should not set the property value +PASS e.style['color'] = "color-mix(color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))" should not set the property value +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-color-mix-function-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-color-mix-function-expected.txt index 7116c47..932d482 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-color-mix-function-expected.txt +++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-color-mix-function-expected.txt
@@ -1,478 +1,478 @@ This is a testharness.js-based test. Found 474 tests; 0 PASS, 474 FAIL, 0 TIMEOUT, 0 NOTRUN. -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(84, 92, 61)" but got "color-mix(hsl, rgb(46, 56, 46), rgb(133, 102, 71))" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(112, 106, 67)" but got "color-mix(hsl, rgb(46, 56, 46) 25%, rgb(133, 102, 71))" FAIL e.style['color'] = "color-mix(in hsl, 25% hsl(120deg 10% 20%), hsl(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%), 25% hsl(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 30%, hsl(30deg 30% 40%) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 12.5%, hsl(30deg 30% 40%) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 0%, hsl(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%) 25%)" should set the property value assert_equals: serialization should be canonical expected "rgb(61, 73, 54)" but got "color-mix(hsl, rgb(46, 56, 46), rgb(133, 102, 71) 25%)" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%) 75%)" should set the property value assert_equals: serialization should be canonical expected "rgb(112, 106, 67)" but got "color-mix(hsl, rgb(46, 56, 46) 25%, rgb(133, 102, 71) 75%)" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 30%, hsl(30deg 30% 40%) 90%)" should set the property value assert_equals: serialization should be canonical expected "rgb(112, 106, 67)" but got "color-mix(hsl, rgb(46, 56, 46) 30%, rgb(133, 102, 71) 90%)" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 12.5%, hsl(30deg 30% 40%) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "rgba(112, 106, 67, 0.5)" but got "color-mix(hsl, rgb(46, 56, 46) 12.5%, rgb(133, 102, 71) 37.5%)" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 0%, hsl(30deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(133, 102, 71)" but got "color-mix(hsl, rgb(46, 56, 46) 0%, rgb(133, 102, 71))" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))" should set the property value assert_equals: serialization should be canonical expected "rgba(95, 105, 65, 0.6)" but got "color-mix(hsl, rgba(46, 56, 46, 0.4), rgba(133, 102, 71, 0.8))" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40% / .8))" should set the property value assert_equals: serialization should be canonical expected "rgba(108, 103, 66, 0.85)" but got "color-mix(hsl, rgb(46, 56, 46) 25%, rgba(133, 102, 71, 0.8))" FAIL e.style['color'] = "color-mix(in hsl, 25% hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4), 25% hsl(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4) 25%, hsl(30deg 30% 40% / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4) 30%, hsl(30deg 30% 40% / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4) 12.5%, hsl(30deg 30% 40% / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4) 0%, hsl(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(40deg 50% 50%), hsl(60deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(60deg 50% 50%), hsl(40deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(50deg 50% 50%), hsl(330deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(330deg 50% 50%), hsl(50deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(20deg 50% 50%), hsl(320deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(320deg 50% 50%), hsl(20deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl shorter hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl shorter hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl shorter hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl shorter hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl shorter hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl shorter hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl longer hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl longer hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl longer hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl longer hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl longer hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl longer hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl increasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl increasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl increasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl increasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl increasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl increasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl decreasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl decreasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl decreasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl decreasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl decreasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl decreasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl specified hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl specified hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl specified hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl specified hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl specified hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl specified hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(none none none), hsl(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(none none none), hsl(30deg 40% 80%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 20% 40%), hsl(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 20% none), hsl(30deg 40% 60%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 20% 40%), hsl(30deg 20% none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(none 20% 40%), hsl(30deg none 80%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8) 25%)" should set the property value assert_equals: serialization should be canonical expected "rgba(68, 84, 59, 0.5)" but got "color-mix(hsl, rgba(46, 56, 46, 0.4), rgba(133, 102, 71, 0.8) 25%)" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4) 25%, hsl(30deg 30% 40% / .8) 75%)" should set the property value assert_equals: serialization should be canonical expected "rgba(121, 114, 69, 0.7)" but got "color-mix(hsl, rgba(46, 56, 46, 0.4) 25%, rgba(133, 102, 71, 0.8) 75%)" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4) 30%, hsl(30deg 30% 40% / .8) 90%)" should set the property value assert_equals: serialization should be canonical expected "rgba(121, 114, 69, 0.7)" but got "color-mix(hsl, rgba(46, 56, 46, 0.4) 30%, rgba(133, 102, 71, 0.8) 90%)" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4) 12.5%, hsl(30deg 30% 40% / .8) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "rgba(121, 114, 69, 0.35)" but got "color-mix(hsl, rgba(46, 56, 46, 0.4) 12.5%, rgba(133, 102, 71, 0.8) 37.5%)" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4) 0%, hsl(30deg 30% 40% / .8))" should set the property value assert_equals: serialization should be canonical expected "rgba(133, 102, 71, 0.8)" but got "color-mix(hsl, rgba(46, 56, 46, 0.4) 0%, rgba(133, 102, 71, 0.8))" +FAIL e.style['color'] = "color-mix(in hsl, hsl(40deg 50% 50%), hsl(60deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 170, 64)" but got "color-mix(hsl, rgb(191, 149, 64), rgb(191, 191, 64))" +FAIL e.style['color'] = "color-mix(in hsl, hsl(60deg 50% 50%), hsl(40deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 170, 64)" but got "color-mix(hsl, rgb(191, 191, 64), rgb(191, 149, 64))" +FAIL e.style['color'] = "color-mix(in hsl, hsl(50deg 50% 50%), hsl(330deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 85, 64)" but got "color-mix(hsl, rgb(191, 170, 64), rgb(191, 64, 128))" +FAIL e.style['color'] = "color-mix(in hsl, hsl(330deg 50% 50%), hsl(50deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 85, 64)" but got "color-mix(hsl, rgb(191, 64, 128), rgb(191, 170, 64))" +FAIL e.style['color'] = "color-mix(in hsl, hsl(20deg 50% 50%), hsl(320deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 64, 85)" but got "color-mix(hsl, rgb(191, 106, 64), rgb(191, 64, 149))" +FAIL e.style['color'] = "color-mix(in hsl, hsl(320deg 50% 50%), hsl(20deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 64, 85)" but got "color-mix(hsl, rgb(191, 64, 149), rgb(191, 106, 64))" +FAIL e.style['color'] = "color-mix(in hsl shorter hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 170, 64)" but got "color-mix(hsl, rgb(191, 149, 64), rgb(191, 191, 64))" +FAIL e.style['color'] = "color-mix(in hsl shorter hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 170, 64)" but got "color-mix(hsl, rgb(191, 191, 64), rgb(191, 149, 64))" +FAIL e.style['color'] = "color-mix(in hsl shorter hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 85, 64)" but got "color-mix(hsl, rgb(191, 170, 64), rgb(191, 64, 128))" +FAIL e.style['color'] = "color-mix(in hsl shorter hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 85, 64)" but got "color-mix(hsl, rgb(191, 64, 128), rgb(191, 170, 64))" +FAIL e.style['color'] = "color-mix(in hsl shorter hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 64, 85)" but got "color-mix(hsl, rgb(191, 106, 64), rgb(191, 64, 149))" +FAIL e.style['color'] = "color-mix(in hsl shorter hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 64, 85)" but got "color-mix(hsl, rgb(191, 64, 149), rgb(191, 106, 64))" +FAIL e.style['color'] = "color-mix(in hsl longer hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(64, 85, 191)" but got "color-mix(hsl longer hue, rgb(191, 149, 64), rgb(191, 191, 64))" +FAIL e.style['color'] = "color-mix(in hsl longer hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(64, 85, 191)" but got "color-mix(hsl longer hue, rgb(191, 191, 64), rgb(191, 149, 64))" +FAIL e.style['color'] = "color-mix(in hsl longer hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(64, 170, 191)" but got "color-mix(hsl longer hue, rgb(191, 170, 64), rgb(191, 64, 128))" +FAIL e.style['color'] = "color-mix(in hsl longer hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(64, 170, 191)" but got "color-mix(hsl longer hue, rgb(191, 64, 128), rgb(191, 170, 64))" +FAIL e.style['color'] = "color-mix(in hsl longer hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(64, 191, 170)" but got "color-mix(hsl longer hue, rgb(191, 106, 64), rgb(191, 64, 149))" +FAIL e.style['color'] = "color-mix(in hsl longer hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(64, 191, 170)" but got "color-mix(hsl longer hue, rgb(191, 64, 149), rgb(191, 106, 64))" +FAIL e.style['color'] = "color-mix(in hsl increasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 170, 64)" but got "color-mix(hsl increasing hue, rgb(191, 149, 64), rgb(191, 191, 64))" +FAIL e.style['color'] = "color-mix(in hsl increasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(64, 85, 191)" but got "color-mix(hsl increasing hue, rgb(191, 191, 64), rgb(191, 149, 64))" +FAIL e.style['color'] = "color-mix(in hsl increasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(64, 170, 191)" but got "color-mix(hsl increasing hue, rgb(191, 170, 64), rgb(191, 64, 128))" +FAIL e.style['color'] = "color-mix(in hsl increasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 85, 64)" but got "color-mix(hsl increasing hue, rgb(191, 64, 128), rgb(191, 170, 64))" +FAIL e.style['color'] = "color-mix(in hsl increasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(64, 191, 170)" but got "color-mix(hsl increasing hue, rgb(191, 106, 64), rgb(191, 64, 149))" +FAIL e.style['color'] = "color-mix(in hsl increasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 64, 85)" but got "color-mix(hsl increasing hue, rgb(191, 64, 149), rgb(191, 106, 64))" +FAIL e.style['color'] = "color-mix(in hsl decreasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(64, 85, 191)" but got "color-mix(hsl decreasing hue, rgb(191, 149, 64), rgb(191, 191, 64))" +FAIL e.style['color'] = "color-mix(in hsl decreasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 170, 64)" but got "color-mix(hsl decreasing hue, rgb(191, 191, 64), rgb(191, 149, 64))" +FAIL e.style['color'] = "color-mix(in hsl decreasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 85, 64)" but got "color-mix(hsl decreasing hue, rgb(191, 170, 64), rgb(191, 64, 128))" +FAIL e.style['color'] = "color-mix(in hsl decreasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(64, 170, 191)" but got "color-mix(hsl decreasing hue, rgb(191, 64, 128), rgb(191, 170, 64))" +FAIL e.style['color'] = "color-mix(in hsl decreasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 64, 85)" but got "color-mix(hsl decreasing hue, rgb(191, 106, 64), rgb(191, 64, 149))" +FAIL e.style['color'] = "color-mix(in hsl decreasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(64, 191, 170)" but got "color-mix(hsl decreasing hue, rgb(191, 64, 149), rgb(191, 106, 64))" +FAIL e.style['color'] = "color-mix(in hsl specified hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 170, 64)" but got "color-mix(hsl specified hue, rgb(191, 149, 64), rgb(191, 191, 64))" +FAIL e.style['color'] = "color-mix(in hsl specified hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(191, 170, 64)" but got "color-mix(hsl specified hue, rgb(191, 191, 64), rgb(191, 149, 64))" +FAIL e.style['color'] = "color-mix(in hsl specified hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(64, 170, 191)" but got "color-mix(hsl specified hue, rgb(191, 170, 64), rgb(191, 64, 128))" +FAIL e.style['color'] = "color-mix(in hsl specified hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(64, 170, 191)" but got "color-mix(hsl specified hue, rgb(191, 64, 128), rgb(191, 170, 64))" +FAIL e.style['color'] = "color-mix(in hsl specified hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(64, 191, 170)" but got "color-mix(hsl specified hue, rgb(191, 106, 64), rgb(191, 64, 149))" +FAIL e.style['color'] = "color-mix(in hsl specified hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))" should set the property value assert_equals: serialization should be canonical expected "rgb(64, 191, 170)" but got "color-mix(hsl specified hue, rgb(191, 64, 149), rgb(191, 106, 64))" +FAIL e.style['color'] = "color-mix(in hsl, hsl(none none none), hsl(none none none))" should set the property value assert_equals: serialization should be canonical expected "rgb(0, 0, 0)" but got "color-mix(hsl, rgb(0, 0, 0), rgb(0, 0, 0))" +FAIL e.style['color'] = "color-mix(in hsl, hsl(none none none), hsl(30deg 40% 80%))" should set the property value assert_equals: serialization should be canonical expected "rgb(224, 204, 184)" but got "color-mix(hsl, rgb(0, 0, 0), rgb(224, 204, 184))" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 20% 40%), hsl(none none none))" should set the property value assert_equals: serialization should be canonical expected "rgb(82, 122, 82)" but got "color-mix(hsl, rgb(82, 122, 82), rgb(0, 0, 0))" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 20% none), hsl(30deg 40% 60%))" should set the property value assert_equals: serialization should be canonical expected "rgb(168, 184, 122)" but got "color-mix(hsl, rgb(0, 0, 0), rgb(194, 153, 112))" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 20% 40%), hsl(30deg 20% none))" should set the property value assert_equals: serialization should be canonical expected "rgb(112, 122, 82)" but got "color-mix(hsl, rgb(82, 122, 82), rgb(0, 0, 0))" +FAIL e.style['color'] = "color-mix(in hsl, hsl(none 20% 40%), hsl(30deg none 80%))" should set the property value assert_equals: serialization should be canonical expected "rgb(173, 153, 133)" but got "color-mix(hsl, rgb(122, 82, 82), rgb(204, 204, 204))" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(143, 143, 61)" but got "color-mix(hsl, rgba(61, 143, 61, 0), rgb(143, 61, 61))" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / 0.5))" should set the property value assert_equals: serialization should be canonical expected "rgba(143, 143, 61, 0.5)" but got "color-mix(hsl, rgba(61, 143, 61, 0), rgba(143, 61, 61, 0.5))" +FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / none))" should set the property value assert_equals: serialization should be canonical expected "rgba(143, 143, 61, 0)" but got "color-mix(hsl, rgba(61, 143, 61, 0), rgba(143, 61, 61, 0))" +FAIL e.style['color'] = "color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_equals: serialization should be canonical expected "rgb(0, 249, 66)" but got "color-mix(hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)" +FAIL e.style['color'] = "color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_equals: serialization should be canonical expected "rgb(255, 255, 255)" but got "color-mix(hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" +FAIL e.style['color'] = "color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_equals: serialization should be canonical expected "rgb(42, 0, 34)" but got "color-mix(hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" +FAIL e.style['color'] = "color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_equals: serialization should be canonical expected "rgb(255, 255, 255)" but got "color-mix(hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)" +FAIL e.style['color'] = "color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_equals: serialization should be canonical expected "rgb(42, 0, 34)" but got "color-mix(hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)" +FAIL e.style['color'] = "color-mix(in hsl, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_equals: serialization should be canonical expected "rgb(255, 255, 255)" but got "color-mix(hsl, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" +FAIL e.style['color'] = "color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_equals: serialization should be canonical expected "rgb(0, 0, 0)" but got "color-mix(hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" +FAIL e.style['color'] = "color-mix(in hsl, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_equals: serialization should be canonical expected "rgb(255, 255, 255)" but got "color-mix(hsl, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" +FAIL e.style['color'] = "color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_equals: serialization should be canonical expected "rgb(0, 0, 0)" but got "color-mix(hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(147, 179, 52)" but got "color-mix(hwb, rgb(26, 204, 26), rgb(153, 115, 77))" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(166, 153, 64)" but got "color-mix(hwb, rgb(26, 204, 26) 25%, rgb(153, 115, 77))" FAIL e.style['color'] = "color-mix(in hwb, 25% hwb(120deg 10% 20%), hwb(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) 30%, hwb(30deg 30% 40%) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) 12.5%, hwb(30deg 30% 40%) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) 0%, hwb(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%) 25%)" should set the property value assert_equals: serialization should be canonical expected "rgb(96, 191, 39)" but got "color-mix(hwb, rgb(26, 204, 26), rgb(153, 115, 77) 25%)" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%) 75%)" should set the property value assert_equals: serialization should be canonical expected "rgb(166, 153, 64)" but got "color-mix(hwb, rgb(26, 204, 26) 25%, rgb(153, 115, 77) 75%)" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) 30%, hwb(30deg 30% 40%) 90%)" should set the property value assert_equals: serialization should be canonical expected "rgb(166, 153, 64)" but got "color-mix(hwb, rgb(26, 204, 26) 30%, rgb(153, 115, 77) 90%)" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) 12.5%, hwb(30deg 30% 40%) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "rgba(166, 153, 64, 0.5)" but got "color-mix(hwb, rgb(26, 204, 26) 12.5%, rgb(153, 115, 77) 37.5%)" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) 0%, hwb(30deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 115, 77)" but got "color-mix(hwb, rgb(26, 204, 26) 0%, rgb(153, 115, 77))" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))" should set the property value assert_equals: serialization should be canonical expected "rgba(143, 170, 60, 0.6)" but got "color-mix(hwb, rgba(26, 204, 26, 0.4), rgba(153, 115, 77, 0.8))" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8))" should set the property value assert_equals: serialization should be canonical expected "rgba(160, 149, 70, 0.7)" but got "color-mix(hwb, rgba(26, 204, 26, 0.4) 25%, rgba(153, 115, 77, 0.8))" FAIL e.style['color'] = "color-mix(in hwb, 25% hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4) 30%, hwb(30deg 30% 40% / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4) 12.5%, hwb(30deg 30% 40% / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4) 0%, hwb(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(40deg 30% 40%), hwb(60deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(60deg 30% 40%), hwb(40deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(50deg 30% 40%), hwb(330deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(330deg 30% 40%), hwb(50deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(20deg 30% 40%), hwb(320deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(320deg 30% 40%), hwb(20deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb shorter hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb shorter hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb shorter hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb shorter hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb shorter hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb shorter hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb longer hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb longer hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb longer hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb longer hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb longer hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb longer hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb increasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb increasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb increasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb increasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb increasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb increasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb decreasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb decreasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb decreasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb decreasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb decreasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb decreasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb specified hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb specified hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb specified hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb specified hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb specified hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb specified hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(none none none), hwb(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(none none none), hwb(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%), hwb(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% none), hwb(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(none 10% 20%), hwb(30deg none 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg), lch(50 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg) 25%, lch(50 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8) 25%)" should set the property value assert_equals: serialization should be canonical expected "rgba(98, 184, 46, 0.5)" but got "color-mix(hwb, rgba(26, 204, 26, 0.4), rgba(153, 115, 77, 0.8) 25%)" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8) 75%)" should set the property value assert_equals: serialization should be canonical expected "rgba(160, 149, 70, 0.7)" but got "color-mix(hwb, rgba(26, 204, 26, 0.4) 25%, rgba(153, 115, 77, 0.8) 75%)" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4) 30%, hwb(30deg 30% 40% / .8) 90%)" should set the property value assert_equals: serialization should be canonical expected "rgba(160, 149, 70, 0.7)" but got "color-mix(hwb, rgba(26, 204, 26, 0.4) 30%, rgba(153, 115, 77, 0.8) 90%)" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4) 12.5%, hwb(30deg 30% 40% / .8) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "rgba(160, 149, 70, 0.35)" but got "color-mix(hwb, rgba(26, 204, 26, 0.4) 12.5%, rgba(153, 115, 77, 0.8) 37.5%)" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4) 0%, hwb(30deg 30% 40% / .8))" should set the property value assert_equals: serialization should be canonical expected "rgba(153, 115, 77, 0.8)" but got "color-mix(hwb, rgba(26, 204, 26, 0.4) 0%, rgba(153, 115, 77, 0.8))" +FAIL e.style['color'] = "color-mix(in hwb, hwb(40deg 30% 40%), hwb(60deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 140, 77)" but got "color-mix(hwb, rgb(153, 128, 77), rgb(153, 153, 77))" +FAIL e.style['color'] = "color-mix(in hwb, hwb(60deg 30% 40%), hwb(40deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 140, 77)" but got "color-mix(hwb, rgb(153, 153, 77), rgb(153, 128, 77))" +FAIL e.style['color'] = "color-mix(in hwb, hwb(50deg 30% 40%), hwb(330deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 89, 77)" but got "color-mix(hwb, rgb(153, 140, 77), rgb(153, 77, 115))" +FAIL e.style['color'] = "color-mix(in hwb, hwb(330deg 30% 40%), hwb(50deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 89, 77)" but got "color-mix(hwb, rgb(153, 77, 115), rgb(153, 140, 77))" +FAIL e.style['color'] = "color-mix(in hwb, hwb(20deg 30% 40%), hwb(320deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 77, 89)" but got "color-mix(hwb, rgb(153, 102, 77), rgb(153, 77, 128))" +FAIL e.style['color'] = "color-mix(in hwb, hwb(320deg 30% 40%), hwb(20deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 77, 89)" but got "color-mix(hwb, rgb(153, 77, 128), rgb(153, 102, 77))" +FAIL e.style['color'] = "color-mix(in hwb shorter hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 140, 77)" but got "color-mix(hwb, rgb(153, 128, 77), rgb(153, 153, 77))" +FAIL e.style['color'] = "color-mix(in hwb shorter hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 140, 77)" but got "color-mix(hwb, rgb(153, 153, 77), rgb(153, 128, 77))" +FAIL e.style['color'] = "color-mix(in hwb shorter hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 89, 77)" but got "color-mix(hwb, rgb(153, 140, 77), rgb(153, 77, 115))" +FAIL e.style['color'] = "color-mix(in hwb shorter hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 89, 77)" but got "color-mix(hwb, rgb(153, 77, 115), rgb(153, 140, 77))" +FAIL e.style['color'] = "color-mix(in hwb shorter hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 77, 89)" but got "color-mix(hwb, rgb(153, 102, 77), rgb(153, 77, 128))" +FAIL e.style['color'] = "color-mix(in hwb shorter hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 77, 89)" but got "color-mix(hwb, rgb(153, 77, 128), rgb(153, 102, 77))" +FAIL e.style['color'] = "color-mix(in hwb longer hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(77, 89, 153)" but got "color-mix(hwb longer hue, rgb(153, 128, 77), rgb(153, 153, 77))" +FAIL e.style['color'] = "color-mix(in hwb longer hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(77, 89, 153)" but got "color-mix(hwb longer hue, rgb(153, 153, 77), rgb(153, 128, 77))" +FAIL e.style['color'] = "color-mix(in hwb longer hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(77, 140, 153)" but got "color-mix(hwb longer hue, rgb(153, 140, 77), rgb(153, 77, 115))" +FAIL e.style['color'] = "color-mix(in hwb longer hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(77, 140, 153)" but got "color-mix(hwb longer hue, rgb(153, 77, 115), rgb(153, 140, 77))" +FAIL e.style['color'] = "color-mix(in hwb longer hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(77, 153, 140)" but got "color-mix(hwb longer hue, rgb(153, 102, 77), rgb(153, 77, 128))" +FAIL e.style['color'] = "color-mix(in hwb longer hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(77, 153, 140)" but got "color-mix(hwb longer hue, rgb(153, 77, 128), rgb(153, 102, 77))" +FAIL e.style['color'] = "color-mix(in hwb increasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 140, 77)" but got "color-mix(hwb increasing hue, rgb(153, 128, 77), rgb(153, 153, 77))" +FAIL e.style['color'] = "color-mix(in hwb increasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(77, 89, 153)" but got "color-mix(hwb increasing hue, rgb(153, 153, 77), rgb(153, 128, 77))" +FAIL e.style['color'] = "color-mix(in hwb increasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(77, 140, 153)" but got "color-mix(hwb increasing hue, rgb(153, 140, 77), rgb(153, 77, 115))" +FAIL e.style['color'] = "color-mix(in hwb increasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 89, 77)" but got "color-mix(hwb increasing hue, rgb(153, 77, 115), rgb(153, 140, 77))" +FAIL e.style['color'] = "color-mix(in hwb increasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(77, 153, 140)" but got "color-mix(hwb increasing hue, rgb(153, 102, 77), rgb(153, 77, 128))" +FAIL e.style['color'] = "color-mix(in hwb increasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 77, 89)" but got "color-mix(hwb increasing hue, rgb(153, 77, 128), rgb(153, 102, 77))" +FAIL e.style['color'] = "color-mix(in hwb decreasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(77, 89, 153)" but got "color-mix(hwb decreasing hue, rgb(153, 128, 77), rgb(153, 153, 77))" +FAIL e.style['color'] = "color-mix(in hwb decreasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 140, 77)" but got "color-mix(hwb decreasing hue, rgb(153, 153, 77), rgb(153, 128, 77))" +FAIL e.style['color'] = "color-mix(in hwb decreasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 89, 77)" but got "color-mix(hwb decreasing hue, rgb(153, 140, 77), rgb(153, 77, 115))" +FAIL e.style['color'] = "color-mix(in hwb decreasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(77, 140, 153)" but got "color-mix(hwb decreasing hue, rgb(153, 77, 115), rgb(153, 140, 77))" +FAIL e.style['color'] = "color-mix(in hwb decreasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 77, 89)" but got "color-mix(hwb decreasing hue, rgb(153, 102, 77), rgb(153, 77, 128))" +FAIL e.style['color'] = "color-mix(in hwb decreasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(77, 153, 140)" but got "color-mix(hwb decreasing hue, rgb(153, 77, 128), rgb(153, 102, 77))" +FAIL e.style['color'] = "color-mix(in hwb specified hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 140, 77)" but got "color-mix(hwb specified hue, rgb(153, 128, 77), rgb(153, 153, 77))" +FAIL e.style['color'] = "color-mix(in hwb specified hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 140, 77)" but got "color-mix(hwb specified hue, rgb(153, 153, 77), rgb(153, 128, 77))" +FAIL e.style['color'] = "color-mix(in hwb specified hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(77, 140, 153)" but got "color-mix(hwb specified hue, rgb(153, 140, 77), rgb(153, 77, 115))" +FAIL e.style['color'] = "color-mix(in hwb specified hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(77, 140, 153)" but got "color-mix(hwb specified hue, rgb(153, 77, 115), rgb(153, 140, 77))" +FAIL e.style['color'] = "color-mix(in hwb specified hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(77, 153, 140)" but got "color-mix(hwb specified hue, rgb(153, 102, 77), rgb(153, 77, 128))" +FAIL e.style['color'] = "color-mix(in hwb specified hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(77, 153, 140)" but got "color-mix(hwb specified hue, rgb(153, 77, 128), rgb(153, 102, 77))" +FAIL e.style['color'] = "color-mix(in hwb, hwb(none none none), hwb(none none none))" should set the property value assert_equals: serialization should be canonical expected "rgb(255, 0, 0)" but got "color-mix(hwb, rgb(255, 0, 0), rgb(255, 0, 0))" +FAIL e.style['color'] = "color-mix(in hwb, hwb(none none none), hwb(30deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(153, 115, 77)" but got "color-mix(hwb, rgb(255, 0, 0), rgb(153, 115, 77))" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%), hwb(none none none))" should set the property value assert_equals: serialization should be canonical expected "rgb(26, 204, 26)" but got "color-mix(hwb, rgb(26, 204, 26), rgb(255, 0, 0))" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% none), hwb(30deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(127, 153, 51)" but got "color-mix(hwb, rgb(26, 255, 26), rgb(153, 115, 77))" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% none))" should set the property value assert_equals: serialization should be canonical expected "rgb(166, 204, 51)" but got "color-mix(hwb, rgb(26, 204, 26), rgb(255, 166, 77))" +FAIL e.style['color'] = "color-mix(in hwb, hwb(none 10% 20%), hwb(30deg none 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(179, 102, 26)" but got "color-mix(hwb, rgb(204, 26, 26), rgb(153, 77, 0))" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40%))" should set the property value assert_equals: serialization should be canonical expected "rgb(147, 179, 51)" but got "color-mix(hwb, rgba(26, 204, 26, 0), rgb(153, 115, 77))" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / 0.5))" should set the property value assert_equals: serialization should be canonical expected "rgba(147, 179, 51, 0.5)" but got "color-mix(hwb, rgba(26, 204, 26, 0), rgba(153, 115, 77, 0.5))" +FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / none))" should set the property value assert_equals: serialization should be canonical expected "rgba(147, 179, 51, 0)" but got "color-mix(hwb, rgba(26, 204, 26, 0), rgba(153, 115, 77, 0))" +FAIL e.style['color'] = "color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_equals: serialization should be canonical expected "rgb(0, 249, 66)" but got "color-mix(hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)" +FAIL e.style['color'] = "color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_equals: serialization should be canonical expected "rgb(255, 255, 255)" but got "color-mix(hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" +FAIL e.style['color'] = "color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_equals: serialization should be canonical expected "rgb(42, 0, 34)" but got "color-mix(hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" +FAIL e.style['color'] = "color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_equals: serialization should be canonical expected "rgb(255, 255, 255)" but got "color-mix(hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)" +FAIL e.style['color'] = "color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_equals: serialization should be canonical expected "rgb(42, 0, 34)" but got "color-mix(hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)" +FAIL e.style['color'] = "color-mix(in hwb, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_equals: serialization should be canonical expected "rgb(255, 255, 255)" but got "color-mix(hwb, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" +FAIL e.style['color'] = "color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_equals: serialization should be canonical expected "rgb(0, 0, 0)" but got "color-mix(hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" +FAIL e.style['color'] = "color-mix(in hwb, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_equals: serialization should be canonical expected "rgb(255, 255, 255)" but got "color-mix(hwb, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" +FAIL e.style['color'] = "color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_equals: serialization should be canonical expected "rgb(0, 0, 0)" but got "color-mix(hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg), lch(50 60 70deg))" should set the property value assert_equals: serialization should be canonical expected "lch(30 40 50)" but got "color-mix(lch, lch(10 20 30), lch(50 60 70))" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg) 25%, lch(50 60 70deg))" should set the property value assert_equals: serialization should be canonical expected "lch(40 50 60)" but got "color-mix(lch, lch(10 20 30) 25%, lch(50 60 70))" FAIL e.style['color'] = "color-mix(in lch, 25% lch(10 20 30deg), lch(50 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg), 25% lch(50 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg), lch(50 60 70deg) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg) 25%, lch(50 60 70deg) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg) 30%, lch(50 60 70deg) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg) 12.5%, lch(50 60 70deg) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg) 0%, lch(50 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / .4), lch(50 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / .4) 25%, lch(50 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg), lch(50 60 70deg) 25%)" should set the property value assert_equals: serialization should be canonical expected "lch(20 30 40)" but got "color-mix(lch, lch(10 20 30), lch(50 60 70) 25%)" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg) 25%, lch(50 60 70deg) 75%)" should set the property value assert_equals: serialization should be canonical expected "lch(40 50 60)" but got "color-mix(lch, lch(10 20 30) 25%, lch(50 60 70) 75%)" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg) 30%, lch(50 60 70deg) 90%)" should set the property value assert_equals: serialization should be canonical expected "lch(40 50 60)" but got "color-mix(lch, lch(10 20 30) 30%, lch(50 60 70) 90%)" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg) 12.5%, lch(50 60 70deg) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "lch(40 50 60 / 0.5)" but got "color-mix(lch, lch(10 20 30) 12.5%, lch(50 60 70) 37.5%)" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg) 0%, lch(50 60 70deg))" should set the property value assert_equals: serialization should be canonical expected "lch(50 60 70)" but got "color-mix(lch, lch(10 20 30) 0%, lch(50 60 70))" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / .4), lch(50 60 70deg / .8))" should set the property value assert_equals: serialization should be canonical expected "lch(36.666664 46.666664 50 / 0.6)" but got "color-mix(lch, lch(10 20 30 / 0.4), lch(50 60 70 / 0.8))" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / .4) 25%, lch(50 60 70deg / .8))" should set the property value assert_equals: serialization should be canonical expected "lch(44.285713 54.285717 60 / 0.7)" but got "color-mix(lch, lch(10 20 30 / 0.4) 25%, lch(50 60 70 / 0.8))" FAIL e.style['color'] = "color-mix(in lch, 25% lch(10 20 30deg / .4), lch(50 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / .4), 25% lch(50 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / .4), lch(50 60 70deg / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / .4) 25%, lch(50 60 70deg / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / .4) 30%, lch(50 60 70deg / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / .4) 12.5%, lch(50 60 70deg / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / .4) 0%, lch(50 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(100 0 40deg), lch(100 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(100 0 60deg), lch(100 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(100 0 50deg), lch(100 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(100 0 330deg), lch(100 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(100 0 20deg), lch(100 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(100 0 320deg), lch(100 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch shorter hue, lch(100 0 40deg), lch(100 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch shorter hue, lch(100 0 60deg), lch(100 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch shorter hue, lch(100 0 50deg), lch(100 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch shorter hue, lch(100 0 330deg), lch(100 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch shorter hue, lch(100 0 20deg), lch(100 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch shorter hue, lch(100 0 320deg), lch(100 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch longer hue, lch(100 0 40deg), lch(100 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch longer hue, lch(100 0 60deg), lch(100 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch longer hue, lch(100 0 50deg), lch(100 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch longer hue, lch(100 0 330deg), lch(100 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch longer hue, lch(100 0 20deg), lch(100 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch longer hue, lch(100 0 320deg), lch(100 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch increasing hue, lch(100 0 40deg), lch(100 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch increasing hue, lch(100 0 60deg), lch(100 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch increasing hue, lch(100 0 50deg), lch(100 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch increasing hue, lch(100 0 330deg), lch(100 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch increasing hue, lch(100 0 20deg), lch(100 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch increasing hue, lch(100 0 320deg), lch(100 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch decreasing hue, lch(100 0 40deg), lch(100 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch decreasing hue, lch(100 0 60deg), lch(100 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch decreasing hue, lch(100 0 50deg), lch(100 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch decreasing hue, lch(100 0 330deg), lch(100 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch decreasing hue, lch(100 0 20deg), lch(100 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch decreasing hue, lch(100 0 320deg), lch(100 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch specified hue, lch(100 0 40deg), lch(100 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch specified hue, lch(100 0 60deg), lch(100 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch specified hue, lch(100 0 50deg), lch(100 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch specified hue, lch(100 0 330deg), lch(100 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch specified hue, lch(100 0 20deg), lch(100 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch specified hue, lch(100 0 320deg), lch(100 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(none none none), lch(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(none none none), lch(50 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg), lch(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 none), lch(50 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg), lch(50 60 none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(none 20 30deg), lch(50 none 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / none), lch(50 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / none), lch(50 60 70deg / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / none), lch(50 60 70deg / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg), oklch(50 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg) 25%, oklch(50 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / .4), lch(50 60 70deg / .8) 25%)" should set the property value assert_equals: serialization should be canonical expected "lch(26 36 40 / 0.5)" but got "color-mix(lch, lch(10 20 30 / 0.4), lch(50 60 70 / 0.8) 25%)" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / .4) 25%, lch(50 60 70deg / .8) 75%)" should set the property value assert_equals: serialization should be canonical expected "lch(44.285713 54.285717 60 / 0.7)" but got "color-mix(lch, lch(10 20 30 / 0.4) 25%, lch(50 60 70 / 0.8) 75%)" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / .4) 30%, lch(50 60 70deg / .8) 90%)" should set the property value assert_equals: serialization should be canonical expected "lch(44.285713 54.285717 60 / 0.7)" but got "color-mix(lch, lch(10 20 30 / 0.4) 30%, lch(50 60 70 / 0.8) 90%)" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / .4) 12.5%, lch(50 60 70deg / .8) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "lch(44.285713 54.285717 60 / 0.35)" but got "color-mix(lch, lch(10 20 30 / 0.4) 12.5%, lch(50 60 70 / 0.8) 37.5%)" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / .4) 0%, lch(50 60 70deg / .8))" should set the property value assert_equals: serialization should be canonical expected "lch(50 60 70 / 0.8)" but got "color-mix(lch, lch(10 20 30 / 0.4) 0%, lch(50 60 70 / 0.8))" +FAIL e.style['color'] = "color-mix(in lch, lch(100 0 40deg), lch(100 0 60deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 50)" but got "color-mix(lch, lch(100 0 40), lch(100 0 60))" +FAIL e.style['color'] = "color-mix(in lch, lch(100 0 60deg), lch(100 0 40deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 50)" but got "color-mix(lch, lch(100 0 60), lch(100 0 40))" +FAIL e.style['color'] = "color-mix(in lch, lch(100 0 50deg), lch(100 0 330deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 10)" but got "color-mix(lch, lch(100 0 50), lch(100 0 330))" +FAIL e.style['color'] = "color-mix(in lch, lch(100 0 330deg), lch(100 0 50deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 10)" but got "color-mix(lch, lch(100 0 330), lch(100 0 50))" +FAIL e.style['color'] = "color-mix(in lch, lch(100 0 20deg), lch(100 0 320deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 350)" but got "color-mix(lch, lch(100 0 20), lch(100 0 320))" +FAIL e.style['color'] = "color-mix(in lch, lch(100 0 320deg), lch(100 0 20deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 350)" but got "color-mix(lch, lch(100 0 320), lch(100 0 20))" +FAIL e.style['color'] = "color-mix(in lch shorter hue, lch(100 0 40deg), lch(100 0 60deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 50)" but got "color-mix(lch, lch(100 0 40), lch(100 0 60))" +FAIL e.style['color'] = "color-mix(in lch shorter hue, lch(100 0 60deg), lch(100 0 40deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 50)" but got "color-mix(lch, lch(100 0 60), lch(100 0 40))" +FAIL e.style['color'] = "color-mix(in lch shorter hue, lch(100 0 50deg), lch(100 0 330deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 10)" but got "color-mix(lch, lch(100 0 50), lch(100 0 330))" +FAIL e.style['color'] = "color-mix(in lch shorter hue, lch(100 0 330deg), lch(100 0 50deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 10)" but got "color-mix(lch, lch(100 0 330), lch(100 0 50))" +FAIL e.style['color'] = "color-mix(in lch shorter hue, lch(100 0 20deg), lch(100 0 320deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 350)" but got "color-mix(lch, lch(100 0 20), lch(100 0 320))" +FAIL e.style['color'] = "color-mix(in lch shorter hue, lch(100 0 320deg), lch(100 0 20deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 350)" but got "color-mix(lch, lch(100 0 320), lch(100 0 20))" +FAIL e.style['color'] = "color-mix(in lch longer hue, lch(100 0 40deg), lch(100 0 60deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 230)" but got "color-mix(lch longer hue, lch(100 0 40), lch(100 0 60))" +FAIL e.style['color'] = "color-mix(in lch longer hue, lch(100 0 60deg), lch(100 0 40deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 230)" but got "color-mix(lch longer hue, lch(100 0 60), lch(100 0 40))" +FAIL e.style['color'] = "color-mix(in lch longer hue, lch(100 0 50deg), lch(100 0 330deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 190)" but got "color-mix(lch longer hue, lch(100 0 50), lch(100 0 330))" +FAIL e.style['color'] = "color-mix(in lch longer hue, lch(100 0 330deg), lch(100 0 50deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 190)" but got "color-mix(lch longer hue, lch(100 0 330), lch(100 0 50))" +FAIL e.style['color'] = "color-mix(in lch longer hue, lch(100 0 20deg), lch(100 0 320deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 170)" but got "color-mix(lch longer hue, lch(100 0 20), lch(100 0 320))" +FAIL e.style['color'] = "color-mix(in lch longer hue, lch(100 0 320deg), lch(100 0 20deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 170)" but got "color-mix(lch longer hue, lch(100 0 320), lch(100 0 20))" +FAIL e.style['color'] = "color-mix(in lch increasing hue, lch(100 0 40deg), lch(100 0 60deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 50)" but got "color-mix(lch increasing hue, lch(100 0 40), lch(100 0 60))" +FAIL e.style['color'] = "color-mix(in lch increasing hue, lch(100 0 60deg), lch(100 0 40deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 230)" but got "color-mix(lch increasing hue, lch(100 0 60), lch(100 0 40))" +FAIL e.style['color'] = "color-mix(in lch increasing hue, lch(100 0 50deg), lch(100 0 330deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 190)" but got "color-mix(lch increasing hue, lch(100 0 50), lch(100 0 330))" +FAIL e.style['color'] = "color-mix(in lch increasing hue, lch(100 0 330deg), lch(100 0 50deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 10)" but got "color-mix(lch increasing hue, lch(100 0 330), lch(100 0 50))" +FAIL e.style['color'] = "color-mix(in lch increasing hue, lch(100 0 20deg), lch(100 0 320deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 170)" but got "color-mix(lch increasing hue, lch(100 0 20), lch(100 0 320))" +FAIL e.style['color'] = "color-mix(in lch increasing hue, lch(100 0 320deg), lch(100 0 20deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 350)" but got "color-mix(lch increasing hue, lch(100 0 320), lch(100 0 20))" +FAIL e.style['color'] = "color-mix(in lch decreasing hue, lch(100 0 40deg), lch(100 0 60deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 230)" but got "color-mix(lch decreasing hue, lch(100 0 40), lch(100 0 60))" +FAIL e.style['color'] = "color-mix(in lch decreasing hue, lch(100 0 60deg), lch(100 0 40deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 50)" but got "color-mix(lch decreasing hue, lch(100 0 60), lch(100 0 40))" +FAIL e.style['color'] = "color-mix(in lch decreasing hue, lch(100 0 50deg), lch(100 0 330deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 10)" but got "color-mix(lch decreasing hue, lch(100 0 50), lch(100 0 330))" +FAIL e.style['color'] = "color-mix(in lch decreasing hue, lch(100 0 330deg), lch(100 0 50deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 190)" but got "color-mix(lch decreasing hue, lch(100 0 330), lch(100 0 50))" +FAIL e.style['color'] = "color-mix(in lch decreasing hue, lch(100 0 20deg), lch(100 0 320deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 350)" but got "color-mix(lch decreasing hue, lch(100 0 20), lch(100 0 320))" +FAIL e.style['color'] = "color-mix(in lch decreasing hue, lch(100 0 320deg), lch(100 0 20deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 170)" but got "color-mix(lch decreasing hue, lch(100 0 320), lch(100 0 20))" +FAIL e.style['color'] = "color-mix(in lch specified hue, lch(100 0 40deg), lch(100 0 60deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 50)" but got "color-mix(lch specified hue, lch(100 0 40), lch(100 0 60))" +FAIL e.style['color'] = "color-mix(in lch specified hue, lch(100 0 60deg), lch(100 0 40deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 50)" but got "color-mix(lch specified hue, lch(100 0 60), lch(100 0 40))" +FAIL e.style['color'] = "color-mix(in lch specified hue, lch(100 0 50deg), lch(100 0 330deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 190)" but got "color-mix(lch specified hue, lch(100 0 50), lch(100 0 330))" +FAIL e.style['color'] = "color-mix(in lch specified hue, lch(100 0 330deg), lch(100 0 50deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 190)" but got "color-mix(lch specified hue, lch(100 0 330), lch(100 0 50))" +FAIL e.style['color'] = "color-mix(in lch specified hue, lch(100 0 20deg), lch(100 0 320deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 170)" but got "color-mix(lch specified hue, lch(100 0 20), lch(100 0 320))" +FAIL e.style['color'] = "color-mix(in lch specified hue, lch(100 0 320deg), lch(100 0 20deg))" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 170)" but got "color-mix(lch specified hue, lch(100 0 320), lch(100 0 20))" +FAIL e.style['color'] = "color-mix(in lch, lch(none none none), lch(none none none))" should set the property value assert_equals: serialization should be canonical expected "lch(none none none)" but got "color-mix(lch, lch(none none none), lch(none none none))" +FAIL e.style['color'] = "color-mix(in lch, lch(none none none), lch(50 60 70deg))" should set the property value assert_equals: serialization should be canonical expected "lch(50 60 70)" but got "color-mix(lch, lch(none none none), lch(50 60 70))" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg), lch(none none none))" should set the property value assert_equals: serialization should be canonical expected "lch(10 20 30)" but got "color-mix(lch, lch(10 20 30), lch(none none none))" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 none), lch(50 60 70deg))" should set the property value assert_equals: serialization should be canonical expected "lch(30 40 70)" but got "color-mix(lch, lch(10 20 none), lch(50 60 70))" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg), lch(50 60 none))" should set the property value assert_equals: serialization should be canonical expected "lch(30 40 30)" but got "color-mix(lch, lch(10 20 30), lch(50 60 none))" +FAIL e.style['color'] = "color-mix(in lch, lch(none 20 30deg), lch(50 none 70deg))" should set the property value assert_equals: serialization should be canonical expected "lch(50 20 50)" but got "color-mix(lch, lch(none 20 30), lch(50 none 70))" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / none), lch(50 60 70deg))" should set the property value assert_equals: serialization should be canonical expected "lch(30 40 50)" but got "color-mix(lch, lch(10 20 30 / none), lch(50 60 70))" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / none), lch(50 60 70deg / 0.5))" should set the property value assert_equals: serialization should be canonical expected "lch(30 40 50 / 0.5)" but got "color-mix(lch, lch(10 20 30 / none), lch(50 60 70 / 0.5))" +FAIL e.style['color'] = "color-mix(in lch, lch(10 20 30deg / none), lch(50 60 70deg / none))" should set the property value assert_equals: serialization should be canonical expected "lch(30 40 50 / none)" but got "color-mix(lch, lch(10 20 30 / none), lch(50 60 70 / none))" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg), oklch(50 60 70deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(30 40 50)" but got "color-mix(oklch, oklch(10 20 30), oklch(50 60 70))" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg) 25%, oklch(50 60 70deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(40 50 60)" but got "color-mix(oklch, oklch(10 20 30) 25%, oklch(50 60 70))" FAIL e.style['color'] = "color-mix(in oklch, 25% oklch(10 20 30deg), oklch(50 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg), 25% oklch(50 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg), oklch(50 60 70deg) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg) 25%, oklch(50 60 70deg) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg) 30%, oklch(50 60 70deg) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg) 12.5%, oklch(50 60 70deg) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg) 0%, oklch(50 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / .4), oklch(50 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / .4) 25%, oklch(50 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg), oklch(50 60 70deg) 25%)" should set the property value assert_equals: serialization should be canonical expected "oklch(20 30 40)" but got "color-mix(oklch, oklch(10 20 30), oklch(50 60 70) 25%)" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg) 25%, oklch(50 60 70deg) 75%)" should set the property value assert_equals: serialization should be canonical expected "oklch(40 50 60)" but got "color-mix(oklch, oklch(10 20 30) 25%, oklch(50 60 70) 75%)" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg) 30%, oklch(50 60 70deg) 90%)" should set the property value assert_equals: serialization should be canonical expected "oklch(40 50 60)" but got "color-mix(oklch, oklch(10 20 30) 30%, oklch(50 60 70) 90%)" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg) 12.5%, oklch(50 60 70deg) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "oklch(40 50 60 / 0.5)" but got "color-mix(oklch, oklch(10 20 30) 12.5%, oklch(50 60 70) 37.5%)" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg) 0%, oklch(50 60 70deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(50 60 70)" but got "color-mix(oklch, oklch(10 20 30) 0%, oklch(50 60 70))" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / .4), oklch(50 60 70deg / .8))" should set the property value assert_equals: serialization should be canonical expected "oklch(36.666664 46.666664 50 / 0.6)" but got "color-mix(oklch, oklch(10 20 30 / 0.4), oklch(50 60 70 / 0.8))" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / .4) 25%, oklch(50 60 70deg / .8))" should set the property value assert_equals: serialization should be canonical expected "oklch(44.285713 54.285717 60 / 0.7)" but got "color-mix(oklch, oklch(10 20 30 / 0.4) 25%, oklch(50 60 70 / 0.8))" FAIL e.style['color'] = "color-mix(in oklch, 25% oklch(10 20 30deg / .4), oklch(50 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / .4), 25% oklch(50 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / .4), oklch(50 60 70deg / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / .4) 25%, oklch(50 60 70deg / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / .4) 30%, oklch(50 60 70deg / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / .4) 12.5%, oklch(50 60 70deg / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / .4) 0%, oklch(50 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(100 0 40deg), oklch(100 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(100 0 60deg), oklch(100 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(100 0 50deg), oklch(100 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(100 0 330deg), oklch(100 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(100 0 20deg), oklch(100 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(100 0 320deg), oklch(100 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch shorter hue, oklch(100 0 40deg), oklch(100 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch shorter hue, oklch(100 0 60deg), oklch(100 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch shorter hue, oklch(100 0 50deg), oklch(100 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch shorter hue, oklch(100 0 330deg), oklch(100 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch shorter hue, oklch(100 0 20deg), oklch(100 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch shorter hue, oklch(100 0 320deg), oklch(100 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch longer hue, oklch(100 0 40deg), oklch(100 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch longer hue, oklch(100 0 60deg), oklch(100 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch longer hue, oklch(100 0 50deg), oklch(100 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch longer hue, oklch(100 0 330deg), oklch(100 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch longer hue, oklch(100 0 20deg), oklch(100 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch longer hue, oklch(100 0 320deg), oklch(100 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch increasing hue, oklch(100 0 40deg), oklch(100 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch increasing hue, oklch(100 0 60deg), oklch(100 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch increasing hue, oklch(100 0 50deg), oklch(100 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch increasing hue, oklch(100 0 330deg), oklch(100 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch increasing hue, oklch(100 0 20deg), oklch(100 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch increasing hue, oklch(100 0 320deg), oklch(100 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch decreasing hue, oklch(100 0 40deg), oklch(100 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch decreasing hue, oklch(100 0 60deg), oklch(100 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch decreasing hue, oklch(100 0 50deg), oklch(100 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch decreasing hue, oklch(100 0 330deg), oklch(100 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch decreasing hue, oklch(100 0 20deg), oklch(100 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch decreasing hue, oklch(100 0 320deg), oklch(100 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch specified hue, oklch(100 0 40deg), oklch(100 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch specified hue, oklch(100 0 60deg), oklch(100 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch specified hue, oklch(100 0 50deg), oklch(100 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch specified hue, oklch(100 0 330deg), oklch(100 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch specified hue, oklch(100 0 20deg), oklch(100 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch specified hue, oklch(100 0 320deg), oklch(100 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(none none none), oklch(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(none none none), oklch(50 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg), oklch(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 none), oklch(50 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg), oklch(50 60 none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(none 20 30deg), oklch(50 none 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / none), oklch(50 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / none), oklch(50 60 70deg / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / none), oklch(50 60 70deg / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30), lab(50 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / .4), oklch(50 60 70deg / .8) 25%)" should set the property value assert_equals: serialization should be canonical expected "oklch(26 36 40 / 0.5)" but got "color-mix(oklch, oklch(10 20 30 / 0.4), oklch(50 60 70 / 0.8) 25%)" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / .4) 25%, oklch(50 60 70deg / .8) 75%)" should set the property value assert_equals: serialization should be canonical expected "oklch(44.285713 54.285717 60 / 0.7)" but got "color-mix(oklch, oklch(10 20 30 / 0.4) 25%, oklch(50 60 70 / 0.8) 75%)" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / .4) 30%, oklch(50 60 70deg / .8) 90%)" should set the property value assert_equals: serialization should be canonical expected "oklch(44.285713 54.285717 60 / 0.7)" but got "color-mix(oklch, oklch(10 20 30 / 0.4) 30%, oklch(50 60 70 / 0.8) 90%)" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / .4) 12.5%, oklch(50 60 70deg / .8) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "oklch(44.285713 54.285717 60 / 0.35)" but got "color-mix(oklch, oklch(10 20 30 / 0.4) 12.5%, oklch(50 60 70 / 0.8) 37.5%)" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / .4) 0%, oklch(50 60 70deg / .8))" should set the property value assert_equals: serialization should be canonical expected "oklch(50 60 70 / 0.8)" but got "color-mix(oklch, oklch(10 20 30 / 0.4) 0%, oklch(50 60 70 / 0.8))" +FAIL e.style['color'] = "color-mix(in oklch, oklch(100 0 40deg), oklch(100 0 60deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 50)" but got "color-mix(oklch, oklch(100 0 40), oklch(100 0 60))" +FAIL e.style['color'] = "color-mix(in oklch, oklch(100 0 60deg), oklch(100 0 40deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 50)" but got "color-mix(oklch, oklch(100 0 60), oklch(100 0 40))" +FAIL e.style['color'] = "color-mix(in oklch, oklch(100 0 50deg), oklch(100 0 330deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 10)" but got "color-mix(oklch, oklch(100 0 50), oklch(100 0 330))" +FAIL e.style['color'] = "color-mix(in oklch, oklch(100 0 330deg), oklch(100 0 50deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 10)" but got "color-mix(oklch, oklch(100 0 330), oklch(100 0 50))" +FAIL e.style['color'] = "color-mix(in oklch, oklch(100 0 20deg), oklch(100 0 320deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 350)" but got "color-mix(oklch, oklch(100 0 20), oklch(100 0 320))" +FAIL e.style['color'] = "color-mix(in oklch, oklch(100 0 320deg), oklch(100 0 20deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 350)" but got "color-mix(oklch, oklch(100 0 320), oklch(100 0 20))" +FAIL e.style['color'] = "color-mix(in oklch shorter hue, oklch(100 0 40deg), oklch(100 0 60deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 50)" but got "color-mix(oklch, oklch(100 0 40), oklch(100 0 60))" +FAIL e.style['color'] = "color-mix(in oklch shorter hue, oklch(100 0 60deg), oklch(100 0 40deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 50)" but got "color-mix(oklch, oklch(100 0 60), oklch(100 0 40))" +FAIL e.style['color'] = "color-mix(in oklch shorter hue, oklch(100 0 50deg), oklch(100 0 330deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 10)" but got "color-mix(oklch, oklch(100 0 50), oklch(100 0 330))" +FAIL e.style['color'] = "color-mix(in oklch shorter hue, oklch(100 0 330deg), oklch(100 0 50deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 10)" but got "color-mix(oklch, oklch(100 0 330), oklch(100 0 50))" +FAIL e.style['color'] = "color-mix(in oklch shorter hue, oklch(100 0 20deg), oklch(100 0 320deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 350)" but got "color-mix(oklch, oklch(100 0 20), oklch(100 0 320))" +FAIL e.style['color'] = "color-mix(in oklch shorter hue, oklch(100 0 320deg), oklch(100 0 20deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 350)" but got "color-mix(oklch, oklch(100 0 320), oklch(100 0 20))" +FAIL e.style['color'] = "color-mix(in oklch longer hue, oklch(100 0 40deg), oklch(100 0 60deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 230)" but got "color-mix(oklch longer hue, oklch(100 0 40), oklch(100 0 60))" +FAIL e.style['color'] = "color-mix(in oklch longer hue, oklch(100 0 60deg), oklch(100 0 40deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 230)" but got "color-mix(oklch longer hue, oklch(100 0 60), oklch(100 0 40))" +FAIL e.style['color'] = "color-mix(in oklch longer hue, oklch(100 0 50deg), oklch(100 0 330deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 190)" but got "color-mix(oklch longer hue, oklch(100 0 50), oklch(100 0 330))" +FAIL e.style['color'] = "color-mix(in oklch longer hue, oklch(100 0 330deg), oklch(100 0 50deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 190)" but got "color-mix(oklch longer hue, oklch(100 0 330), oklch(100 0 50))" +FAIL e.style['color'] = "color-mix(in oklch longer hue, oklch(100 0 20deg), oklch(100 0 320deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 170)" but got "color-mix(oklch longer hue, oklch(100 0 20), oklch(100 0 320))" +FAIL e.style['color'] = "color-mix(in oklch longer hue, oklch(100 0 320deg), oklch(100 0 20deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 170)" but got "color-mix(oklch longer hue, oklch(100 0 320), oklch(100 0 20))" +FAIL e.style['color'] = "color-mix(in oklch increasing hue, oklch(100 0 40deg), oklch(100 0 60deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 50)" but got "color-mix(oklch increasing hue, oklch(100 0 40), oklch(100 0 60))" +FAIL e.style['color'] = "color-mix(in oklch increasing hue, oklch(100 0 60deg), oklch(100 0 40deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 230)" but got "color-mix(oklch increasing hue, oklch(100 0 60), oklch(100 0 40))" +FAIL e.style['color'] = "color-mix(in oklch increasing hue, oklch(100 0 50deg), oklch(100 0 330deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 190)" but got "color-mix(oklch increasing hue, oklch(100 0 50), oklch(100 0 330))" +FAIL e.style['color'] = "color-mix(in oklch increasing hue, oklch(100 0 330deg), oklch(100 0 50deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 10)" but got "color-mix(oklch increasing hue, oklch(100 0 330), oklch(100 0 50))" +FAIL e.style['color'] = "color-mix(in oklch increasing hue, oklch(100 0 20deg), oklch(100 0 320deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 170)" but got "color-mix(oklch increasing hue, oklch(100 0 20), oklch(100 0 320))" +FAIL e.style['color'] = "color-mix(in oklch increasing hue, oklch(100 0 320deg), oklch(100 0 20deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 350)" but got "color-mix(oklch increasing hue, oklch(100 0 320), oklch(100 0 20))" +FAIL e.style['color'] = "color-mix(in oklch decreasing hue, oklch(100 0 40deg), oklch(100 0 60deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 230)" but got "color-mix(oklch decreasing hue, oklch(100 0 40), oklch(100 0 60))" +FAIL e.style['color'] = "color-mix(in oklch decreasing hue, oklch(100 0 60deg), oklch(100 0 40deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 50)" but got "color-mix(oklch decreasing hue, oklch(100 0 60), oklch(100 0 40))" +FAIL e.style['color'] = "color-mix(in oklch decreasing hue, oklch(100 0 50deg), oklch(100 0 330deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 10)" but got "color-mix(oklch decreasing hue, oklch(100 0 50), oklch(100 0 330))" +FAIL e.style['color'] = "color-mix(in oklch decreasing hue, oklch(100 0 330deg), oklch(100 0 50deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 190)" but got "color-mix(oklch decreasing hue, oklch(100 0 330), oklch(100 0 50))" +FAIL e.style['color'] = "color-mix(in oklch decreasing hue, oklch(100 0 20deg), oklch(100 0 320deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 350)" but got "color-mix(oklch decreasing hue, oklch(100 0 20), oklch(100 0 320))" +FAIL e.style['color'] = "color-mix(in oklch decreasing hue, oklch(100 0 320deg), oklch(100 0 20deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 170)" but got "color-mix(oklch decreasing hue, oklch(100 0 320), oklch(100 0 20))" +FAIL e.style['color'] = "color-mix(in oklch specified hue, oklch(100 0 40deg), oklch(100 0 60deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 50)" but got "color-mix(oklch specified hue, oklch(100 0 40), oklch(100 0 60))" +FAIL e.style['color'] = "color-mix(in oklch specified hue, oklch(100 0 60deg), oklch(100 0 40deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 50)" but got "color-mix(oklch specified hue, oklch(100 0 60), oklch(100 0 40))" +FAIL e.style['color'] = "color-mix(in oklch specified hue, oklch(100 0 50deg), oklch(100 0 330deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 190)" but got "color-mix(oklch specified hue, oklch(100 0 50), oklch(100 0 330))" +FAIL e.style['color'] = "color-mix(in oklch specified hue, oklch(100 0 330deg), oklch(100 0 50deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 190)" but got "color-mix(oklch specified hue, oklch(100 0 330), oklch(100 0 50))" +FAIL e.style['color'] = "color-mix(in oklch specified hue, oklch(100 0 20deg), oklch(100 0 320deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 170)" but got "color-mix(oklch specified hue, oklch(100 0 20), oklch(100 0 320))" +FAIL e.style['color'] = "color-mix(in oklch specified hue, oklch(100 0 320deg), oklch(100 0 20deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(100 0 170)" but got "color-mix(oklch specified hue, oklch(100 0 320), oklch(100 0 20))" +FAIL e.style['color'] = "color-mix(in oklch, oklch(none none none), oklch(none none none))" should set the property value assert_equals: serialization should be canonical expected "oklch(none none none)" but got "color-mix(oklch, oklch(none none none), oklch(none none none))" +FAIL e.style['color'] = "color-mix(in oklch, oklch(none none none), oklch(50 60 70deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(50 60 70)" but got "color-mix(oklch, oklch(none none none), oklch(50 60 70))" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg), oklch(none none none))" should set the property value assert_equals: serialization should be canonical expected "oklch(10 20 30)" but got "color-mix(oklch, oklch(10 20 30), oklch(none none none))" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 none), oklch(50 60 70deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(30 40 70)" but got "color-mix(oklch, oklch(10 20 none), oklch(50 60 70))" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg), oklch(50 60 none))" should set the property value assert_equals: serialization should be canonical expected "oklch(30 40 30)" but got "color-mix(oklch, oklch(10 20 30), oklch(50 60 none))" +FAIL e.style['color'] = "color-mix(in oklch, oklch(none 20 30deg), oklch(50 none 70deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(50 20 50)" but got "color-mix(oklch, oklch(none 20 30), oklch(50 none 70))" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / none), oklch(50 60 70deg))" should set the property value assert_equals: serialization should be canonical expected "oklch(30 40 50)" but got "color-mix(oklch, oklch(10 20 30 / none), oklch(50 60 70))" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / none), oklch(50 60 70deg / 0.5))" should set the property value assert_equals: serialization should be canonical expected "oklch(30 40 50 / 0.5)" but got "color-mix(oklch, oklch(10 20 30 / none), oklch(50 60 70 / 0.5))" +FAIL e.style['color'] = "color-mix(in oklch, oklch(10 20 30deg / none), oklch(50 60 70deg / none))" should set the property value assert_equals: serialization should be canonical expected "oklch(30 40 50 / none)" but got "color-mix(oklch, oklch(10 20 30 / none), oklch(50 60 70 / none))" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30), lab(50 60 70))" should set the property value assert_equals: serialization should be canonical expected "lab(30 40 50)" but got "color-mix(lab, lab(10 20 30), lab(50 60 70))" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70))" should set the property value assert_equals: serialization should be canonical expected "lab(40 50 60)" but got "color-mix(lab, lab(10 20 30) 25%, lab(50 60 70))" FAIL e.style['color'] = "color-mix(in lab, 25% lab(10 20 30), lab(50 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30), 25% lab(50 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30), lab(50 60 70) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30) 30%, lab(50 60 70) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30) 12.5%, lab(50 60 70) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30) 0%, lab(50 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / .4), lab(50 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / .4) 25%, lab(50 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30), lab(50 60 70) 25%)" should set the property value assert_equals: serialization should be canonical expected "lab(20 30 40)" but got "color-mix(lab, lab(10 20 30), lab(50 60 70) 25%)" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70) 75%)" should set the property value assert_equals: serialization should be canonical expected "lab(40 50 60)" but got "color-mix(lab, lab(10 20 30) 25%, lab(50 60 70) 75%)" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30) 30%, lab(50 60 70) 90%)" should set the property value assert_equals: serialization should be canonical expected "lab(40 50 60)" but got "color-mix(lab, lab(10 20 30) 30%, lab(50 60 70) 90%)" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30) 12.5%, lab(50 60 70) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "lab(40 50 60 / 0.5)" but got "color-mix(lab, lab(10 20 30) 12.5%, lab(50 60 70) 37.5%)" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30) 0%, lab(50 60 70))" should set the property value assert_equals: serialization should be canonical expected "lab(50 60 70)" but got "color-mix(lab, lab(10 20 30) 0%, lab(50 60 70))" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / .4), lab(50 60 70 / .8))" should set the property value assert_equals: serialization should be canonical expected "lab(36.666664 46.666664 56.666664 / 0.6)" but got "color-mix(lab, lab(10 20 30 / 0.4), lab(50 60 70 / 0.8))" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / .4) 25%, lab(50 60 70 / .8))" should set the property value assert_equals: serialization should be canonical expected "lab(44.285713 54.285717 64.28571 / 0.7)" but got "color-mix(lab, lab(10 20 30 / 0.4) 25%, lab(50 60 70 / 0.8))" FAIL e.style['color'] = "color-mix(in lab, 25% lab(10 20 30 / .4), lab(50 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / .4), 25% lab(50 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / .4), lab(50 60 70 / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / .4) 25%, lab(50 60 70 / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / .4) 30%, lab(50 60 70 / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / .4) 12.5%, lab(50 60 70 / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / .4) 0%, lab(50 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(none none none), lab(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(none none none), lab(50 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30), lab(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 none), lab(50 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30), lab(50 60 none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(none 20 30), lab(50 none 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / none), lab(50 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / none), lab(50 60 70 / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / none), lab(50 60 70 / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30), oklab(50 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30) 25%, oklab(50 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / .4), lab(50 60 70 / .8) 25%)" should set the property value assert_equals: serialization should be canonical expected "lab(26 36 46 / 0.5)" but got "color-mix(lab, lab(10 20 30 / 0.4), lab(50 60 70 / 0.8) 25%)" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / .4) 25%, lab(50 60 70 / .8) 75%)" should set the property value assert_equals: serialization should be canonical expected "lab(44.285713 54.285717 64.28571 / 0.7)" but got "color-mix(lab, lab(10 20 30 / 0.4) 25%, lab(50 60 70 / 0.8) 75%)" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / .4) 30%, lab(50 60 70 / .8) 90%)" should set the property value assert_equals: serialization should be canonical expected "lab(44.285713 54.285717 64.28571 / 0.7)" but got "color-mix(lab, lab(10 20 30 / 0.4) 30%, lab(50 60 70 / 0.8) 90%)" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / .4) 12.5%, lab(50 60 70 / .8) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "lab(44.285713 54.285717 64.28571 / 0.35)" but got "color-mix(lab, lab(10 20 30 / 0.4) 12.5%, lab(50 60 70 / 0.8) 37.5%)" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / .4) 0%, lab(50 60 70 / .8))" should set the property value assert_equals: serialization should be canonical expected "lab(50 60 70 / 0.8)" but got "color-mix(lab, lab(10 20 30 / 0.4) 0%, lab(50 60 70 / 0.8))" +FAIL e.style['color'] = "color-mix(in lab, lab(none none none), lab(none none none))" should set the property value assert_equals: serialization should be canonical expected "lab(none none none)" but got "color-mix(lab, lab(none none none), lab(none none none))" +FAIL e.style['color'] = "color-mix(in lab, lab(none none none), lab(50 60 70))" should set the property value assert_equals: serialization should be canonical expected "lab(50 60 70)" but got "color-mix(lab, lab(none none none), lab(50 60 70))" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30), lab(none none none))" should set the property value assert_equals: serialization should be canonical expected "lab(10 20 30)" but got "color-mix(lab, lab(10 20 30), lab(none none none))" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 none), lab(50 60 70))" should set the property value assert_equals: serialization should be canonical expected "lab(30 40 70)" but got "color-mix(lab, lab(10 20 none), lab(50 60 70))" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30), lab(50 60 none))" should set the property value assert_equals: serialization should be canonical expected "lab(30 40 30)" but got "color-mix(lab, lab(10 20 30), lab(50 60 none))" +FAIL e.style['color'] = "color-mix(in lab, lab(none 20 30), lab(50 none 70))" should set the property value assert_equals: serialization should be canonical expected "lab(50 20 50)" but got "color-mix(lab, lab(none 20 30), lab(50 none 70))" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / none), lab(50 60 70))" should set the property value assert_equals: serialization should be canonical expected "lab(30 40 50)" but got "color-mix(lab, lab(10 20 30 / none), lab(50 60 70))" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / none), lab(50 60 70 / 0.5))" should set the property value assert_equals: serialization should be canonical expected "lab(30 40 50 / 0.5)" but got "color-mix(lab, lab(10 20 30 / none), lab(50 60 70 / 0.5))" +FAIL e.style['color'] = "color-mix(in lab, lab(10 20 30 / none), lab(50 60 70 / none))" should set the property value assert_equals: serialization should be canonical expected "lab(30 40 50 / none)" but got "color-mix(lab, lab(10 20 30 / none), lab(50 60 70 / none))" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30), oklab(50 60 70))" should set the property value assert_equals: serialization should be canonical expected "oklab(30 40 50)" but got "color-mix(oklab, oklab(10 20 30), oklab(50 60 70))" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30) 25%, oklab(50 60 70))" should set the property value assert_equals: serialization should be canonical expected "oklab(40 50 60)" but got "color-mix(oklab, oklab(10 20 30) 25%, oklab(50 60 70))" FAIL e.style['color'] = "color-mix(in oklab, 25% oklab(10 20 30), oklab(50 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30), 25% oklab(50 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30), oklab(50 60 70) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30) 25%, oklab(50 60 70) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30) 30%, oklab(50 60 70) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30) 12.5%, oklab(50 60 70) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30) 0%, oklab(50 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / .4), oklab(50 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / .4) 25%, oklab(50 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30), oklab(50 60 70) 25%)" should set the property value assert_equals: serialization should be canonical expected "oklab(20 30 40)" but got "color-mix(oklab, oklab(10 20 30), oklab(50 60 70) 25%)" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30) 25%, oklab(50 60 70) 75%)" should set the property value assert_equals: serialization should be canonical expected "oklab(40 50 60)" but got "color-mix(oklab, oklab(10 20 30) 25%, oklab(50 60 70) 75%)" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30) 30%, oklab(50 60 70) 90%)" should set the property value assert_equals: serialization should be canonical expected "oklab(40 50 60)" but got "color-mix(oklab, oklab(10 20 30) 30%, oklab(50 60 70) 90%)" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30) 12.5%, oklab(50 60 70) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "oklab(40 50 60 / 0.5)" but got "color-mix(oklab, oklab(10 20 30) 12.5%, oklab(50 60 70) 37.5%)" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30) 0%, oklab(50 60 70))" should set the property value assert_equals: serialization should be canonical expected "oklab(50 60 70)" but got "color-mix(oklab, oklab(10 20 30) 0%, oklab(50 60 70))" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / .4), oklab(50 60 70 / .8))" should set the property value assert_equals: serialization should be canonical expected "oklab(36.666664 46.666664 56.666664 / 0.6)" but got "color-mix(oklab, oklab(10 20 30 / 0.4), oklab(50 60 70 / 0.8))" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / .4) 25%, oklab(50 60 70 / .8))" should set the property value assert_equals: serialization should be canonical expected "oklab(44.285713 54.285717 64.28571 / 0.7)" but got "color-mix(oklab, oklab(10 20 30 / 0.4) 25%, oklab(50 60 70 / 0.8))" FAIL e.style['color'] = "color-mix(in oklab, 25% oklab(10 20 30 / .4), oklab(50 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / .4), 25% oklab(50 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / .4), oklab(50 60 70 / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / .4) 25%, oklab(50 60 70 / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / .4) 30%, oklab(50 60 70 / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / .4) 12.5%, oklab(50 60 70 / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / .4) 0%, oklab(50 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(none none none), oklab(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(none none none), oklab(50 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30), oklab(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 none), oklab(50 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30), oklab(50 60 none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(none 20 30), oklab(50 none 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / none), oklab(50 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / none), oklab(50 60 70 / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / none), oklab(50 60 70 / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / .4), oklab(50 60 70 / .8) 25%)" should set the property value assert_equals: serialization should be canonical expected "oklab(26 36 46 / 0.5)" but got "color-mix(oklab, oklab(10 20 30 / 0.4), oklab(50 60 70 / 0.8) 25%)" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / .4) 25%, oklab(50 60 70 / .8) 75%)" should set the property value assert_equals: serialization should be canonical expected "oklab(44.285713 54.285717 64.28571 / 0.7)" but got "color-mix(oklab, oklab(10 20 30 / 0.4) 25%, oklab(50 60 70 / 0.8) 75%)" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / .4) 30%, oklab(50 60 70 / .8) 90%)" should set the property value assert_equals: serialization should be canonical expected "oklab(44.285713 54.285717 64.28571 / 0.7)" but got "color-mix(oklab, oklab(10 20 30 / 0.4) 30%, oklab(50 60 70 / 0.8) 90%)" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / .4) 12.5%, oklab(50 60 70 / .8) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "oklab(44.285713 54.285717 64.28571 / 0.35)" but got "color-mix(oklab, oklab(10 20 30 / 0.4) 12.5%, oklab(50 60 70 / 0.8) 37.5%)" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / .4) 0%, oklab(50 60 70 / .8))" should set the property value assert_equals: serialization should be canonical expected "oklab(50 60 70 / 0.8)" but got "color-mix(oklab, oklab(10 20 30 / 0.4) 0%, oklab(50 60 70 / 0.8))" +FAIL e.style['color'] = "color-mix(in oklab, oklab(none none none), oklab(none none none))" should set the property value assert_equals: serialization should be canonical expected "oklab(none none none)" but got "color-mix(oklab, oklab(none none none), oklab(none none none))" +FAIL e.style['color'] = "color-mix(in oklab, oklab(none none none), oklab(50 60 70))" should set the property value assert_equals: serialization should be canonical expected "oklab(50 60 70)" but got "color-mix(oklab, oklab(none none none), oklab(50 60 70))" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30), oklab(none none none))" should set the property value assert_equals: serialization should be canonical expected "oklab(10 20 30)" but got "color-mix(oklab, oklab(10 20 30), oklab(none none none))" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 none), oklab(50 60 70))" should set the property value assert_equals: serialization should be canonical expected "oklab(30 40 70)" but got "color-mix(oklab, oklab(10 20 none), oklab(50 60 70))" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30), oklab(50 60 none))" should set the property value assert_equals: serialization should be canonical expected "oklab(30 40 30)" but got "color-mix(oklab, oklab(10 20 30), oklab(50 60 none))" +FAIL e.style['color'] = "color-mix(in oklab, oklab(none 20 30), oklab(50 none 70))" should set the property value assert_equals: serialization should be canonical expected "oklab(50 20 50)" but got "color-mix(oklab, oklab(none 20 30), oklab(50 none 70))" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / none), oklab(50 60 70))" should set the property value assert_equals: serialization should be canonical expected "oklab(30 40 50)" but got "color-mix(oklab, oklab(10 20 30 / none), oklab(50 60 70))" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / none), oklab(50 60 70 / 0.5))" should set the property value assert_equals: serialization should be canonical expected "oklab(30 40 50 / 0.5)" but got "color-mix(oklab, oklab(10 20 30 / none), oklab(50 60 70 / 0.5))" +FAIL e.style['color'] = "color-mix(in oklab, oklab(10 20 30 / none), oklab(50 60 70 / none))" should set the property value assert_equals: serialization should be canonical expected "oklab(30 40 50 / none)" but got "color-mix(oklab, oklab(10 20 30 / none), oklab(50 60 70 / none))" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.3 0.4 0.5)" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3), color(srgb 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.4 0.5 0.6)" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3) 25%, color(srgb 0.5 0.6 0.7))" FAIL e.style['color'] = "color-mix(in srgb, 25% color(srgb .1 .2 .3), color(srgb .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7) 25%)" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.2 0.3 0.4)" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3), color(srgb 0.5 0.6 0.7) 25%)" FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3), 25% color(srgb .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) 30%, color(srgb .5 .6 .7) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) 12.5%, color(srgb .5 .6 .7) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) 0%, color(srgb .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .5), color(srgb .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7) 75%)" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.4 0.5 0.6)" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3) 25%, color(srgb 0.5 0.6 0.7) 75%)" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) 30%, color(srgb .5 .6 .7) 90%)" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.4 0.5 0.6)" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3) 30%, color(srgb 0.5 0.6 0.7) 90%)" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) 12.5%, color(srgb .5 .6 .7) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.4 0.5 0.6 / 0.5)" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3) 12.5%, color(srgb 0.5 0.6 0.7) 37.5%)" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) 0%, color(srgb .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.5 0.6 0.7)" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3) 0%, color(srgb 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .5), color(srgb .5 .6 .7 / .8))" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.3461539 0.4461539 0.5461539 / 0.65)" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3 / 0.5), color(srgb 0.5 0.6 0.7 / 0.8))" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8))" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.44285715 0.54285717 0.64285713 / 0.7)" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3 / 0.4) 25%, color(srgb 0.5 0.6 0.7 / 0.8))" FAIL e.style['color'] = "color-mix(in srgb, 25% color(srgb .1 .2 .3 / .4), color(srgb .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4), color(srgb .5 .6 .7 / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4), color(srgb .5 .6 .7 / .8) 25%)" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.26000002 0.36 0.46 / 0.5)" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3 / 0.4), color(srgb 0.5 0.6 0.7 / 0.8) 25%)" FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4), 25% color(srgb .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 30%, color(srgb .5 .6 .7 / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 12.5%, color(srgb .5 .6 .7 / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 0%, color(srgb .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb 2 3 4 / 5), color(srgb 4 6 8 / 10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb -2 -3 -4), color(srgb -4 -6 -8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb -2 -3 -4 / -5), color(srgb -4 -6 -8 / -10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb none none none), 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-mix(in srgb, color(srgb none none none), color(srgb .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3), 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-mix(in srgb, color(srgb .1 .2 none), color(srgb .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb none .2 .3), color(srgb .5 none .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7 / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7 / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 25%, color(srgb-linear .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8) 75%)" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.44285715 0.54285717 0.64285713 / 0.7)" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3 / 0.4) 25%, color(srgb 0.5 0.6 0.7 / 0.8) 75%)" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 30%, color(srgb .5 .6 .7 / .8) 90%)" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.44285715 0.54285717 0.64285713 / 0.7)" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3 / 0.4) 30%, color(srgb 0.5 0.6 0.7 / 0.8) 90%)" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 12.5%, color(srgb .5 .6 .7 / .8) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.44285715 0.54285717 0.64285713 / 0.35)" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3 / 0.4) 12.5%, color(srgb 0.5 0.6 0.7 / 0.8) 37.5%)" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 0%, color(srgb .5 .6 .7 / .8))" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.5 0.6 0.7 / 0.8)" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3 / 0.4) 0%, color(srgb 0.5 0.6 0.7 / 0.8))" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb 2 3 4 / 5), color(srgb 4 6 8 / 10))" should set the property value assert_equals: serialization should be canonical expected "color(srgb 3 4.5 6)" but got "color-mix(srgb, color(srgb 2 3 4), color(srgb 4 6 8))" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb -2 -3 -4), color(srgb -4 -6 -8))" should set the property value assert_equals: serialization should be canonical expected "color(srgb -3 -4.5 -6)" but got "color-mix(srgb, color(srgb -2 -3 -4), color(srgb -4 -6 -8))" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb -2 -3 -4 / -5), color(srgb -4 -6 -8 / -10))" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0 0 0 / 0)" but got "color-mix(srgb, color(srgb -2 -3 -4 / 0), color(srgb -4 -6 -8 / 0))" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb none none none), color(srgb none none none))" should set the property value assert_equals: serialization should be canonical expected "color(srgb none none none)" but got "color-mix(srgb, color(srgb none none none), color(srgb none none none))" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb none none none), color(srgb .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.5 0.6 0.7)" but got "color-mix(srgb, color(srgb none none none), color(srgb 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3), color(srgb none none none))" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.1 0.2 0.3)" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3), color(srgb none none none))" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 none), color(srgb .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.3 0.4 0.7)" but got "color-mix(srgb, color(srgb 0.1 0.2 none), color(srgb 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 none))" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.3 0.4 0.3)" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3), color(srgb 0.5 0.6 none))" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb none .2 .3), color(srgb .5 none .7))" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.5 0.2 0.5)" but got "color-mix(srgb, color(srgb none 0.2 0.3), color(srgb 0.5 none 0.7))" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.3 0.4 0.5)" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3 / none), color(srgb 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7 / 0.5))" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.3 0.4 0.5 / 0.5)" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3 / none), color(srgb 0.5 0.6 0.7 / 0.5))" +FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7 / none))" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0.3 0.4 0.5 / none)" but got "color-mix(srgb, color(srgb 0.1 0.2 0.3 / none), color(srgb 0.5 0.6 0.7 / none))" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.3 0.4 0.5)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3), color(srgb-linear 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 25%, color(srgb-linear .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.4 0.5 0.6)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3) 25%, color(srgb-linear 0.5 0.6 0.7))" FAIL e.style['color'] = "color-mix(in srgb-linear, 25% color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7) 25%)" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.2 0.3 0.4)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3), color(srgb-linear 0.5 0.6 0.7) 25%)" FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), 25% color(srgb-linear .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 25%, color(srgb-linear .5 .6 .7) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 30%, color(srgb-linear .5 .6 .7) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 12.5%, color(srgb-linear .5 .6 .7) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 0%, color(srgb-linear .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .5), color(srgb-linear .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 25%, color(srgb-linear .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 25%, color(srgb-linear .5 .6 .7) 75%)" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.4 0.5 0.6)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3) 25%, color(srgb-linear 0.5 0.6 0.7) 75%)" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 30%, color(srgb-linear .5 .6 .7) 90%)" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.4 0.5 0.6)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3) 30%, color(srgb-linear 0.5 0.6 0.7) 90%)" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 12.5%, color(srgb-linear .5 .6 .7) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.4 0.5 0.6 / 0.5)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3) 12.5%, color(srgb-linear 0.5 0.6 0.7) 37.5%)" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 0%, color(srgb-linear .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.5 0.6 0.7)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3) 0%, color(srgb-linear 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .5), color(srgb-linear .5 .6 .7 / .8))" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.3461539 0.4461539 0.5461539 / 0.65)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3 / 0.5), color(srgb-linear 0.5 0.6 0.7 / 0.8))" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 25%, color(srgb-linear .5 .6 .7 / .8))" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.44285715 0.54285717 0.64285713 / 0.7)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3 / 0.4) 25%, color(srgb-linear 0.5 0.6 0.7 / 0.8))" FAIL e.style['color'] = "color-mix(in srgb-linear, 25% color(srgb-linear .1 .2 .3 / .4), color(srgb-linear .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4), color(srgb-linear .5 .6 .7 / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4), color(srgb-linear .5 .6 .7 / .8) 25%)" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.26000002 0.36 0.46 / 0.5)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3 / 0.4), color(srgb-linear 0.5 0.6 0.7 / 0.8) 25%)" FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4), 25% color(srgb-linear .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 25%, color(srgb-linear .5 .6 .7 / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 30%, color(srgb-linear .5 .6 .7 / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 12.5%, color(srgb-linear .5 .6 .7 / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 0%, color(srgb-linear .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear 2 3 4 / 5), color(srgb-linear 4 6 8 / 10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear -2 -3 -4), color(srgb-linear -4 -6 -8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear -2 -3 -4 / -5), color(srgb-linear -4 -6 -8 / -10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear none none none), 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-mix(in srgb-linear, color(srgb-linear none none none), color(srgb-linear .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), 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-mix(in srgb-linear, color(srgb-linear .1 .2 none), color(srgb-linear .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear none .2 .3), color(srgb-linear .5 none .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7 / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7 / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) 25%, color(xyz .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 25%, color(srgb-linear .5 .6 .7 / .8) 75%)" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.44285715 0.54285717 0.64285713 / 0.7)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3 / 0.4) 25%, color(srgb-linear 0.5 0.6 0.7 / 0.8) 75%)" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 30%, color(srgb-linear .5 .6 .7 / .8) 90%)" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.44285715 0.54285717 0.64285713 / 0.7)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3 / 0.4) 30%, color(srgb-linear 0.5 0.6 0.7 / 0.8) 90%)" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 12.5%, color(srgb-linear .5 .6 .7 / .8) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.44285715 0.54285717 0.64285713 / 0.35)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3 / 0.4) 12.5%, color(srgb-linear 0.5 0.6 0.7 / 0.8) 37.5%)" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 0%, color(srgb-linear .5 .6 .7 / .8))" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.5 0.6 0.7 / 0.8)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3 / 0.4) 0%, color(srgb-linear 0.5 0.6 0.7 / 0.8))" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear 2 3 4 / 5), color(srgb-linear 4 6 8 / 10))" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 3 4.5 6)" but got "color-mix(srgb-linear, color(srgb-linear 2 3 4), color(srgb-linear 4 6 8))" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear -2 -3 -4), color(srgb-linear -4 -6 -8))" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear -3 -4.5 -6)" but got "color-mix(srgb-linear, color(srgb-linear -2 -3 -4), color(srgb-linear -4 -6 -8))" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear -2 -3 -4 / -5), color(srgb-linear -4 -6 -8 / -10))" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0 0 0 / 0)" but got "color-mix(srgb-linear, color(srgb-linear -2 -3 -4 / 0), color(srgb-linear -4 -6 -8 / 0))" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear none none none), color(srgb-linear none none none))" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear none none none)" but got "color-mix(srgb-linear, color(srgb-linear none none none), color(srgb-linear none none none))" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear none none none), color(srgb-linear .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.5 0.6 0.7)" but got "color-mix(srgb-linear, color(srgb-linear none none none), color(srgb-linear 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear none none none))" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.1 0.2 0.3)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3), color(srgb-linear none none none))" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 none), color(srgb-linear .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.3 0.4 0.7)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 none), color(srgb-linear 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 none))" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.3 0.4 0.3)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3), color(srgb-linear 0.5 0.6 none))" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear none .2 .3), color(srgb-linear .5 none .7))" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.5 0.2 0.5)" but got "color-mix(srgb-linear, color(srgb-linear none 0.2 0.3), color(srgb-linear 0.5 none 0.7))" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.3 0.4 0.5)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3 / none), color(srgb-linear 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7 / 0.5))" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.3 0.4 0.5 / 0.5)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3 / none), color(srgb-linear 0.5 0.6 0.7 / 0.5))" +FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7 / none))" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0.3 0.4 0.5 / none)" but got "color-mix(srgb-linear, color(srgb-linear 0.1 0.2 0.3 / none), color(srgb-linear 0.5 0.6 0.7 / none))" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.3 0.4 0.5)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3), color(xyz-d65 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) 25%, color(xyz .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.4 0.5 0.6)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3) 25%, color(xyz-d65 0.5 0.6 0.7))" FAIL e.style['color'] = "color-mix(in xyz, 25% color(xyz .1 .2 .3), color(xyz .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 .7) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 .7) 25%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.2 0.3 0.4)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3), color(xyz-d65 0.5 0.6 0.7) 25%)" FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3), 25% color(xyz .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) 25%, color(xyz .5 .6 .7) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) 30%, color(xyz .5 .6 .7) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) 12.5%, color(xyz .5 .6 .7) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) 0%, color(xyz .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .5), color(xyz .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 25%, color(xyz .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) 25%, color(xyz .5 .6 .7) 75%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.4 0.5 0.6)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3) 25%, color(xyz-d65 0.5 0.6 0.7) 75%)" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) 30%, color(xyz .5 .6 .7) 90%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.4 0.5 0.6)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3) 30%, color(xyz-d65 0.5 0.6 0.7) 90%)" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) 12.5%, color(xyz .5 .6 .7) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.4 0.5 0.6 / 0.5)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3) 12.5%, color(xyz-d65 0.5 0.6 0.7) 37.5%)" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) 0%, color(xyz .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.5 0.6 0.7)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3) 0%, color(xyz-d65 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .5), color(xyz .5 .6 .7 / .8))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.3461539 0.4461539 0.5461539 / 0.65)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / 0.5), color(xyz-d65 0.5 0.6 0.7 / 0.8))" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 25%, color(xyz .5 .6 .7 / .8))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.44285715 0.54285717 0.64285713 / 0.7)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / 0.4) 25%, color(xyz-d65 0.5 0.6 0.7 / 0.8))" FAIL e.style['color'] = "color-mix(in xyz, 25% color(xyz .1 .2 .3 / .4), color(xyz .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4), color(xyz .5 .6 .7 / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4), color(xyz .5 .6 .7 / .8) 25%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.26000002 0.36 0.46 / 0.5)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / 0.4), color(xyz-d65 0.5 0.6 0.7 / 0.8) 25%)" FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4), 25% color(xyz .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 25%, color(xyz .5 .6 .7 / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 30%, color(xyz .5 .6 .7 / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 12.5%, color(xyz .5 .6 .7 / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 0%, color(xyz .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz 2 3 4 / 5), color(xyz 4 6 8 / 10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz -2 -3 -4), color(xyz -4 -6 -8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz -2 -3 -4 / -5), color(xyz -4 -6 -8 / -10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz none none none), 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-mix(in xyz, color(xyz none none none), color(xyz .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3), 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-mix(in xyz, color(xyz .1 .2 none), color(xyz .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz none .2 .3), color(xyz .5 none .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7 / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7 / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 25%, color(xyz .5 .6 .7 / .8) 75%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.44285715 0.54285717 0.64285713 / 0.7)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / 0.4) 25%, color(xyz-d65 0.5 0.6 0.7 / 0.8) 75%)" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 30%, color(xyz .5 .6 .7 / .8) 90%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.44285715 0.54285717 0.64285713 / 0.7)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / 0.4) 30%, color(xyz-d65 0.5 0.6 0.7 / 0.8) 90%)" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 12.5%, color(xyz .5 .6 .7 / .8) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.44285715 0.54285717 0.64285713 / 0.35)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / 0.4) 12.5%, color(xyz-d65 0.5 0.6 0.7 / 0.8) 37.5%)" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 0%, color(xyz .5 .6 .7 / .8))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.5 0.6 0.7 / 0.8)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / 0.4) 0%, color(xyz-d65 0.5 0.6 0.7 / 0.8))" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz 2 3 4 / 5), color(xyz 4 6 8 / 10))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 3 4.5 6)" but got "color-mix(xyz-d65, color(xyz-d65 2 3 4), color(xyz-d65 4 6 8))" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz -2 -3 -4), color(xyz -4 -6 -8))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 -3 -4.5 -6)" but got "color-mix(xyz-d65, color(xyz-d65 -2 -3 -4), color(xyz-d65 -4 -6 -8))" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz -2 -3 -4 / -5), color(xyz -4 -6 -8 / -10))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0 0 0 / 0)" but got "color-mix(xyz-d65, color(xyz-d65 -2 -3 -4 / 0), color(xyz-d65 -4 -6 -8 / 0))" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz none none none), color(xyz none none none))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 none none none)" but got "color-mix(xyz-d65, color(xyz-d65 none none none), color(xyz-d65 none none none))" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz none none none), color(xyz .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.5 0.6 0.7)" but got "color-mix(xyz-d65, color(xyz-d65 none none none), color(xyz-d65 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3), color(xyz none none none))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.1 0.2 0.3)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3), color(xyz-d65 none none none))" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 none), color(xyz .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.3 0.4 0.7)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 none), color(xyz-d65 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 none))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.3 0.4 0.3)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3), color(xyz-d65 0.5 0.6 none))" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz none .2 .3), color(xyz .5 none .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.5 0.2 0.5)" but got "color-mix(xyz-d65, color(xyz-d65 none 0.2 0.3), color(xyz-d65 0.5 none 0.7))" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.3 0.4 0.5)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / none), color(xyz-d65 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7 / 0.5))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.3 0.4 0.5 / 0.5)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / none), color(xyz-d65 0.5 0.6 0.7 / 0.5))" +FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7 / none))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.3 0.4 0.5 / none)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / none), color(xyz-d65 0.5 0.6 0.7 / none))" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.3 0.4 0.5)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3), color(xyz-d50 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.4 0.5 0.6)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3) 25%, color(xyz-d50 0.5 0.6 0.7))" FAIL e.style['color'] = "color-mix(in xyz-d50, 25% color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7) 25%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.2 0.3 0.4)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3), color(xyz-d50 0.5 0.6 0.7) 25%)" FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), 25% color(xyz-d50 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 30%, color(xyz-d50 .5 .6 .7) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 12.5%, color(xyz-d50 .5 .6 .7) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 0%, color(xyz-d50 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .5), color(xyz-d50 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7) 75%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.4 0.5 0.6)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3) 25%, color(xyz-d50 0.5 0.6 0.7) 75%)" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 30%, color(xyz-d50 .5 .6 .7) 90%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.4 0.5 0.6)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3) 30%, color(xyz-d50 0.5 0.6 0.7) 90%)" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 12.5%, color(xyz-d50 .5 .6 .7) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.4 0.5 0.6 / 0.5)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3) 12.5%, color(xyz-d50 0.5 0.6 0.7) 37.5%)" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 0%, color(xyz-d50 .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.5 0.6 0.7)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3) 0%, color(xyz-d50 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .5), color(xyz-d50 .5 .6 .7 / .8))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.3461539 0.4461539 0.5461539 / 0.65)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3 / 0.5), color(xyz-d50 0.5 0.6 0.7 / 0.8))" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.44285715 0.54285717 0.64285713 / 0.7)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3 / 0.4) 25%, color(xyz-d50 0.5 0.6 0.7 / 0.8))" FAIL e.style['color'] = "color-mix(in xyz-d50, 25% color(xyz-d50 .1 .2 .3 / .4), color(xyz-d50 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4), color(xyz-d50 .5 .6 .7 / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4), color(xyz-d50 .5 .6 .7 / .8) 25%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.26000002 0.36 0.46 / 0.5)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3 / 0.4), color(xyz-d50 0.5 0.6 0.7 / 0.8) 25%)" FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4), 25% color(xyz-d50 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 30%, color(xyz-d50 .5 .6 .7 / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 12.5%, color(xyz-d50 .5 .6 .7 / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 0%, color(xyz-d50 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 2 3 4 / 5), color(xyz-d50 4 6 8 / 10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 -2 -3 -4), color(xyz-d50 -4 -6 -8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 -2 -3 -4 / -5), color(xyz-d50 -4 -6 -8 / -10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 none none none), 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-mix(in xyz-d50, color(xyz-d50 none none none), color(xyz-d50 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), 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-mix(in xyz-d50, color(xyz-d50 .1 .2 none), color(xyz-d50 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 none .2 .3), color(xyz-d50 .5 none .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7 / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7 / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 25%, color(xyz-d65 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8) 75%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.44285715 0.54285717 0.64285713 / 0.7)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3 / 0.4) 25%, color(xyz-d50 0.5 0.6 0.7 / 0.8) 75%)" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 30%, color(xyz-d50 .5 .6 .7 / .8) 90%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.44285715 0.54285717 0.64285713 / 0.7)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3 / 0.4) 30%, color(xyz-d50 0.5 0.6 0.7 / 0.8) 90%)" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 12.5%, color(xyz-d50 .5 .6 .7 / .8) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.44285715 0.54285717 0.64285713 / 0.35)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3 / 0.4) 12.5%, color(xyz-d50 0.5 0.6 0.7 / 0.8) 37.5%)" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 0%, color(xyz-d50 .5 .6 .7 / .8))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.5 0.6 0.7 / 0.8)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3 / 0.4) 0%, color(xyz-d50 0.5 0.6 0.7 / 0.8))" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 2 3 4 / 5), color(xyz-d50 4 6 8 / 10))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 3 4.5 6)" but got "color-mix(xyz-d50, color(xyz-d50 2 3 4), color(xyz-d50 4 6 8))" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 -2 -3 -4), color(xyz-d50 -4 -6 -8))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 -3 -4.5 -6)" but got "color-mix(xyz-d50, color(xyz-d50 -2 -3 -4), color(xyz-d50 -4 -6 -8))" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 -2 -3 -4 / -5), color(xyz-d50 -4 -6 -8 / -10))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0 0 0 / 0)" but got "color-mix(xyz-d50, color(xyz-d50 -2 -3 -4 / 0), color(xyz-d50 -4 -6 -8 / 0))" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 none none none), color(xyz-d50 none none none))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 none none none)" but got "color-mix(xyz-d50, color(xyz-d50 none none none), color(xyz-d50 none none none))" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 none none none), color(xyz-d50 .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.5 0.6 0.7)" but got "color-mix(xyz-d50, color(xyz-d50 none none none), color(xyz-d50 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 none none none))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.1 0.2 0.3)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3), color(xyz-d50 none none none))" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 none), color(xyz-d50 .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.3 0.4 0.7)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 none), color(xyz-d50 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 none))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.3 0.4 0.3)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3), color(xyz-d50 0.5 0.6 none))" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 none .2 .3), color(xyz-d50 .5 none .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.5 0.2 0.5)" but got "color-mix(xyz-d50, color(xyz-d50 none 0.2 0.3), color(xyz-d50 0.5 none 0.7))" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.3 0.4 0.5)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3 / none), color(xyz-d50 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7 / 0.5))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.3 0.4 0.5 / 0.5)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3 / none), color(xyz-d50 0.5 0.6 0.7 / 0.5))" +FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7 / none))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0.3 0.4 0.5 / none)" but got "color-mix(xyz-d50, color(xyz-d50 0.1 0.2 0.3 / none), color(xyz-d50 0.5 0.6 0.7 / none))" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.3 0.4 0.5)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3), color(xyz-d65 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 25%, color(xyz-d65 .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.4 0.5 0.6)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3) 25%, color(xyz-d65 0.5 0.6 0.7))" FAIL e.style['color'] = "color-mix(in xyz-d65, 25% color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7) 25%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.2 0.3 0.4)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3), color(xyz-d65 0.5 0.6 0.7) 25%)" FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), 25% color(xyz-d65 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 25%, color(xyz-d65 .5 .6 .7) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 30%, color(xyz-d65 .5 .6 .7) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 12.5%, color(xyz-d65 .5 .6 .7) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 0%, color(xyz-d65 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .5), color(xyz-d65 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 25%, color(xyz-d65 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 25%, color(xyz-d65 .5 .6 .7) 75%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.4 0.5 0.6)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3) 25%, color(xyz-d65 0.5 0.6 0.7) 75%)" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 30%, color(xyz-d65 .5 .6 .7) 90%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.4 0.5 0.6)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3) 30%, color(xyz-d65 0.5 0.6 0.7) 90%)" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 12.5%, color(xyz-d65 .5 .6 .7) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.4 0.5 0.6 / 0.5)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3) 12.5%, color(xyz-d65 0.5 0.6 0.7) 37.5%)" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 0%, color(xyz-d65 .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.5 0.6 0.7)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3) 0%, color(xyz-d65 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .5), color(xyz-d65 .5 .6 .7 / .8))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.3461539 0.4461539 0.5461539 / 0.65)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / 0.5), color(xyz-d65 0.5 0.6 0.7 / 0.8))" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 25%, color(xyz-d65 .5 .6 .7 / .8))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.44285715 0.54285717 0.64285713 / 0.7)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / 0.4) 25%, color(xyz-d65 0.5 0.6 0.7 / 0.8))" FAIL e.style['color'] = "color-mix(in xyz-d65, 25% color(xyz-d65 .1 .2 .3 / .4), color(xyz-d65 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4), color(xyz-d65 .5 .6 .7 / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4), color(xyz-d65 .5 .6 .7 / .8) 25%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.26000002 0.36 0.46 / 0.5)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / 0.4), color(xyz-d65 0.5 0.6 0.7 / 0.8) 25%)" FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4), 25% color(xyz-d65 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 25%, color(xyz-d65 .5 .6 .7 / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 30%, color(xyz-d65 .5 .6 .7 / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 12.5%, color(xyz-d65 .5 .6 .7 / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 0%, color(xyz-d65 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 2 3 4 / 5), color(xyz-d65 4 6 8 / 10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 -2 -3 -4), color(xyz-d65 -4 -6 -8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 -2 -3 -4 / -5), color(xyz-d65 -4 -6 -8 / -10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 none none none), 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-mix(in xyz-d65, color(xyz-d65 none none none), color(xyz-d65 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), 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-mix(in xyz-d65, color(xyz-d65 .1 .2 none), color(xyz-d65 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 none .2 .3), color(xyz-d65 .5 none .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7 / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7 / none))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 25%, color(xyz-d65 .5 .6 .7 / .8) 75%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.44285715 0.54285717 0.64285713 / 0.7)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / 0.4) 25%, color(xyz-d65 0.5 0.6 0.7 / 0.8) 75%)" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 30%, color(xyz-d65 .5 .6 .7 / .8) 90%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.44285715 0.54285717 0.64285713 / 0.7)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / 0.4) 30%, color(xyz-d65 0.5 0.6 0.7 / 0.8) 90%)" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 12.5%, color(xyz-d65 .5 .6 .7 / .8) 37.5%)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.44285715 0.54285717 0.64285713 / 0.35)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / 0.4) 12.5%, color(xyz-d65 0.5 0.6 0.7 / 0.8) 37.5%)" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 0%, color(xyz-d65 .5 .6 .7 / .8))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.5 0.6 0.7 / 0.8)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / 0.4) 0%, color(xyz-d65 0.5 0.6 0.7 / 0.8))" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 2 3 4 / 5), color(xyz-d65 4 6 8 / 10))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 3 4.5 6)" but got "color-mix(xyz-d65, color(xyz-d65 2 3 4), color(xyz-d65 4 6 8))" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 -2 -3 -4), color(xyz-d65 -4 -6 -8))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 -3 -4.5 -6)" but got "color-mix(xyz-d65, color(xyz-d65 -2 -3 -4), color(xyz-d65 -4 -6 -8))" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 -2 -3 -4 / -5), color(xyz-d65 -4 -6 -8 / -10))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0 0 0 / 0)" but got "color-mix(xyz-d65, color(xyz-d65 -2 -3 -4 / 0), color(xyz-d65 -4 -6 -8 / 0))" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 none none none), color(xyz-d65 none none none))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 none none none)" but got "color-mix(xyz-d65, color(xyz-d65 none none none), color(xyz-d65 none none none))" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 none none none), color(xyz-d65 .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.5 0.6 0.7)" but got "color-mix(xyz-d65, color(xyz-d65 none none none), color(xyz-d65 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 none none none))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.1 0.2 0.3)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3), color(xyz-d65 none none none))" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 none), color(xyz-d65 .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.3 0.4 0.7)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 none), color(xyz-d65 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 none))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.3 0.4 0.3)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3), color(xyz-d65 0.5 0.6 none))" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 none .2 .3), color(xyz-d65 .5 none .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.5 0.2 0.5)" but got "color-mix(xyz-d65, color(xyz-d65 none 0.2 0.3), color(xyz-d65 0.5 none 0.7))" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.3 0.4 0.5)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / none), color(xyz-d65 0.5 0.6 0.7))" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7 / 0.5))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.3 0.4 0.5 / 0.5)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / none), color(xyz-d65 0.5 0.6 0.7 / 0.5))" +FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7 / none))" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0.3 0.4 0.5 / none)" but got "color-mix(xyz-d65, color(xyz-d65 0.1 0.2 0.3 / none), color(xyz-d65 0.5 0.6 0.7 / none))" Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-computed-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-computed-expected.txt deleted file mode 100644 index be289ab..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-computed-expected.txt +++ /dev/null
@@ -1,965 +0,0 @@ -This is a testharness.js-based test. -Found 961 tests; 0 PASS, 961 FAIL, 0 TIMEOUT, 0 NOTRUN. -FAIL Property color value 'rgb(from rebeccapurple r g b)' assert_true: 'rgb(from rebeccapurple r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g b / alpha)' assert_true: 'rgb(from rebeccapurple r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from hsl(120deg 20% 50% / .5) r g b / alpha)' assert_true: 'rgb(from hsl(120deg 20% 50% / .5) r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(from rebeccapurple r g b) r g b)' assert_true: 'rgb(from rgb(from rebeccapurple r g b) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from color(display-p3 0 1 0) r g b / alpha)' assert_true: 'rgb(from color(display-p3 0 1 0) r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from lab(100 104.3 -50.9) r g b)' assert_true: 'rgb(from lab(100 104.3 -50.9) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from lab(0 104.3 -50.9) r g b)' assert_true: 'rgb(from lab(0 104.3 -50.9) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from lch(100 116 334) r g b)' assert_true: 'rgb(from lch(100 116 334) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from lch(0 116 334) r g b)' assert_true: 'rgb(from lch(0 116 334) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from oklab(100 0.365 -0.16) r g b)' assert_true: 'rgb(from oklab(100 0.365 -0.16) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from oklab(0 0.365 -0.16) r g b)' assert_true: 'rgb(from oklab(0 0.365 -0.16) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from oklch(100 0.399 336.3) r g b)' assert_true: 'rgb(from oklch(100 0.399 336.3) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from oklch(0 0.399 336.3) r g b)' assert_true: 'rgb(from oklch(0 0.399 336.3) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple 0 0 0)' assert_true: 'rgb(from rebeccapurple 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple 0 0 0 / 0)' assert_true: 'rgb(from rebeccapurple 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple 0 g b / alpha)' assert_true: 'rgb(from rebeccapurple 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r 0 b / alpha)' assert_true: 'rgb(from rebeccapurple r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g 0 / alpha)' assert_true: 'rgb(from rebeccapurple r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g b / 0)' assert_true: 'rgb(from rebeccapurple r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 0 g b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 0 b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g 0 / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / 0)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple 25 g b / alpha)' assert_true: 'rgb(from rebeccapurple 25 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r 25 b / alpha)' assert_true: 'rgb(from rebeccapurple r 25 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g 25 / alpha)' assert_true: 'rgb(from rebeccapurple r g 25 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g b / .25)' assert_true: 'rgb(from rebeccapurple r g b / .25)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / .20)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / .20)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple 20% g b / alpha)' assert_true: 'rgb(from rebeccapurple 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r 20% b / alpha)' assert_true: 'rgb(from rebeccapurple r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g 20% / alpha)' assert_true: 'rgb(from rebeccapurple r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g b / 20%)' assert_true: 'rgb(from rebeccapurple r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 20% g b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 20% b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g 20% / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / 20%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple 25 g b / 25%)' assert_true: 'rgb(from rebeccapurple 25 g b / 25%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r 25 b / 25%)' assert_true: 'rgb(from rebeccapurple r 25 b / 25%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g 25 / 25%)' assert_true: 'rgb(from rebeccapurple r g 25 / 25%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / 25%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / 25%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / 25%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / 25%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / 25%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / 25%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple g b r)' assert_true: 'rgb(from rebeccapurple g b r)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple b alpha r / g)' assert_true: 'rgb(from rebeccapurple b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r r r / r)' assert_true: 'rgb(from rebeccapurple r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple alpha alpha alpha / alpha)' assert_true: 'rgb(from rebeccapurple alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) g b r)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) g b r)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) b alpha r / g)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r r r / r)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) alpha alpha alpha / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r 20% 10)' assert_true: 'rgb(from rebeccapurple r 20% 10)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r 10 20%)' assert_true: 'rgb(from rebeccapurple r 10 20%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple 0% 10 10)' assert_true: 'rgb(from rebeccapurple 0% 10 10)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 20% 10)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 20% 10)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 10 20%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 10 20%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 0% 10 10)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 0% 10 10)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple calc(r) calc(g) calc(b))' assert_true: 'rgb(from rebeccapurple calc(r) calc(g) calc(b))' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r calc(g * 2) 10)' assert_true: 'rgb(from rebeccapurple r calc(g * 2) 10)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple b calc(r * .5) 10)' assert_true: 'rgb(from rebeccapurple b calc(r * .5) 10)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r calc(g * .5 + g * .5) 10)' assert_true: 'rgb(from rebeccapurple r calc(g * .5 + g * .5) 10)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r calc(b * .5 - g * .5) 10)' assert_true: 'rgb(from rebeccapurple r calc(b * .5 - g * .5) 10)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple none none none)' assert_true: 'rgb(from rebeccapurple none none none)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple none none none / none)' assert_true: 'rgb(from rebeccapurple none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g none)' assert_true: 'rgb(from rebeccapurple r g none)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g none / alpha)' assert_true: 'rgb(from rebeccapurple r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g b / none)' assert_true: 'rgb(from rebeccapurple r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20% 40% 60% / 80%) r g none / alpha)' assert_true: 'rgb(from rgb(20% 40% 60% / 80%) r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20% 40% 60% / 80%) r g b / none)' assert_true: 'rgb(from rgb(20% 40% 60% / 80%) r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(none none none) r g b)' assert_true: 'rgb(from rgb(none none none) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(none none none / none) r g b / alpha)' assert_true: 'rgb(from rgb(none none none / none) r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20% none 60%) r g b)' assert_true: 'rgb(from rgb(20% none 60%) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20% 40% 60% / none) r g b / alpha)' assert_true: 'rgb(from rgb(20% 40% 60% / none) r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h s l)' assert_true: 'hsl(from rebeccapurple h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h s l / alpha)' assert_true: 'hsl(from rebeccapurple h s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(120deg 20% 50% / .5) h s l / alpha)' assert_true: 'hsl(from hsl(120deg 20% 50% / .5) h s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(from rebeccapurple h s l) h s l)' assert_true: 'hsl(from hsl(from rebeccapurple h s l) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from color(display-p3 0 1 0) h s l / alpha)' assert_true: 'hsl(from color(display-p3 0 1 0) h s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from lab(100 104.3 -50.9) h s l)' assert_true: 'hsl(from lab(100 104.3 -50.9) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from lab(0 104.3 -50.9) h s l)' assert_true: 'hsl(from lab(0 104.3 -50.9) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from lch(100 116 334) h s l)' assert_true: 'hsl(from lch(100 116 334) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from lch(0 116 334) h s l)' assert_true: 'hsl(from lch(0 116 334) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from oklab(100 0.365 -0.16) h s l)' assert_true: 'hsl(from oklab(100 0.365 -0.16) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from oklab(0 0.365 -0.16) h s l)' assert_true: 'hsl(from oklab(0 0.365 -0.16) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from oklch(100 0.399 336.3) h s l)' assert_true: 'hsl(from oklch(100 0.399 336.3) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from oklch(0 0.399 336.3) h s l)' assert_true: 'hsl(from oklch(0 0.399 336.3) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple 0 0% 0%)' assert_true: 'hsl(from rebeccapurple 0 0% 0%)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple 0deg 0% 0%)' assert_true: 'hsl(from rebeccapurple 0deg 0% 0%)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple 0 0% 0% / 0)' assert_true: 'hsl(from rebeccapurple 0 0% 0% / 0)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple 0deg 0% 0% / 0)' assert_true: 'hsl(from rebeccapurple 0deg 0% 0% / 0)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple 0 s l / alpha)' assert_true: 'hsl(from rebeccapurple 0 s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple 0deg s l / alpha)' assert_true: 'hsl(from rebeccapurple 0deg s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h 0% l / alpha)' assert_true: 'hsl(from rebeccapurple h 0% l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h s 0% / alpha)' assert_true: 'hsl(from rebeccapurple h s 0% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h s l / 0)' assert_true: 'hsl(from rebeccapurple h s l / 0)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) 0 s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) 0 s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) 0deg s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) 0deg s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h 0% l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h 0% l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s 0% / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s 0% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / 0)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / 0)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple 25 s l / alpha)' assert_true: 'hsl(from rebeccapurple 25 s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple 25deg s l / alpha)' assert_true: 'hsl(from rebeccapurple 25deg s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h 20% l / alpha)' assert_true: 'hsl(from rebeccapurple h 20% l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h s 20% / alpha)' assert_true: 'hsl(from rebeccapurple h s 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h s l / .25)' assert_true: 'hsl(from rebeccapurple h s l / .25)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) 25 s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) 25 s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) 25deg s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) 25deg s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h 20% l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h 20% l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s 20% / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / .2)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / .2)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h l s)' assert_true: 'hsl(from rebeccapurple h l s)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h alpha l / s)' assert_true: 'hsl(from rebeccapurple h alpha l / s)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h l l / l)' assert_true: 'hsl(from rebeccapurple h l l / l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h alpha alpha / alpha)' assert_true: 'hsl(from rebeccapurple h alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h l s)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h l s)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h alpha l / s)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h alpha l / s)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h l l / l)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h l l / l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple calc(h) calc(s) calc(l))' assert_true: 'hsl(from rebeccapurple calc(h) calc(s) calc(l))' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) calc(h) calc(s) calc(l) / calc(alpha))' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) calc(h) calc(s) calc(l) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple none none none)' assert_true: 'hsl(from rebeccapurple none none none)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple none none none / none)' assert_true: 'hsl(from rebeccapurple none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h s none)' assert_true: 'hsl(from rebeccapurple h s none)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h s none / alpha)' assert_true: 'hsl(from rebeccapurple h s none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h s l / none)' assert_true: 'hsl(from rebeccapurple h s l / none)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple none s l / alpha)' assert_true: 'hsl(from rebeccapurple none s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(120deg 20% 50% / .5) h s none / alpha)' assert_true: 'hsl(from hsl(120deg 20% 50% / .5) h s none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(120deg 20% 50% / .5) h s l / none)' assert_true: 'hsl(from hsl(120deg 20% 50% / .5) h s l / none)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(120deg 20% 50% / .5) none s l / alpha)' assert_true: 'hsl(from hsl(120deg 20% 50% / .5) none s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(none none none) h s l)' assert_true: 'hsl(from hsl(none none none) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(none none none / none) h s l / alpha)' assert_true: 'hsl(from hsl(none none none / none) h s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(120deg none 50% / .5) h s l)' assert_true: 'hsl(from hsl(120deg none 50% / .5) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(120deg 20% 50% / none) h s l / alpha)' assert_true: 'hsl(from hsl(120deg 20% 50% / none) h s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(none 20% 50% / .5) h s l / alpha)' assert_true: 'hsl(from hsl(none 20% 50% / .5) h s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w b)' assert_true: 'hwb(from rebeccapurple h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w b / alpha)' assert_true: 'hwb(from rebeccapurple h w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hsl(120deg 20% 50% / .5) h w b / alpha)' assert_true: 'hwb(from hsl(120deg 20% 50% / .5) h w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hwb(from rebeccapurple h w b) h w b)' assert_true: 'hwb(from hwb(from rebeccapurple h w b) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from color(display-p3 0 1 0) h w b / alpha)' assert_true: 'hwb(from color(display-p3 0 1 0) h w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from lab(100 104.3 -50.9) h w b)' assert_true: 'hwb(from lab(100 104.3 -50.9) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from lab(0 104.3 -50.9) h w b)' assert_true: 'hwb(from lab(0 104.3 -50.9) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from lch(100 116 334) h w b)' assert_true: 'hwb(from lch(100 116 334) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from lch(0 116 334) h w b)' assert_true: 'hwb(from lch(0 116 334) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from oklab(100 0.365 -0.16) h w b)' assert_true: 'hwb(from oklab(100 0.365 -0.16) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from oklab(0 0.365 -0.16) h w b)' assert_true: 'hwb(from oklab(0 0.365 -0.16) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from oklch(100 0.399 336.3) h w b)' assert_true: 'hwb(from oklch(100 0.399 336.3) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from oklch(0 0.399 336.3) h w b)' assert_true: 'hwb(from oklch(0 0.399 336.3) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple 0 0% 0%)' assert_true: 'hwb(from rebeccapurple 0 0% 0%)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple 0deg 0% 0%)' assert_true: 'hwb(from rebeccapurple 0deg 0% 0%)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple 0 0% 0% / 0)' assert_true: 'hwb(from rebeccapurple 0 0% 0% / 0)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple 0deg 0% 0% / 0)' assert_true: 'hwb(from rebeccapurple 0deg 0% 0% / 0)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple 0 w b / alpha)' assert_true: 'hwb(from rebeccapurple 0 w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple 0deg w b / alpha)' assert_true: 'hwb(from rebeccapurple 0deg w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h 0% b / alpha)' assert_true: 'hwb(from rebeccapurple h 0% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w 0% / alpha)' assert_true: 'hwb(from rebeccapurple h w 0% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w b / 0)' assert_true: 'hwb(from rebeccapurple h w b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) 0 w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) 0 w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) 0deg w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) 0deg w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h 0% b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h 0% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w 0% / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w 0% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / 0)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple 25 w b / alpha)' assert_true: 'hwb(from rebeccapurple 25 w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple 25deg w b / alpha)' assert_true: 'hwb(from rebeccapurple 25deg w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h 20% b / alpha)' assert_true: 'hwb(from rebeccapurple h 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w 20% / alpha)' assert_true: 'hwb(from rebeccapurple h w 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w b / .2)' assert_true: 'hwb(from rebeccapurple h w b / .2)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) 25 w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) 25 w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) 25deg w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) 25deg w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h 20% b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w 20% / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / .2)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / .2)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h b w)' assert_true: 'hwb(from rebeccapurple h b w)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h alpha w / b)' assert_true: 'hwb(from rebeccapurple h alpha w / b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w w / w)' assert_true: 'hwb(from rebeccapurple h w w / w)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h alpha alpha / alpha)' assert_true: 'hwb(from rebeccapurple h alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h b w)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h b w)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h alpha w / b)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h alpha w / b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w w / w)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w w / w)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple calc(h) calc(w) calc(b))' assert_true: 'hwb(from rebeccapurple calc(h) calc(w) calc(b))' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) calc(h) calc(w) calc(b) / calc(alpha))' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) calc(h) calc(w) calc(b) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple none none none)' assert_true: 'hwb(from rebeccapurple none none none)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple none none none / none)' assert_true: 'hwb(from rebeccapurple none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w none)' assert_true: 'hwb(from rebeccapurple h w none)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w none / alpha)' assert_true: 'hwb(from rebeccapurple h w none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w b / none)' assert_true: 'hwb(from rebeccapurple h w b / none)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple none w b / alpha)' assert_true: 'hwb(from rebeccapurple none w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hwb(120deg 20% 50% / .5) h w none / alpha)' assert_true: 'hwb(from hwb(120deg 20% 50% / .5) h w none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hwb(120deg 20% 50% / .5) h w b / none)' assert_true: 'hwb(from hwb(120deg 20% 50% / .5) h w b / none)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hwb(120deg 20% 50% / .5) none w b / alpha)' assert_true: 'hwb(from hwb(120deg 20% 50% / .5) none w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hwb(none none none) h w b)' assert_true: 'hwb(from hwb(none none none) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hwb(none none none / none) h w b / alpha)' assert_true: 'hwb(from hwb(none none none / none) h w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hwb(120deg none 50% / .5) h w b)' assert_true: 'hwb(from hwb(120deg none 50% / .5) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hwb(120deg 20% 50% / none) h w b / alpha)' assert_true: 'hwb(from hwb(120deg 20% 50% / none) h w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hwb(none 20% 50% / .5) h w b / alpha)' assert_true: 'hwb(from hwb(none 20% 50% / .5) h w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) l a b)' assert_true: 'lab(from lab(25 20 50) l a b)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) l a b / alpha)' assert_true: 'lab(from lab(25 20 50) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50 / 40%) l a b / alpha)' assert_true: 'lab(from lab(25 20 50 / 40%) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(200 300 400 / 500%) l a b / alpha)' assert_true: 'lab(from lab(200 300 400 / 500%) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(-200 -300 -400 / -500%) l a b / alpha)' assert_true: 'lab(from lab(-200 -300 -400 / -500%) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(from lab(25 20 50) l a b) l a b)' assert_true: 'lab(from lab(from lab(25 20 50) l a b) l a b)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from color(display-p3 0 0 0) l a b / alpha)' assert_true: 'lab(from color(display-p3 0 0 0) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) 0 0 0)' assert_true: 'lab(from lab(25 20 50) 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) 0 0 0 / 0)' assert_true: 'lab(from lab(25 20 50) 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) 0 a b / alpha)' assert_true: 'lab(from lab(25 20 50) 0 a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) l 0 b / alpha)' assert_true: 'lab(from lab(25 20 50) l 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) l a 0 / alpha)' assert_true: 'lab(from lab(25 20 50) l a 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) l a b / 0)' assert_true: 'lab(from lab(25 20 50) l a b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50 / 40%) 0 a b / alpha)' assert_true: 'lab(from lab(25 20 50 / 40%) 0 a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50 / 40%) l 0 b / alpha)' assert_true: 'lab(from lab(25 20 50 / 40%) l 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50 / 40%) l a 0 / alpha)' assert_true: 'lab(from lab(25 20 50 / 40%) l a 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50 / 40%) l a b / 0)' assert_true: 'lab(from lab(25 20 50 / 40%) l a b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) 35 a b / alpha)' assert_true: 'lab(from lab(25 20 50) 35 a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) l 35 b / alpha)' assert_true: 'lab(from lab(25 20 50) l 35 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) l a 35 / alpha)' assert_true: 'lab(from lab(25 20 50) l a 35 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) l a b / .35)' assert_true: 'lab(from lab(25 20 50) l a b / .35)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50 / 40%) 35 a b / alpha)' assert_true: 'lab(from lab(25 20 50 / 40%) 35 a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50 / 40%) l 35 b / alpha)' assert_true: 'lab(from lab(25 20 50 / 40%) l 35 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50 / 40%) l a 35 / alpha)' assert_true: 'lab(from lab(25 20 50 / 40%) l a 35 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50 / 40%) l a b / .35)' assert_true: 'lab(from lab(25 20 50 / 40%) l a b / .35)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(0.7 45 30 / 40%) 200 300 400 / 500)' assert_true: 'lab(from lab(0.7 45 30 / 40%) 200 300 400 / 500)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(0.7 45 30 / 40%) -200 -300 -400 / -500)' assert_true: 'lab(from lab(0.7 45 30 / 40%) -200 -300 -400 / -500)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) l b a)' assert_true: 'lab(from lab(25 20 50) l b a)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) l a a / a)' assert_true: 'lab(from lab(25 20 50) l a a / a)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50 / 40%) l b a)' assert_true: 'lab(from lab(25 20 50 / 40%) l b a)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50 / 40%) l a a / a)' assert_true: 'lab(from lab(25 20 50 / 40%) l a a / a)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) calc(l) calc(a) calc(b))' assert_true: 'lab(from lab(25 20 50) calc(l) calc(a) calc(b))' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))' assert_true: 'lab(from lab(25 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) none none none)' assert_true: 'lab(from lab(25 20 50) none none none)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) none none none / none)' assert_true: 'lab(from lab(25 20 50) none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) l a none)' assert_true: 'lab(from lab(25 20 50) l a none)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) l a none / alpha)' assert_true: 'lab(from lab(25 20 50) l a none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50) l a b / none)' assert_true: 'lab(from lab(25 20 50) l a b / none)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50 / 40%) l a none / alpha)' assert_true: 'lab(from lab(25 20 50 / 40%) l a none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50 / 40%) l a b / none)' assert_true: 'lab(from lab(25 20 50 / 40%) l a b / none)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(none none none) l a b)' assert_true: 'lab(from lab(none none none) l a b)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(none none none / none) l a b / alpha)' assert_true: 'lab(from lab(none none none / none) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 none 50) l a b)' assert_true: 'lab(from lab(25 none 50) l a b)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25 20 50 / none) l a b / alpha)' assert_true: 'lab(from lab(25 20 50 / none) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) l a b)' assert_true: 'oklab(from oklab(25 20 50) l a b)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) l a b / alpha)' assert_true: 'oklab(from oklab(25 20 50) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50 / 40%) l a b / alpha)' assert_true: 'oklab(from oklab(25 20 50 / 40%) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(200 300 400 / 500%) l a b / alpha)' assert_true: 'oklab(from oklab(200 300 400 / 500%) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(-200 -300 -400 / -500%) l a b / alpha)' assert_true: 'oklab(from oklab(-200 -300 -400 / -500%) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(from oklab(25 20 50) l a b) l a b)' assert_true: 'oklab(from oklab(from oklab(25 20 50) l a b) l a b)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from color(display-p3 0 0 0) l a b / alpha)' assert_true: 'oklab(from color(display-p3 0 0 0) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) 0 0 0)' assert_true: 'oklab(from oklab(25 20 50) 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) 0 0 0 / 0)' assert_true: 'oklab(from oklab(25 20 50) 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) 0 a b / alpha)' assert_true: 'oklab(from oklab(25 20 50) 0 a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) l 0 b / alpha)' assert_true: 'oklab(from oklab(25 20 50) l 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) l a 0 / alpha)' assert_true: 'oklab(from oklab(25 20 50) l a 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) l a b / 0)' assert_true: 'oklab(from oklab(25 20 50) l a b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50 / 40%) 0 a b / alpha)' assert_true: 'oklab(from oklab(25 20 50 / 40%) 0 a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50 / 40%) l 0 b / alpha)' assert_true: 'oklab(from oklab(25 20 50 / 40%) l 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50 / 40%) l a 0 / alpha)' assert_true: 'oklab(from oklab(25 20 50 / 40%) l a 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50 / 40%) l a b / 0)' assert_true: 'oklab(from oklab(25 20 50 / 40%) l a b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) 35 a b / alpha)' assert_true: 'oklab(from oklab(25 20 50) 35 a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) l 35 b / alpha)' assert_true: 'oklab(from oklab(25 20 50) l 35 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) l a 35 / alpha)' assert_true: 'oklab(from oklab(25 20 50) l a 35 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) l a b / .35)' assert_true: 'oklab(from oklab(25 20 50) l a b / .35)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50 / 40%) 35 a b / alpha)' assert_true: 'oklab(from oklab(25 20 50 / 40%) 35 a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50 / 40%) l 35 b / alpha)' assert_true: 'oklab(from oklab(25 20 50 / 40%) l 35 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50 / 40%) l a 35 / alpha)' assert_true: 'oklab(from oklab(25 20 50 / 40%) l a 35 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50 / 40%) l a b / .35)' assert_true: 'oklab(from oklab(25 20 50 / 40%) l a b / .35)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(0.7 45 30 / 40%) 200 300 400 / 500)' assert_true: 'oklab(from oklab(0.7 45 30 / 40%) 200 300 400 / 500)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(0.7 45 30 / 40%) -200 -300 -400 / -500)' assert_true: 'oklab(from oklab(0.7 45 30 / 40%) -200 -300 -400 / -500)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) l b a)' assert_true: 'oklab(from oklab(25 20 50) l b a)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) l a a / a)' assert_true: 'oklab(from oklab(25 20 50) l a a / a)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50 / 40%) l b a)' assert_true: 'oklab(from oklab(25 20 50 / 40%) l b a)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50 / 40%) l a a / a)' assert_true: 'oklab(from oklab(25 20 50 / 40%) l a a / a)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) calc(l) calc(a) calc(b))' assert_true: 'oklab(from oklab(25 20 50) calc(l) calc(a) calc(b))' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))' assert_true: 'oklab(from oklab(25 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) none none none)' assert_true: 'oklab(from oklab(25 20 50) none none none)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) none none none / none)' assert_true: 'oklab(from oklab(25 20 50) none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) l a none)' assert_true: 'oklab(from oklab(25 20 50) l a none)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) l a none / alpha)' assert_true: 'oklab(from oklab(25 20 50) l a none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50) l a b / none)' assert_true: 'oklab(from oklab(25 20 50) l a b / none)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50 / 40%) l a none / alpha)' assert_true: 'oklab(from oklab(25 20 50 / 40%) l a none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50 / 40%) l a b / none)' assert_true: 'oklab(from oklab(25 20 50 / 40%) l a b / none)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(none none none) l a b)' assert_true: 'oklab(from oklab(none none none) l a b)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(none none none / none) l a b / alpha)' assert_true: 'oklab(from oklab(none none none / none) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 none 50) l a b)' assert_true: 'oklab(from oklab(25 none 50) l a b)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25 20 50 / none) l a b / alpha)' assert_true: 'oklab(from oklab(25 20 50 / none) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(.7 45 30) alpha b a / l)' assert_true: 'lab(from lab(.7 45 30) alpha b a / l)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(.7 45 30) alpha a b / alpha)' assert_true: 'lab(from lab(.7 45 30) alpha a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(.7 45 30) alpha a a / alpha)' assert_true: 'lab(from lab(.7 45 30) alpha a a / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(.7 45 30 / 40%) alpha b a / l)' assert_true: 'lab(from lab(.7 45 30 / 40%) alpha b a / l)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(.7 45 30 / 40%) alpha a b / alpha)' assert_true: 'lab(from lab(.7 45 30 / 40%) alpha a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(.7 45 30 / 40%) alpha a a / alpha)' assert_true: 'lab(from lab(.7 45 30 / 40%) alpha a a / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(.7 45 30) alpha b a / l)' assert_true: 'oklab(from oklab(.7 45 30) alpha b a / l)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(.7 45 30) alpha a b / alpha)' assert_true: 'oklab(from oklab(.7 45 30) alpha a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(.7 45 30) alpha a a / alpha)' assert_true: 'oklab(from oklab(.7 45 30) alpha a a / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(.7 45 30 / 40%) alpha b a / l)' assert_true: 'oklab(from oklab(.7 45 30 / 40%) alpha b a / l)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(.7 45 30 / 40%) alpha a b / alpha)' assert_true: 'oklab(from oklab(.7 45 30 / 40%) alpha a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(.7 45 30 / 40%) alpha a a / alpha)' assert_true: 'oklab(from oklab(.7 45 30 / 40%) alpha a a / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) l c h)' assert_true: 'lch(from lch(0.7 45 30) l c h)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) l c h / alpha)' assert_true: 'lch(from lch(0.7 45 30) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30 / 40%) l c h / alpha)' assert_true: 'lch(from lch(0.7 45 30 / 40%) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(200 300 400 / 500%) l c h / alpha)' assert_true: 'lch(from lch(200 300 400 / 500%) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(-200 -300 -400 / -500%) l c h / alpha)' assert_true: 'lch(from lch(-200 -300 -400 / -500%) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(from lch(0.7 45 30) l c h) l c h)' assert_true: 'lch(from lch(from lch(0.7 45 30) l c h) l c h)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from color(display-p3 0 0 0) l c h / alpha)' assert_true: 'lch(from color(display-p3 0 0 0) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lab(0.7 45 30) l c h / alpha)' assert_true: 'lch(from lab(0.7 45 30) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) 0 0 0)' assert_true: 'lch(from lch(0.7 45 30) 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) 0 0 0deg)' assert_true: 'lch(from lch(0.7 45 30) 0 0 0deg)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) 0 0 0 / 0)' assert_true: 'lch(from lch(0.7 45 30) 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) 0 0 0deg / 0)' assert_true: 'lch(from lch(0.7 45 30) 0 0 0deg / 0)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) 0 c h / alpha)' assert_true: 'lch(from lch(0.7 45 30) 0 c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) l 0 h / alpha)' assert_true: 'lch(from lch(0.7 45 30) l 0 h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) l c 0 / alpha)' assert_true: 'lch(from lch(0.7 45 30) l c 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) l c 0deg / alpha)' assert_true: 'lch(from lch(0.7 45 30) l c 0deg / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) l c h / 0)' assert_true: 'lch(from lch(0.7 45 30) l c h / 0)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30 / 40%) 0 c h / alpha)' assert_true: 'lch(from lch(0.7 45 30 / 40%) 0 c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30 / 40%) l 0 h / alpha)' assert_true: 'lch(from lch(0.7 45 30 / 40%) l 0 h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30 / 40%) l c 0 / alpha)' assert_true: 'lch(from lch(0.7 45 30 / 40%) l c 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30 / 40%) l c 0deg / alpha)' assert_true: 'lch(from lch(0.7 45 30 / 40%) l c 0deg / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30 / 40%) l c h / 0)' assert_true: 'lch(from lch(0.7 45 30 / 40%) l c h / 0)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) 25 c h / alpha)' assert_true: 'lch(from lch(0.7 45 30) 25 c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) l 25 h / alpha)' assert_true: 'lch(from lch(0.7 45 30) l 25 h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) l c 25 / alpha)' assert_true: 'lch(from lch(0.7 45 30) l c 25 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) l c 25deg / alpha)' assert_true: 'lch(from lch(0.7 45 30) l c 25deg / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) l c h / .25)' assert_true: 'lch(from lch(0.7 45 30) l c h / .25)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30 / 40%) 25 c h / alpha)' assert_true: 'lch(from lch(0.7 45 30 / 40%) 25 c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30 / 40%) l 25 h / alpha)' assert_true: 'lch(from lch(0.7 45 30 / 40%) l 25 h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30 / 40%) l c 25 / alpha)' assert_true: 'lch(from lch(0.7 45 30 / 40%) l c 25 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30 / 40%) l c 25deg / alpha)' assert_true: 'lch(from lch(0.7 45 30 / 40%) l c 25deg / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30 / 40%) l c h / .25)' assert_true: 'lch(from lch(0.7 45 30 / 40%) l c h / .25)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30 / 40%) 200 300 400 / 500)' assert_true: 'lch(from lch(0.7 45 30 / 40%) 200 300 400 / 500)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30 / 40%) -200 -300 -400 / -500)' assert_true: 'lch(from lch(0.7 45 30 / 40%) -200 -300 -400 / -500)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30 / 40%) 50 120 400deg / 500)' assert_true: 'lch(from lch(0.7 45 30 / 40%) 50 120 400deg / 500)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30 / 40%) 50 120 -400deg / -500)' assert_true: 'lch(from lch(0.7 45 30 / 40%) 50 120 -400deg / -500)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(.7 45 30) l c c / alpha)' assert_true: 'lch(from lch(.7 45 30) l c c / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(.7 45 30 / 40%) l c c / alpha)' assert_true: 'lch(from lch(.7 45 30 / 40%) l c c / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) calc(l) calc(c) calc(h))' assert_true: 'lch(from lch(0.7 45 30) calc(l) calc(c) calc(h))' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))' assert_true: 'lch(from lch(0.7 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) none none none)' assert_true: 'lch(from lch(0.7 45 30) none none none)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) none none none / none)' assert_true: 'lch(from lch(0.7 45 30) none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) l c none)' assert_true: 'lch(from lch(0.7 45 30) l c none)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) l c none / alpha)' assert_true: 'lch(from lch(0.7 45 30) l c none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30) l c h / none)' assert_true: 'lch(from lch(0.7 45 30) l c h / none)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30 / 40%) l c none / alpha)' assert_true: 'lch(from lch(0.7 45 30 / 40%) l c none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30 / 40%) l c h / none)' assert_true: 'lch(from lch(0.7 45 30 / 40%) l c h / none)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(none none none) l c h)' assert_true: 'lch(from lch(none none none) l c h)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(none none none / none) l c h / alpha)' assert_true: 'lch(from lch(none none none / none) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 none 30) l c h)' assert_true: 'lch(from lch(0.7 none 30) l c h)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(0.7 45 30 / none) l c h / alpha)' assert_true: 'lch(from lch(0.7 45 30 / none) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) l c h)' assert_true: 'oklch(from oklch(0.7 45 30) l c h)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) l c h / alpha)' assert_true: 'oklch(from oklch(0.7 45 30) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30 / 40%) l c h / alpha)' assert_true: 'oklch(from oklch(0.7 45 30 / 40%) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(200 300 400 / 500%) l c h / alpha)' assert_true: 'oklch(from oklch(200 300 400 / 500%) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(-200 -300 -400 / -500%) l c h / alpha)' assert_true: 'oklch(from oklch(-200 -300 -400 / -500%) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(from oklch(0.7 45 30) l c h) l c h)' assert_true: 'oklch(from oklch(from oklch(0.7 45 30) l c h) l c h)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from color(display-p3 0 0 0) l c h / alpha)' assert_true: 'oklch(from color(display-p3 0 0 0) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklab(0.7 45 30) l c h / alpha)' assert_true: 'oklch(from oklab(0.7 45 30) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) 0 0 0)' assert_true: 'oklch(from oklch(0.7 45 30) 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) 0 0 0deg)' assert_true: 'oklch(from oklch(0.7 45 30) 0 0 0deg)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) 0 0 0 / 0)' assert_true: 'oklch(from oklch(0.7 45 30) 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) 0 0 0deg / 0)' assert_true: 'oklch(from oklch(0.7 45 30) 0 0 0deg / 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) 0 c h / alpha)' assert_true: 'oklch(from oklch(0.7 45 30) 0 c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) l 0 h / alpha)' assert_true: 'oklch(from oklch(0.7 45 30) l 0 h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) l c 0 / alpha)' assert_true: 'oklch(from oklch(0.7 45 30) l c 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) l c 0deg / alpha)' assert_true: 'oklch(from oklch(0.7 45 30) l c 0deg / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) l c h / 0)' assert_true: 'oklch(from oklch(0.7 45 30) l c h / 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30 / 40%) 0 c h / alpha)' assert_true: 'oklch(from oklch(0.7 45 30 / 40%) 0 c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30 / 40%) l 0 h / alpha)' assert_true: 'oklch(from oklch(0.7 45 30 / 40%) l 0 h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30 / 40%) l c 0 / alpha)' assert_true: 'oklch(from oklch(0.7 45 30 / 40%) l c 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30 / 40%) l c 0deg / alpha)' assert_true: 'oklch(from oklch(0.7 45 30 / 40%) l c 0deg / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30 / 40%) l c h / 0)' assert_true: 'oklch(from oklch(0.7 45 30 / 40%) l c h / 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) 25 c h / alpha)' assert_true: 'oklch(from oklch(0.7 45 30) 25 c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) l 25 h / alpha)' assert_true: 'oklch(from oklch(0.7 45 30) l 25 h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) l c 25 / alpha)' assert_true: 'oklch(from oklch(0.7 45 30) l c 25 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) l c 25deg / alpha)' assert_true: 'oklch(from oklch(0.7 45 30) l c 25deg / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) l c h / .25)' assert_true: 'oklch(from oklch(0.7 45 30) l c h / .25)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30 / 40%) 25 c h / alpha)' assert_true: 'oklch(from oklch(0.7 45 30 / 40%) 25 c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30 / 40%) l 25 h / alpha)' assert_true: 'oklch(from oklch(0.7 45 30 / 40%) l 25 h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30 / 40%) l c 25 / alpha)' assert_true: 'oklch(from oklch(0.7 45 30 / 40%) l c 25 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30 / 40%) l c 25deg / alpha)' assert_true: 'oklch(from oklch(0.7 45 30 / 40%) l c 25deg / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30 / 40%) l c h / .25)' assert_true: 'oklch(from oklch(0.7 45 30 / 40%) l c h / .25)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30 / 40%) 200 300 400 / 500)' assert_true: 'oklch(from oklch(0.7 45 30 / 40%) 200 300 400 / 500)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30 / 40%) -200 -300 -400 / -500)' assert_true: 'oklch(from oklch(0.7 45 30 / 40%) -200 -300 -400 / -500)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30 / 40%) 50 120 400deg / 500)' assert_true: 'oklch(from oklch(0.7 45 30 / 40%) 50 120 400deg / 500)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30 / 40%) 50 120 -400deg / -500)' assert_true: 'oklch(from oklch(0.7 45 30 / 40%) 50 120 -400deg / -500)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(.7 45 30) l c c / alpha)' assert_true: 'oklch(from oklch(.7 45 30) l c c / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(.7 45 30 / 40%) l c c / alpha)' assert_true: 'oklch(from oklch(.7 45 30 / 40%) l c c / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) calc(l) calc(c) calc(h))' assert_true: 'oklch(from oklch(0.7 45 30) calc(l) calc(c) calc(h))' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))' assert_true: 'oklch(from oklch(0.7 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) none none none)' assert_true: 'oklch(from oklch(0.7 45 30) none none none)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) none none none / none)' assert_true: 'oklch(from oklch(0.7 45 30) none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) l c none)' assert_true: 'oklch(from oklch(0.7 45 30) l c none)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) l c none / alpha)' assert_true: 'oklch(from oklch(0.7 45 30) l c none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30) l c h / none)' assert_true: 'oklch(from oklch(0.7 45 30) l c h / none)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30 / 40%) l c none / alpha)' assert_true: 'oklch(from oklch(0.7 45 30 / 40%) l c none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30 / 40%) l c h / none)' assert_true: 'oklch(from oklch(0.7 45 30 / 40%) l c h / none)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(none none none) l c h)' assert_true: 'oklch(from oklch(none none none) l c h)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(none none none / none) l c h / alpha)' assert_true: 'oklch(from oklch(none none none / none) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 none 30) l c h)' assert_true: 'oklch(from oklch(0.7 none 30) l c h)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(0.7 45 30 / none) l c h / alpha)' assert_true: 'oklch(from oklch(0.7 45 30 / none) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(.7 45 30) alpha c h / l)' assert_true: 'lch(from lch(.7 45 30) alpha c h / l)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(.7 45 30) alpha c h / alpha)' assert_true: 'lch(from lch(.7 45 30) alpha c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(.7 45 30) alpha c c / alpha)' assert_true: 'lch(from lch(.7 45 30) alpha c c / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(.7 45 30 / 40%) alpha c h / l)' assert_true: 'lch(from lch(.7 45 30 / 40%) alpha c h / l)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(.7 45 30 / 40%) alpha c h / alpha)' assert_true: 'lch(from lch(.7 45 30 / 40%) alpha c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(.7 45 30 / 40%) alpha c c / alpha)' assert_true: 'lch(from lch(.7 45 30 / 40%) alpha c c / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(.7 45 30) alpha c h / l)' assert_true: 'oklch(from oklch(.7 45 30) alpha c h / l)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(.7 45 30) alpha c h / alpha)' assert_true: 'oklch(from oklch(.7 45 30) alpha c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(.7 45 30) alpha c c / alpha)' assert_true: 'oklch(from oklch(.7 45 30) alpha c c / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(.7 45 30 / 40%) alpha c h / l)' assert_true: 'oklch(from oklch(.7 45 30 / 40%) alpha c h / l)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(.7 45 30 / 40%) alpha c h / alpha)' assert_true: 'oklch(from oklch(.7 45 30 / 40%) alpha c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(.7 45 30 / 40%) alpha c c / alpha)' assert_true: 'oklch(from oklch(.7 45 30 / 40%) alpha c c / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(from color(srgb 0.7 0.5 0.3) srgb r g b) srgb r g b)' assert_true: 'color(from color(from color(srgb 0.7 0.5 0.3) srgb r g b) srgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0 / 0)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 0 g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r 0 b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g 0 / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0 g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0 b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0 / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 0.2 g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 20% g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r 0.2 b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r 20% b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g 0.2 / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g 20% / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0.2)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 20%)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0.2 g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 20% g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0.2 b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 20% b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0.2 / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 20% / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0.2)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 20%)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 2 3 4)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 2 3 4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 2 3 4 / 5)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 2 3 4 / 5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb -2 -3 -4)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb -2 -3 -4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb -2 -3 -4 / -5)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb -2 -3 -4 / -5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 200% 300% 400%)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 200% 300% 400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 200% 300% 400% / 500%)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 200% 300% 400% / 500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb -200% -300% -400%)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb -200% -300% -400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb -200% -300% -400% / -500%)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb -200% -300% -400% / -500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb g b r)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb b alpha r / g)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r r r / r)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb alpha alpha alpha / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb g b r)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb b alpha r / g)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r r r / r)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb alpha alpha alpha / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 1.7 1.5 1.3) srgb r g b)' assert_true: 'color(from color(srgb 1.7 1.5 1.3) srgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 1.7 1.5 1.3) srgb r g b / alpha)' assert_true: 'color(from color(srgb 1.7 1.5 1.3) srgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 1.7 1.5 1.3 / 140%) srgb r g b)' assert_true: 'color(from color(srgb 1.7 1.5 1.3 / 140%) srgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 1.7 1.5 1.3 / 140%) srgb r g b / alpha)' assert_true: 'color(from color(srgb 1.7 1.5 1.3 / 140%) srgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb -0.7 -0.5 -0.3) srgb r g b)' assert_true: 'color(from color(srgb -0.7 -0.5 -0.3) srgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb -0.7 -0.5 -0.3) srgb r g b / alpha)' assert_true: 'color(from color(srgb -0.7 -0.5 -0.3) srgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb -0.7 -0.5 -0.3 / -40%) srgb r g b)' assert_true: 'color(from color(srgb -0.7 -0.5 -0.3 / -40%) srgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb -0.7 -0.5 -0.3 / -40%) srgb r g b / alpha)' assert_true: 'color(from color(srgb -0.7 -0.5 -0.3 / -40%) srgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb calc(r) calc(g) calc(b))' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb calc(r) calc(g) calc(b))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb none none none)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb none none none / none)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g none)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g none / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / none)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g none / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / none)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb none none none) srgb r g b)' assert_true: 'color(from color(srgb none none none) srgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb none none none / none) srgb r g b / alpha)' assert_true: 'color(from color(srgb none none none / none) srgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 none 0.3) srgb r g b)' assert_true: 'color(from color(srgb 0.7 none 0.3) srgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / none) srgb r g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / none) srgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b) srgb-linear r g b)' assert_true: 'color(from color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b) srgb-linear r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0 / 0)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0 b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0 / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0 g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0 b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0 / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0.2 g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 20% g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0.2 b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 20% b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0.2 / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 20% / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0.2)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 20%)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0.2 g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 20% g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0.2 b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 20% b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0.2 / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 20% / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0.2)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 20%)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 2 3 4)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 2 3 4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 2 3 4 / 5)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 2 3 4 / 5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -2 -3 -4)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -2 -3 -4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -2 -3 -4 / -5)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -2 -3 -4 / -5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 200% 300% 400%)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 200% 300% 400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 200% 300% 400% / 500%)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 200% 300% 400% / 500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -200% -300% -400%)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -200% -300% -400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -200% -300% -400% / -500%)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -200% -300% -400% / -500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear g b r)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear b alpha r / g)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r r r / r)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear alpha alpha alpha / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear g b r)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear b alpha r / g)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r r r / r)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear alpha alpha alpha / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 1.7 1.5 1.3) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear 1.7 1.5 1.3) srgb-linear r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 1.7 1.5 1.3) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear 1.7 1.5 1.3) srgb-linear r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 1.7 1.5 1.3 / 140%) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear 1.7 1.5 1.3 / 140%) srgb-linear r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 1.7 1.5 1.3 / 140%) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear 1.7 1.5 1.3 / 140%) srgb-linear r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear -0.7 -0.5 -0.3) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear -0.7 -0.5 -0.3) srgb-linear r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear -0.7 -0.5 -0.3) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear -0.7 -0.5 -0.3) srgb-linear r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear -0.7 -0.5 -0.3 / -40%) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear -0.7 -0.5 -0.3 / -40%) srgb-linear r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear -0.7 -0.5 -0.3 / -40%) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear -0.7 -0.5 -0.3 / -40%) srgb-linear r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear calc(r) calc(g) calc(b))' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear calc(r) calc(g) calc(b))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear none none none)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear none none none / none)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g none)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g none / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / none)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g none / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / none)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear none none none) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear none none none) srgb-linear r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear none none none / none) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear none none none / none) srgb-linear r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 none 0.3) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear 0.7 none 0.3) srgb-linear r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / none) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / none) srgb-linear r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b) a98-rgb r g b)' assert_true: 'color(from color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b) a98-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0 / 0)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0 b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0 / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0 g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0 b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0 / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0.2 g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 20% g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0.2 b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 20% b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0.2 / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 20% / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0.2)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 20%)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0.2 g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 20% g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0.2 b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 20% b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0.2 / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 20% / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0.2)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 20%)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 2 3 4)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 2 3 4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 2 3 4 / 5)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 2 3 4 / 5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -2 -3 -4)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -2 -3 -4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -2 -3 -4 / -5)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -2 -3 -4 / -5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 200% 300% 400%)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 200% 300% 400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 200% 300% 400% / 500%)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 200% 300% 400% / 500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -200% -300% -400%)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -200% -300% -400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -200% -300% -400% / -500%)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -200% -300% -400% / -500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb g b r)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb b alpha r / g)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r r r / r)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb alpha alpha alpha / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb g b r)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb b alpha r / g)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r r r / r)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb alpha alpha alpha / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 1.7 1.5 1.3) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb 1.7 1.5 1.3) a98-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 1.7 1.5 1.3) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb 1.7 1.5 1.3) a98-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 1.7 1.5 1.3 / 140%) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb 1.7 1.5 1.3 / 140%) a98-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 1.7 1.5 1.3 / 140%) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb 1.7 1.5 1.3 / 140%) a98-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb -0.7 -0.5 -0.3) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb -0.7 -0.5 -0.3) a98-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb -0.7 -0.5 -0.3) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb -0.7 -0.5 -0.3) a98-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb -0.7 -0.5 -0.3 / -40%) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb -0.7 -0.5 -0.3 / -40%) a98-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb -0.7 -0.5 -0.3 / -40%) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb -0.7 -0.5 -0.3 / -40%) a98-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb calc(r) calc(g) calc(b))' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb calc(r) calc(g) calc(b))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb none none none)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb none none none / none)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g none)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g none / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / none)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g none / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / none)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb none none none) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb none none none) a98-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb none none none / none) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb none none none / none) a98-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 none 0.3) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb 0.7 none 0.3) a98-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / none) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / none) a98-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b) rec2020 r g b)' assert_true: 'color(from color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b) rec2020 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0 / 0)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0 b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0 / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0 g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0 b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0 / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0.2 g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 20% g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0.2 b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 20% b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0.2 / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 20% / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0.2)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 20%)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0.2 g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 20% g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0.2 b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 20% b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0.2 / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 20% / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0.2)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 20%)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 2 3 4)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 2 3 4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 2 3 4 / 5)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 2 3 4 / 5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 -2 -3 -4)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 -2 -3 -4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 -2 -3 -4 / -5)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 -2 -3 -4 / -5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 200% 300% 400%)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 200% 300% 400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 200% 300% 400% / 500%)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 200% 300% 400% / 500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 -200% -300% -400%)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 -200% -300% -400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 -200% -300% -400% / -500%)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 -200% -300% -400% / -500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 g b r)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 b alpha r / g)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r r r / r)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 alpha alpha alpha / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 g b r)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 b alpha r / g)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r r r / r)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 alpha alpha alpha / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 1.7 1.5 1.3) rec2020 r g b)' assert_true: 'color(from color(rec2020 1.7 1.5 1.3) rec2020 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 1.7 1.5 1.3) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 1.7 1.5 1.3) rec2020 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 1.7 1.5 1.3 / 140%) rec2020 r g b)' assert_true: 'color(from color(rec2020 1.7 1.5 1.3 / 140%) rec2020 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 1.7 1.5 1.3 / 140%) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 1.7 1.5 1.3 / 140%) rec2020 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 -0.7 -0.5 -0.3) rec2020 r g b)' assert_true: 'color(from color(rec2020 -0.7 -0.5 -0.3) rec2020 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 -0.7 -0.5 -0.3) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 -0.7 -0.5 -0.3) rec2020 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 -0.7 -0.5 -0.3 / -40%) rec2020 r g b)' assert_true: 'color(from color(rec2020 -0.7 -0.5 -0.3 / -40%) rec2020 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 -0.7 -0.5 -0.3 / -40%) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 -0.7 -0.5 -0.3 / -40%) rec2020 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 calc(r) calc(g) calc(b))' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 calc(r) calc(g) calc(b))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 none none none)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 none none none / none)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g none)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g none / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / none)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g none / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / none)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 none none none) rec2020 r g b)' assert_true: 'color(from color(rec2020 none none none) rec2020 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 none none none / none) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 none none none / none) rec2020 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 none 0.3) rec2020 r g b)' assert_true: 'color(from color(rec2020 0.7 none 0.3) rec2020 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / none) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / none) rec2020 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b) prophoto-rgb r g b)' assert_true: 'color(from color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b) prophoto-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0 / 0)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0 b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0 / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0 g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0 b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0 / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0.2 g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 20% g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0.2 b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 20% b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0.2 / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 20% / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0.2)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 20%)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0.2 g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 20% g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0.2 b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 20% b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0.2 / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 20% / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0.2)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 20%)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 2 3 4)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 2 3 4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 2 3 4 / 5)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 2 3 4 / 5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -2 -3 -4)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -2 -3 -4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -2 -3 -4 / -5)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -2 -3 -4 / -5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 200% 300% 400%)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 200% 300% 400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 200% 300% 400% / 500%)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 200% 300% 400% / 500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -200% -300% -400%)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -200% -300% -400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -200% -300% -400% / -500%)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -200% -300% -400% / -500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb g b r)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb b alpha r / g)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r r r / r)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb alpha alpha alpha / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb g b r)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb b alpha r / g)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r r r / r)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb alpha alpha alpha / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 1.7 1.5 1.3) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb 1.7 1.5 1.3) prophoto-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 1.7 1.5 1.3) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb 1.7 1.5 1.3) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 1.7 1.5 1.3 / 140%) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb 1.7 1.5 1.3 / 140%) prophoto-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 1.7 1.5 1.3 / 140%) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb 1.7 1.5 1.3 / 140%) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb -0.7 -0.5 -0.3) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb -0.7 -0.5 -0.3) prophoto-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb -0.7 -0.5 -0.3) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb -0.7 -0.5 -0.3) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb -0.7 -0.5 -0.3 / -40%) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb -0.7 -0.5 -0.3 / -40%) prophoto-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb -0.7 -0.5 -0.3 / -40%) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb -0.7 -0.5 -0.3 / -40%) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb calc(r) calc(g) calc(b))' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb calc(r) calc(g) calc(b))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb none none none)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb none none none / none)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g none)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g none / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / none)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g none / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / none)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb none none none) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb none none none) prophoto-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb none none none / none) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb none none none / none) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 none 0.3) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb 0.7 none 0.3) prophoto-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / none) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / none) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g b)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g b / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b) display-p3 r g b)' assert_true: 'color(from color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b) display-p3 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 0 0 0)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 0 0 0 / 0)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 0 g b / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r 0 b / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g 0 / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b / 0)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 0 g b / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r 0 b / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g 0 / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g b / 0)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 0.2 g b / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 20% g b / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r 0.2 b / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r 20% b / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g 0.2 / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g 20% / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b / 0.2)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b / 20%)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 0.2 g b / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 20% g b / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r 0.2 b / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r 20% b / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g 0.2 / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g 20% / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g b / 0.2)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g b / 20%)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 2 3 4)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 2 3 4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 2 3 4 / 5)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 2 3 4 / 5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 -2 -3 -4)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 -2 -3 -4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 -2 -3 -4 / -5)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 -2 -3 -4 / -5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 200% 300% 400%)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 200% 300% 400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 200% 300% 400% / 500%)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 200% 300% 400% / 500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 -200% -300% -400%)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 -200% -300% -400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 -200% -300% -400% / -500%)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 -200% -300% -400% / -500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 g b r)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 b alpha r / g)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r r r / r)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 alpha alpha alpha / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 g b r)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 b alpha r / g)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r r r / r)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 alpha alpha alpha / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 1.7 1.5 1.3) display-p3 r g b)' assert_true: 'color(from color(display-p3 1.7 1.5 1.3) display-p3 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 1.7 1.5 1.3) display-p3 r g b / alpha)' assert_true: 'color(from color(display-p3 1.7 1.5 1.3) display-p3 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 1.7 1.5 1.3 / 140%) display-p3 r g b)' assert_true: 'color(from color(display-p3 1.7 1.5 1.3 / 140%) display-p3 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 1.7 1.5 1.3 / 140%) display-p3 r g b / alpha)' assert_true: 'color(from color(display-p3 1.7 1.5 1.3 / 140%) display-p3 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 -0.7 -0.5 -0.3) display-p3 r g b)' assert_true: 'color(from color(display-p3 -0.7 -0.5 -0.3) display-p3 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 -0.7 -0.5 -0.3) display-p3 r g b / alpha)' assert_true: 'color(from color(display-p3 -0.7 -0.5 -0.3) display-p3 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 -0.7 -0.5 -0.3 / -40%) display-p3 r g b)' assert_true: 'color(from color(display-p3 -0.7 -0.5 -0.3 / -40%) display-p3 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 -0.7 -0.5 -0.3 / -40%) display-p3 r g b / alpha)' assert_true: 'color(from color(display-p3 -0.7 -0.5 -0.3 / -40%) display-p3 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 calc(r) calc(g) calc(b))' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 calc(r) calc(g) calc(b))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 none none none)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 none none none / none)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g none)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g none / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b / none)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g none / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g b / none)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 none none none) display-p3 r g b)' assert_true: 'color(from color(display-p3 none none none) display-p3 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 none none none / none) display-p3 r g b / alpha)' assert_true: 'color(from color(display-p3 none none none / none) display-p3 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 none 0.3) display-p3 r g b)' assert_true: 'color(from color(display-p3 0.7 none 0.3) display-p3 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(display-p3 0.7 0.5 0.3 / none) display-p3 r g b / alpha)' assert_true: 'color(from color(display-p3 0.7 0.5 0.3 / none) display-p3 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(from color(xyz 7 -20.5 100) xyz x y z) xyz x y z)' assert_true: 'color(from color(from color(xyz 7 -20.5 100) xyz x y z) xyz x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz 0 0 0)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz 0 0 0 / 0)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz 0 y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz 0 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x 0 z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x 0 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y 0 / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z / 0)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz 0 y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz 0 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x 0 z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x 0 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0 / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz 0.2 y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz 0.2 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x 0.2 z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x 0.2 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y 0.2 / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z / 0.2)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z / 20%)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz 0.2 y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz 0.2 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x 0.2 z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x 0.2 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0.2 / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0.2)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz y z x)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz y z x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x x x / x)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x x x / x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz y z x)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz y z x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x x x / x)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x x x / x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz calc(x) calc(y) calc(z))' assert_true: 'color(from color(xyz 7 -20.5 100) xyz calc(x) calc(y) calc(z))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz calc(x) calc(y) calc(z) / calc(alpha))' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz calc(x) calc(y) calc(z) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz none none none)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz none none none / none)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y none)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y none / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z / none)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y none / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / none)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz none none none) xyz x y z)' assert_true: 'color(from color(xyz none none none) xyz x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz none none none / none) xyz x y z / alpha)' assert_true: 'color(from color(xyz none none none / none) xyz x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 none 100) xyz x y z)' assert_true: 'color(from color(xyz 7 none 100) xyz x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / none) xyz x y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / none) xyz x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z) xyz-d50 x y z)' assert_true: 'color(from color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z) xyz-d50 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0 / 0)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0 z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0 / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0 y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0 z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0 / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0.2 y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0.2 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0.2 z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0.2 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0.2 / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0.2)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 20%)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0.2 y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0.2 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0.2 z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0.2 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0.2 / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0.2)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 y z x)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 y z x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x x x / x)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x x x / x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 y z x)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 y z x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x x x / x)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x x x / x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 calc(x) calc(y) calc(z))' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 calc(x) calc(y) calc(z))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 calc(x) calc(y) calc(z) / calc(alpha))' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 calc(x) calc(y) calc(z) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 none none none)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 none none none / none)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y none)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y none / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / none)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y none / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / none)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 none none none) xyz-d50 x y z)' assert_true: 'color(from color(xyz-d50 none none none) xyz-d50 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 none none none / none) xyz-d50 x y z / alpha)' assert_true: 'color(from color(xyz-d50 none none none / none) xyz-d50 x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 none 100) xyz-d50 x y z)' assert_true: 'color(from color(xyz-d50 7 none 100) xyz-d50 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / none) xyz-d50 x y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / none) xyz-d50 x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z) xyz-d65 x y z)' assert_true: 'color(from color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z) xyz-d65 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0 / 0)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0 z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0 / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0 y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0 z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0 / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0.2 y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0.2 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0.2 z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0.2 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0.2 / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0.2)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 20%)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0.2 y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0.2 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0.2 z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0.2 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0.2 / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0.2)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 y z x)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 y z x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x x x / x)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x x x / x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 y z x)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 y z x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x x x / x)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x x x / x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 calc(x) calc(y) calc(z))' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 calc(x) calc(y) calc(z))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 calc(x) calc(y) calc(z) / calc(alpha))' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 calc(x) calc(y) calc(z) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 none none none)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 none none none / none)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y none)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y none / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / none)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y none / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / none)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 none none none) xyz-d65 x y z)' assert_true: 'color(from color(xyz-d65 none none none) xyz-d65 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 none none none / none) xyz-d65 x y z / alpha)' assert_true: 'color(from color(xyz-d65 none none none / none) xyz-d65 x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 none 100) xyz-d65 x y z)' assert_true: 'color(from color(xyz-d65 7 none 100) xyz-d65 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / none) xyz-d65 x y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / none) xyz-d65 x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from var(--bg-color) r g b / 80%)' assert_equals: expected "rgba(0, 0, 255, 0.8)" but got "rgb(0, 0, 0)" -FAIL Property color value 'lch(from var(--color) calc(l / 2) c h)' assert_equals: expected "lch(23.138971 67.989716 134.39125)" but got "rgb(0, 0, 0)" -FAIL Property color value 'rgb(from var(--color) calc(r * .3 + g * .59 + b * .11) calc(r * .3 + g * .59 + b * .11) calc(r * .3 + g * .59 + b * .11))' assert_equals: expected "rgb(76, 76, 76)" but got "rgb(0, 0, 0)" -FAIL Property color value 'lch(from var(--color) l 0 h)' assert_equals: expected "lch(46.277943 0 134.39125)" but got "rgb(0, 0, 0)" -FAIL Property color value 'rgb(from indianred 255 g b)' assert_true: 'rgb(from indianred 255 g b)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from var(--accent) calc(h + 180deg) s l)' assert_equals: expected "rgb(178, 32, 40)" but got "rgb(0, 0, 0)" -FAIL Property color value 'lab(from var(--mycolor) l a b / 100%)' assert_equals: expected "lab(62.751923 52.45802 -34.117283)" but got "rgb(0, 0, 0)" -FAIL Property color value 'lab(from var(--mycolor) l a b / calc(alpha * 0.8))' assert_equals: expected "lab(62.751923 52.45802 -34.117283 / 0.8)" but got "rgb(0, 0, 0)" -FAIL Property color value 'lab(from var(--mycolor) l a b / calc(alpha - 20%))' assert_equals: expected "lab(62.751923 52.45802 -34.117283 / 0.8)" but got "rgb(0, 0, 0)" -FAIL Property color value 'lab(from var(--mycolor) l 0 0)' assert_equals: expected "lab(62.751923 0 0)" but got "rgb(0, 0, 0)" -FAIL Property color value 'lch(from peru calc(l * 0.8) c h)' assert_true: 'lch(from peru calc(l * 0.8) c h)' is a supported value for color. expected true got false -FAIL Property color value 'LCH(from var(--accent) l c calc(h + 180deg))' assert_equals: expected "lch(65.49473 39.446903 10.114471)" but got "rgb(0, 0, 0)" -FAIL Property color value 'lch(from var(--mycolor) l 0 h)' assert_equals: expected "lch(62.751923 0 326.96112)" but got "rgb(0, 0, 0)" -FAIL Property color value 'var(--mygray)' assert_equals: expected "lch(62.751923 0 326.96112)" but got "rgb(0, 0, 0)" -FAIL Property color value 'lch(from var(--mygray) l 30 h)' assert_equals: expected "lch(62.751923 30 326.96112)" but got "rgb(0, 0, 0)" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-valid-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-valid-expected.txt deleted file mode 100644 index 5bf4e6a..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-valid-expected.txt +++ /dev/null
@@ -1,965 +0,0 @@ -This is a testharness.js-based test. -Found 961 tests; 13 PASS, 948 FAIL, 0 TIMEOUT, 0 NOTRUN. -FAIL e.style['color'] = "rgb(from rebeccapurple r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from hsl(120deg 20% 50% / .5) r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(from rebeccapurple r g b) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from color(display-p3 0 1 0) r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from lab(100 104.3 -50.9) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from lab(0 104.3 -50.9) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from lch(100 116 334) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from lch(0 116 334) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from oklab(100 0.365 -0.16) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from oklab(0 0.365 -0.16) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from oklch(100 0.399 336.3) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from oklch(0 0.399 336.3) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple 25 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r 25 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g 25 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g b / .25)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g b / .20)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple 25 g b / 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r 25 b / 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g 25 / 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r 20% 10)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r 10 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple 0% 10 10)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r 20% 10)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r 10 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) 0% 10 10)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple calc(r) calc(g) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r calc(g * 2) 10)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple b calc(r * .5) 10)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r calc(g * .5 + g * .5) 10)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r calc(b * .5 - g * .5) 10)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) calc(r) calc(g) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20% 40% 60% / 80%) r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20% 40% 60% / 80%) r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(none none none) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(none none none / none) r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20% none 60%) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20% 40% 60% / none) r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(120deg 20% 50% / .5) h s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(from rebeccapurple h s l) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from color(display-p3 0 1 0) h s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from lab(100 104.3 -50.9) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from lab(0 104.3 -50.9) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from lch(100 116 334) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from lch(0 116 334) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from oklab(100 0.365 -0.16) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from oklab(0 0.365 -0.16) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from oklch(100 0.399 336.3) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from oklch(0 0.399 336.3) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple 0 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple 0deg 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple 0 0% 0% / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple 0deg 0% 0% / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple 0 s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple 0deg s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h 0% l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h s 0% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h s l / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) 0 s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) 0deg s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h 0% l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h s 0% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h s l / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple 25 s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple 25deg s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h 20% l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h s 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h s l / .25)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) 25 s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) 25deg s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h 20% l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h s 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h s l / .2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h l s)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h alpha l / s)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h l l / l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h l s)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h alpha l / s)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h l l / l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple calc(h) calc(s) calc(l))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) calc(h) calc(s) calc(l) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h s none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h s none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h s l / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple none s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(120deg 20% 50% / .5) h s none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(120deg 20% 50% / .5) h s l / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(120deg 20% 50% / .5) none s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(none none none) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(none none none / none) h s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(120deg none 50% / .5) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(120deg 20% 50% / none) h s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(none 20% 50% / .5) h s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hsl(120deg 20% 50% / .5) h w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hwb(from rebeccapurple h w b) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from color(display-p3 0 1 0) h w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from lab(100 104.3 -50.9) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from lab(0 104.3 -50.9) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from lch(100 116 334) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from lch(0 116 334) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from oklab(100 0.365 -0.16) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from oklab(0 0.365 -0.16) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from oklch(100 0.399 336.3) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from oklch(0 0.399 336.3) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple 0 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple 0deg 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple 0 0% 0% / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple 0deg 0% 0% / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple 0 w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple 0deg w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h 0% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w 0% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) 0 w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) 0deg w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h 0% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h w 0% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h w b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple 25 w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple 25deg w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w b / .2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) 25 w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) 25deg w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h w 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h w b / .2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h b w)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h alpha w / b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w w / w)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h b w)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h alpha w / b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h w w / w)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple calc(h) calc(w) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) calc(h) calc(w) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple none w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hwb(120deg 20% 50% / .5) h w none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hwb(120deg 20% 50% / .5) h w b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hwb(120deg 20% 50% / .5) none w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hwb(none none none) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hwb(none none none / none) h w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hwb(120deg none 50% / .5) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hwb(120deg 20% 50% / none) h w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hwb(none 20% 50% / .5) h w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50 / 40%) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(200 300 400 / 500%) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(-200 -300 -400 / -500%) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(from lab(25 20 50) l a b) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from color(display-p3 0 0 0) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) 0 a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) l 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) l a 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) l a b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50 / 40%) 0 a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50 / 40%) l 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50 / 40%) l a 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50 / 40%) l a b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) 35 a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) l 35 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) l a 35 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) l a b / .35)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50 / 40%) 35 a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50 / 40%) l 35 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50 / 40%) l a 35 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50 / 40%) l a b / .35)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(0.7 45 30 / 40%) 200 300 400 / 500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(0.7 45 30 / 40%) -200 -300 -400 / -500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) l b a)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) l a a / a)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50 / 40%) l b a)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50 / 40%) l a a / a)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) calc(l) calc(a) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) l a none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) l a none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50) l a b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50 / 40%) l a none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50 / 40%) l a b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(none none none) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(none none none / none) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 none 50) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25 20 50 / none) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50 / 40%) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(200 300 400 / 500%) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(-200 -300 -400 / -500%) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(from oklab(25 20 50) l a b) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from color(display-p3 0 0 0) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) 0 a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) l 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) l a 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) l a b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50 / 40%) 0 a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50 / 40%) l 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50 / 40%) l a 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50 / 40%) l a b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) 35 a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) l 35 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) l a 35 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) l a b / .35)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50 / 40%) 35 a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50 / 40%) l 35 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50 / 40%) l a 35 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50 / 40%) l a b / .35)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(0.7 45 30 / 40%) 200 300 400 / 500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(0.7 45 30 / 40%) -200 -300 -400 / -500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) l b a)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) l a a / a)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50 / 40%) l b a)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50 / 40%) l a a / a)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) calc(l) calc(a) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) l a none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) l a none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50) l a b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50 / 40%) l a none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50 / 40%) l a b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(none none none) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(none none none / none) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 none 50) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25 20 50 / none) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(.7 45 30) alpha b a / l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(.7 45 30) alpha a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(.7 45 30) alpha a a / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(.7 45 30 / 40%) alpha b a / l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(.7 45 30 / 40%) alpha a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(.7 45 30 / 40%) alpha a a / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(.7 45 30) alpha b a / l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(.7 45 30) alpha a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(.7 45 30) alpha a a / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(.7 45 30 / 40%) alpha b a / l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(.7 45 30 / 40%) alpha a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(.7 45 30 / 40%) alpha a a / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30 / 40%) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(200 300 400 / 500%) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(-200 -300 -400 / -500%) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(from lch(0.7 45 30) l c h) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from color(display-p3 0 0 0) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lab(0.7 45 30) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) 0 0 0deg)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) 0 0 0deg / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) 0 c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) l 0 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) l c 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) l c 0deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) l c h / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30 / 40%) 0 c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30 / 40%) l 0 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30 / 40%) l c 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30 / 40%) l c 0deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30 / 40%) l c h / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) 25 c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) l 25 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) l c 25 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) l c 25deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) l c h / .25)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30 / 40%) 25 c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30 / 40%) l 25 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30 / 40%) l c 25 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30 / 40%) l c 25deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30 / 40%) l c h / .25)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30 / 40%) 200 300 400 / 500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30 / 40%) -200 -300 -400 / -500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30 / 40%) 50 120 400deg / 500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30 / 40%) 50 120 -400deg / -500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(.7 45 30) l c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(.7 45 30 / 40%) l c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) calc(l) calc(c) calc(h))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) l c none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) l c none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30) l c h / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30 / 40%) l c none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30 / 40%) l c h / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(none none none) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(none none none / none) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 none 30) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(0.7 45 30 / none) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30 / 40%) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(200 300 400 / 500%) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(-200 -300 -400 / -500%) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(from oklch(0.7 45 30) l c h) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from color(display-p3 0 0 0) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklab(0.7 45 30) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) 0 0 0deg)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) 0 0 0deg / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) 0 c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) l 0 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) l c 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) l c 0deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) l c h / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30 / 40%) 0 c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30 / 40%) l 0 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30 / 40%) l c 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30 / 40%) l c 0deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30 / 40%) l c h / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) 25 c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) l 25 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) l c 25 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) l c 25deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) l c h / .25)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30 / 40%) 25 c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30 / 40%) l 25 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30 / 40%) l c 25 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30 / 40%) l c 25deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30 / 40%) l c h / .25)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30 / 40%) 200 300 400 / 500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30 / 40%) -200 -300 -400 / -500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30 / 40%) 50 120 400deg / 500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30 / 40%) 50 120 -400deg / -500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(.7 45 30) l c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(.7 45 30 / 40%) l c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) calc(l) calc(c) calc(h))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) l c none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) l c none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30) l c h / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30 / 40%) l c none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30 / 40%) l c h / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(none none none) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(none none none / none) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 none 30) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(0.7 45 30 / none) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(.7 45 30) alpha c h / l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(.7 45 30) alpha c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(.7 45 30) alpha c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(.7 45 30 / 40%) alpha c h / l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(.7 45 30 / 40%) alpha c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(.7 45 30 / 40%) alpha c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(.7 45 30) alpha c h / l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(.7 45 30) alpha c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(.7 45 30) alpha c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(.7 45 30 / 40%) alpha c h / l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(.7 45 30 / 40%) alpha c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(.7 45 30 / 40%) alpha c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(from color(srgb 0.7 0.5 0.3) srgb r g b) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 2 3 4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 2 3 4 / 5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb -2 -3 -4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb -2 -3 -4 / -5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 200% 300% 400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 200% 300% 400% / 500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb -200% -300% -400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb -200% -300% -400% / -500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 1.7 1.5 1.3) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 1.7 1.5 1.3) srgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 1.7 1.5 1.3 / 140%) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 1.7 1.5 1.3 / 140%) srgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb -0.7 -0.5 -0.3) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb -0.7 -0.5 -0.3) srgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb -0.7 -0.5 -0.3 / -40%) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb -0.7 -0.5 -0.3 / -40%) srgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb calc(r) calc(g) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb calc(r) calc(g) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) 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(from color(srgb 0.7 0.5 0.3) srgb r g none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb none none none) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb none none none / none) srgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 none 0.3) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / none) srgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) 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(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 2 3 4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 2 3 4 / 5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -2 -3 -4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -2 -3 -4 / -5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 200% 300% 400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 200% 300% 400% / 500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -200% -300% -400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -200% -300% -400% / -500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 1.7 1.5 1.3) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 1.7 1.5 1.3) srgb-linear r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 1.7 1.5 1.3 / 140%) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 1.7 1.5 1.3 / 140%) srgb-linear r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear -0.7 -0.5 -0.3) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear -0.7 -0.5 -0.3) srgb-linear r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear -0.7 -0.5 -0.3 / -40%) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear -0.7 -0.5 -0.3 / -40%) srgb-linear r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear calc(r) calc(g) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear calc(r) calc(g) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) 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(from color(srgb-linear 0.7 0.5 0.3) 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(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear none none none) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear none none none / none) srgb-linear r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 none 0.3) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / none) srgb-linear r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) 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(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 2 3 4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 2 3 4 / 5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -2 -3 -4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -2 -3 -4 / -5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 200% 300% 400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 200% 300% 400% / 500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -200% -300% -400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -200% -300% -400% / -500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 1.7 1.5 1.3) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 1.7 1.5 1.3) a98-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 1.7 1.5 1.3 / 140%) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 1.7 1.5 1.3 / 140%) a98-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb -0.7 -0.5 -0.3) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb -0.7 -0.5 -0.3) a98-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb -0.7 -0.5 -0.3 / -40%) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb -0.7 -0.5 -0.3 / -40%) a98-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb calc(r) calc(g) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb calc(r) calc(g) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) 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(from color(a98-rgb 0.7 0.5 0.3) 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(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb none none none) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb none none none / none) a98-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 none 0.3) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / none) a98-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 2 3 4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 2 3 4 / 5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 -2 -3 -4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 -2 -3 -4 / -5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 200% 300% 400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 200% 300% 400% / 500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 -200% -300% -400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 -200% -300% -400% / -500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 1.7 1.5 1.3) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 1.7 1.5 1.3) rec2020 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 1.7 1.5 1.3 / 140%) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 1.7 1.5 1.3 / 140%) rec2020 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 -0.7 -0.5 -0.3) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 -0.7 -0.5 -0.3) rec2020 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 -0.7 -0.5 -0.3 / -40%) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 -0.7 -0.5 -0.3 / -40%) rec2020 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 calc(r) calc(g) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 calc(r) calc(g) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) 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(from color(rec2020 0.7 0.5 0.3) rec2020 r g none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 none none none) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 none none none / none) rec2020 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 none 0.3) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / none) rec2020 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) 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(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 2 3 4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 2 3 4 / 5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -2 -3 -4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -2 -3 -4 / -5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 200% 300% 400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 200% 300% 400% / 500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -200% -300% -400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -200% -300% -400% / -500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 1.7 1.5 1.3) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 1.7 1.5 1.3) prophoto-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 1.7 1.5 1.3 / 140%) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 1.7 1.5 1.3 / 140%) prophoto-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb -0.7 -0.5 -0.3) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb -0.7 -0.5 -0.3) prophoto-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb -0.7 -0.5 -0.3 / -40%) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb -0.7 -0.5 -0.3 / -40%) prophoto-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb calc(r) calc(g) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb calc(r) calc(g) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) 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(from color(prophoto-rgb 0.7 0.5 0.3) 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(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb none none none) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb none none none / none) prophoto-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 none 0.3) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / none) prophoto-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b) display-p3 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) 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(from color(display-p3 0.7 0.5 0.3) display-p3 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 2 3 4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 2 3 4 / 5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 -2 -3 -4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 -2 -3 -4 / -5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 200% 300% 400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 200% 300% 400% / 500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 -200% -300% -400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 -200% -300% -400% / -500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 1.7 1.5 1.3) display-p3 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 1.7 1.5 1.3) display-p3 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 1.7 1.5 1.3 / 140%) display-p3 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 1.7 1.5 1.3 / 140%) display-p3 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 -0.7 -0.5 -0.3) display-p3 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 -0.7 -0.5 -0.3) display-p3 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 -0.7 -0.5 -0.3 / -40%) display-p3 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 -0.7 -0.5 -0.3 / -40%) display-p3 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 calc(r) calc(g) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 calc(r) calc(g) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) 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(from color(display-p3 0.7 0.5 0.3) 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(from color(display-p3 0.7 0.5 0.3) display-p3 r g none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3) display-p3 r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / 40%) display-p3 r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 none none none) display-p3 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 none none none / none) display-p3 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 none 0.3) display-p3 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(display-p3 0.7 0.5 0.3 / none) display-p3 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(from color(xyz 7 -20.5 100) xyz x y z) xyz x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz 0 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x 0 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y z / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz 0 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x 0 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz 0.2 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x 0.2 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y z / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y z / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz 0.2 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x 0.2 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz y z x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x x x / x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz y z x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x x x / x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz calc(x) calc(y) calc(z))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz calc(x) calc(y) calc(z) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) 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(from color(xyz 7 -20.5 100) xyz x y none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y z / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz none none none) xyz x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz none none none / none) xyz x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 none 100) xyz x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / none) xyz x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z) xyz-d50 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) 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(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 0.2 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0.2 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0.2 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0.2 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 y z x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x x x / x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 y z x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x x x / x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 calc(x) calc(y) calc(z))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 calc(x) calc(y) calc(z) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) 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(from color(xyz-d50 7 -20.5 100) 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(from color(xyz-d50 7 -20.5 100) xyz-d50 x y none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 none none none) xyz-d50 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 none none none / none) xyz-d50 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 none 100) xyz-d50 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / none) xyz-d50 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z) xyz-d65 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) 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(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 0.2 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0.2 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0.2 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0.2 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 y z x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x x x / x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 y z x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x x x / x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 calc(x) calc(y) calc(z))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 calc(x) calc(y) calc(z) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) 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(from color(xyz-d65 7 -20.5 100) 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(from color(xyz-d65 7 -20.5 100) xyz-d65 x y none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 none none none) xyz-d65 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 none none none / none) xyz-d65 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 none 100) xyz-d65 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / none) xyz-d65 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "rgb(from var(--bg-color) r g b / 80%)" should set the property value -PASS e.style['color'] = "lch(from var(--color) calc(l / 2) c h)" should set the property value -PASS e.style['color'] = "rgb(from var(--color) calc(r * .3 + g * .59 + b * .11) calc(r * .3 + g * .59 + b * .11) calc(r * .3 + g * .59 + b * .11))" should set the property value -PASS e.style['color'] = "lch(from var(--color) l 0 h)" should set the property value -FAIL e.style['color'] = "rgb(from indianred 255 g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "hsl(from var(--accent) calc(h + 180deg) s l)" should set the property value -PASS e.style['color'] = "lab(from var(--mycolor) l a b / 100%)" should set the property value -PASS e.style['color'] = "lab(from var(--mycolor) l a b / calc(alpha * 0.8))" should set the property value -PASS e.style['color'] = "lab(from var(--mycolor) l a b / calc(alpha - 20%))" should set the property value -PASS e.style['color'] = "lab(from var(--mycolor) l 0 0)" should set the property value -FAIL e.style['color'] = "lch(from peru calc(l * 0.8) c h)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "LCH(from var(--accent) l c calc(h + 180deg))" should set the property value -PASS e.style['color'] = "lch(from var(--mycolor) l 0 h)" should set the property value -PASS e.style['color'] = "var(--mygray)" should set the property value -PASS e.style['color'] = "lch(from var(--mygray) l 30 h)" should set the property value -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/system-color-valid-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/system-color-valid-expected.txt deleted file mode 100644 index 0ab1033..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/system-color-valid-expected.txt +++ /dev/null
@@ -1,22 +0,0 @@ -This is a testharness.js-based test. -PASS e.style['color'] = "ActiveText" should set the property value -PASS e.style['color'] = "ButtonBorder" should set the property value -PASS e.style['color'] = "ButtonFace" should set the property value -PASS e.style['color'] = "ButtonText" should set the property value -PASS e.style['color'] = "Canvas" should set the property value -PASS e.style['color'] = "CanvasText" should set the property value -PASS e.style['color'] = "Field" should set the property value -PASS e.style['color'] = "FieldText" should set the property value -PASS e.style['color'] = "GrayText" should set the property value -PASS e.style['color'] = "Highlight" should set the property value -PASS e.style['color'] = "HighlightText" should set the property value -PASS e.style['color'] = "LinkText" should set the property value -PASS e.style['color'] = "Mark" should set the property value -PASS e.style['color'] = "MarkText" should set the property value -PASS e.style['color'] = "VisitedText" should set the property value -PASS e.style['color'] = "SelectedItem" should set the property value -PASS e.style['color'] = "SelectedItemText" should set the property value -FAIL e.style['color'] = "AccentColor" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "AccentColorText" 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/external/wpt/css/css-contain/content-visibility/content-visibility-with-top-layer-hide-after-addition.html b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-with-top-layer-hide-after-addition.html new file mode 100644 index 0000000..434e504 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-with-top-layer-hide-after-addition.html
@@ -0,0 +1,33 @@ +<!doctype html> +<html class="reftest-wait"> +<meta charset="utf8"> +<title>CSS Content Visibility: dialog doesn't show when hidden after showModal()</title> +<link rel="author" title="Martin Robinson" href="mailto:mrobinson@igalia.com"> +<link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility"> +<link rel="match" href="container-ref.html"> +<meta name="assert" content="top layer dialogs don't render when in skipped subtrees"> + +<script src="/common/reftest-wait.js"></script> + +<style> +.box { width: 150px; height: 150px; background: lightblue } +.hidden { content-visibility: hidden } +</style> + +<div id=container class=box> +content +<dialog id=dialog>dialog<div id=inner></div></dialog> +</div> + +<script> +function runTest() { + dialog.showModal(); + inner.getBoundingClientRect(); + + container.classList.add("hidden"); + + takeScreenshot(); +} + +onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest)); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-shorthand-serialization-font-stretch.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-shorthand-serialization-font-stretch.html index f5fff421..e39d6c6 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-shorthand-serialization-font-stretch.html +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-shorthand-serialization-font-stretch.html
@@ -9,31 +9,79 @@ <script> test(function() { const div = document.getElementById("test"); + div.style.fontStretch = "ultra-condensed"; + assert_equals(div.style.fontStretch, "ultra-condensed"); + assert_equals(div.style.font, "ultra-condensed medium serif"); + div.style.fontStretch = "extra-condensed"; + assert_equals(div.style.fontStretch, "extra-condensed"); + assert_equals(div.style.font, "extra-condensed medium serif"); + div.style.fontStretch = "condensed"; + assert_equals(div.style.fontStretch, "condensed"); + assert_equals(div.style.font, "condensed medium serif"); + div.style.fontStretch = "semi-condensed"; + assert_equals(div.style.fontStretch, "semi-condensed"); + assert_equals(div.style.font, "semi-condensed medium serif"); + div.style.fontStretch = "normal"; + assert_equals(div.style.fontStretch, "normal"); + assert_equals(div.style.font, "medium serif", "The keyword normal should be omitted"); + div.style.fontStretch = "semi-expanded"; + assert_equals(div.style.fontStretch, "semi-expanded"); + assert_equals(div.style.font, "semi-expanded medium serif"); + div.style.fontStretch = "expanded"; + assert_equals(div.style.fontStretch, "expanded"); + assert_equals(div.style.font, "expanded medium serif"); + div.style.fontStretch = "extra-expanded"; + assert_equals(div.style.fontStretch, "extra-expanded"); + assert_equals(div.style.font, "extra-expanded medium serif"); + div.style.fontStretch = "ultra-expanded"; + assert_equals(div.style.fontStretch, "ultra-expanded"); + assert_equals(div.style.font, "ultra-expanded medium serif"); +}, "Keywords should appear in serialization of font and fontStretch"); + +test(function() { + const div = document.getElementById("test"); div.style.fontStretch = "50%"; + assert_equals(div.style.fontStretch, "50%"); assert_equals(div.style.font, "ultra-condensed medium serif"); div.style.fontStretch = "62.5%"; + assert_equals(div.style.fontStretch, "62.5%"); assert_equals(div.style.font, "extra-condensed medium serif"); div.style.fontStretch = "75%"; + assert_equals(div.style.fontStretch, "75%"); assert_equals(div.style.font, "condensed medium serif"); div.style.fontStretch = "87.5%"; + assert_equals(div.style.fontStretch, "87.5%"); assert_equals(div.style.font, "semi-condensed medium serif"); div.style.fontStretch = "100%"; + assert_equals(div.style.fontStretch, "100%"); assert_equals(div.style.font, "medium serif", "The keyword normal should be omitted"); div.style.fontStretch = "112.5%"; + assert_equals(div.style.fontStretch, "112.5%"); assert_equals(div.style.font, "semi-expanded medium serif"); div.style.fontStretch = "125%"; + assert_equals(div.style.fontStretch, "125%"); assert_equals(div.style.font, "expanded medium serif"); div.style.fontStretch = "150%"; + assert_equals(div.style.fontStretch, "150%"); assert_equals(div.style.font, "extra-expanded medium serif"); div.style.fontStretch = "200%"; + assert_equals(div.style.fontStretch, "200%"); assert_equals(div.style.font, "ultra-expanded medium serif"); -}, "Percentages which can be transformed into keywords should be for serialization"); + div.style.fontStretch = "50.00000%"; + assert_equals(div.style.fontStretch, "50%"); + assert_equals(div.style.font, "ultra-condensed medium serif"); +}, "Percentages which can be transformed into keywords should be for serialization of font, but not of fontStretch"); test(function() { const div = document.getElementById("test"); div.style.fontStretch = "25%"; + assert_equals(div.style.fontStretch, "25%"); assert_equals(div.style.font, ""); div.style.fontStretch = "101%"; + assert_equals(div.style.fontStretch, "101%"); assert_equals(div.style.font, ""); -}, "Percentages which cannot be transformed into keywords should prevent the font shorthand from serializing"); + div.style.fontStretch = "50.01%"; + assert_equals(div.style.fontStretch, "50.01%"); + assert_equals(div.style.font, ""); +}, "Percentages which cannot be transformed into keywords should prevent the font shorthand from serializing, but not fontStretch"); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-weight-xxx-large-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-size-xxx-large-ref.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-fonts/font-weight-xxx-large-ref.html rename to third_party/blink/web_tests/external/wpt/css/css-fonts/font-size-xxx-large-ref.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-weight-xxx-large.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-size-xxx-large.html similarity index 90% rename from third_party/blink/web_tests/external/wpt/css/css-fonts/font-weight-xxx-large.html rename to third_party/blink/web_tests/external/wpt/css/css-fonts/font-size-xxx-large.html index 3271066..44a3068 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-weight-xxx-large.html +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-size-xxx-large.html
@@ -5,7 +5,7 @@ <link rel="author" title="Joel Olsson" href="joel_1st@hotmail.com"> <link rel="help" href="https://www.w3.org/TR/css-fonts-4/#font-size-prop"> <link rel="help" href="https://www.w3.org/TR/css-fonts-4/#absolute-size-mapping"> -<link rel="match" href="font-weight-xxx-large-ref.html"> +<link rel="match" href="font-size-xxx-large-ref.html"> <body> <p>Test passes if the line below is identical, with matching font size.</p> <span style="font-size: xxx-large">Foo</span>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/rlh-in-monospace-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/rlh-in-monospace-ref.html new file mode 100644 index 0000000..e60a59d7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/rlh-in-monospace-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<p>The following two lines should look exactly the same.</p> + +<div style="font-family: sans-serif; font-size: 1rlh"> + Text. +</div> + +<div style="font-family: sans-serif; font-size: 1rlh"> + Text. +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/rlh-in-monospace.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/rlh-in-monospace.html new file mode 100644 index 0000000..26a57a7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/rlh-in-monospace.html
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-fonts-4/#font-size-prop"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=623842"> +<link rel="help" href="https://bugs.webkit.org/show_bug.cgi?id=246566"> +<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m"> +<link rel="match" href="rlh-in-monospace-ref.html"> + +<p>The following two lines should look exactly the same.</p> + +<div style="font-family: monospace; font-size: 1.5em"> + <div style="font-family: sans-serif; font-size: 1rlh"> + Text. + </div> +</div> + +<div style="font-family: sans-serif; font-size: 1rlh"> + Text. +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/break-before-multicol-caption.html b/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/break-before-multicol-caption.html new file mode 100644 index 0000000..ac6f444e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/break-before-multicol-caption.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1375029"> +<div style="columns:5; column-fill:auto; height:10px;"> + <div style="display:table;"> + <div style="display:table-caption;"> + <div style="height:1px;"></div> + <div style="height:11px; contain:size;"></div> + </div> + <div style="display:table-caption; columns:2; column-fill:auto; height:1px;"></div> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-transform-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-transform-expected.txt index 965a95e5..63ddb1d 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-transform-expected.txt +++ b/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-transform-expected.txt
@@ -2,7 +2,7 @@ PASS Can set 'text-transform' to CSS-wide keywords PASS Can set 'text-transform' to var() references PASS Can set 'text-transform' to the 'none' keyword -FAIL Can set 'text-transform' to the 'captialize' keyword Failed to execute 'set' on 'StylePropertyMap': Invalid type for property +PASS Can set 'text-transform' to the 'capitalize' keyword PASS Can set 'text-transform' to the 'uppercase' keyword PASS Can set 'text-transform' to the 'lowercase' keyword FAIL Can set 'text-transform' to the 'full-width' keyword Failed to execute 'set' on 'StylePropertyMap': Invalid type for property
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-transform.html b/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-transform.html index 7d6e9c3..8f636fa 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-transform.html +++ b/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-transform.html
@@ -15,7 +15,7 @@ runPropertyTests('text-transform', [ { syntax: 'none' }, - { syntax: 'captialize' }, + { syntax: 'capitalize' }, { syntax: 'uppercase' }, { syntax: 'lowercase' }, { syntax: 'full-width' },
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-027.html b/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-027.html new file mode 100644 index 0000000..b4e7117f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-027.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test (Selectors): :focus-visible after click and input type change</title> +<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io"> +<link rel="author" title="Mozilla" href="https://mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1788698"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<input type="button" value="+"> +<script> + let input = document.querySelector("input"); + input.addEventListener("click", function(e) { + if (this.type != "button") { + return; + } + this.value = ""; + this.type = "text"; + }); + promise_test(async function() { + await test_driver.click(input); + assert_equals(input.type, "text"); + assert_equals(input.matches(":focus"), input.matches(":focus-visible"), "Type change to text might cause :focus-visible to start matching"); + }); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-and-nth-last-child-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-and-nth-last-child-ref.html new file mode 100644 index 0000000..447426a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-and-nth-last-child-ref.html
@@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html> +<head> +<style> + target { + background-color: red; + } + + #success1, #success2, #success3 { + background-color: green; + } +</style> +</head> +<body> + <p>Test the matching of an element only if it is the only child matching the selector list. If the test succeed, every instance of the text "Success" should be on green background.</p> + <div> + <div></div> + <target>Foo</target> + <div></div> + <target>Bar</target> + <div></div> + </div> + <div> + <div></div> + <div></div> + <target id="success1">Success</target> + <div></div> + </div> + <div> + <div></div> + <target>Foo</target> + <div></div> + <target>Bar</target> + <div></div> + </div> + <div> + <div></div> + <div></div> + <target id="success2">Success</target> + <div></div> + </div> + <div> + <div></div> + <target>Foo</target> + <div></div> + <target>Bar</target> + <div></div> + </div> + <div> + <div></div> + <div></div> + <target id="success3">Success</target> + <div></div> + </div> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-and-nth-last-child.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-and-nth-last-child.html new file mode 100644 index 0000000..455063f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-and-nth-last-child.html
@@ -0,0 +1,75 @@ +<!DOCTYPE html> +<html> +<head> +<title>:nth-child and :nth-last-child with selector list argument chained together</title> +<link rel="help" href="https://w3c.github.io/csswg-drafts/selectors-4/#child-index"> +<link rel="match" href="nth-child-and-nth-last-child-ref.html"> +<style> + target1 { + background-color: red; + } + + :nth-child(1 of target1):nth-last-child(1 of target1) { + background-color: green; + } + + .target { + background-color: red; + } + + :nth-child(1 of .target):nth-last-child(1 of .target) { + background-color: green; + } + + [data-target] { + background-color: red; + } + + :nth-child(1 of [data-target]):nth-last-child(1 of [data-target]) { + background-color: green; + } +</style> +</head> +<body> + <p>Test the matching of an element only if it is the only child matching the selector list. If the test succeed, every instance of the text "Success" should be on green background.</p> + <div> + <div></div> + <target1>Foo</target1> + <div></div> + <target1>Bar</target1> + <div></div> + </div> + <div> + <div></div> + <div></div> + <target1>Success</target1> + <div></div> + </div> + <div> + <div class="nottarget"></div> + <target class="target">Foo</target> + <div class="nottarget"></div> + <target class="target">Bar</target> + <div class="nottarget"></div> + </div> + <div> + <div class="nottarget"></div> + <div class="nottarget"></div> + <target class="target">Success</target> + <div class="nottarget"></div> + </div> + <div> + <div data-not-target></div> + <target data-target>Foo</target> + <div data-not-target></div> + <target data-target>Bar</target> + <div data-not-target></div> + </div> + <div> + <div data-not-target></div> + <div data-not-target></div> + <target data-target>Success</target> + <div data-not-target></div> + </div> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-classname-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-classname-ref.html new file mode 100644 index 0000000..b424e73 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-classname-ref.html
@@ -0,0 +1,16 @@ +<!doctype html> +<html> +<body> + <p>This test the styling of paragraphs with :nth-child(An+B of selector). If the test succeed, paragraphs that say "green" should have a green background.</p> + <p class="webkit">White</p> + <p>White</p> + <p>White</p> + <p style="background-color: lime">Green!</p> + <p>White</p> + <p>White</p> + <p>White</p> + <p>White</p> + <p style="background-color: lime">Green!</p> + <p>White</p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-classname.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-classname.html new file mode 100644 index 0000000..8ec3f43 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-classname.html
@@ -0,0 +1,26 @@ +<!doctype html> +<html> +<head> +<title>:nth-child with .className selector list argument</title> +<link rel="help" href="https://w3c.github.io/csswg-drafts/selectors-4/#child-index"> +<link rel="match" href="nth-child-of-classname-ref.html"> +<style> +p:nth-child(even of .webkit, .fast) { + background-color: lime; +} +</style> +</head> +<body> + <p>This test the styling of paragraphs with :nth-child(An+B of selector). If the test succeed, paragraphs that say "green" should have a green background.</p> + <p class="webkit">White</p> + <p>White</p> + <p>White</p> + <p class="fast">Green!</p> + <p>White</p> + <p>White</p> + <p class="webkit">White</p> + <p>White</p> + <p class="webkit">Green!</p> + <p>White</p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-complex-selector-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-complex-selector-ref.html new file mode 100644 index 0000000..ba38f68 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-complex-selector-ref.html
@@ -0,0 +1,14 @@ +<!doctype html> +<html> +<body> + <p>This test the styling of paragraphs with :nth-child(An+B of selector). If the test succeed, paragraphs that say "green" should have a green background.</p> + <p>White</p> + <p>White</p> + <p>White</p> + <p style="background-color: lime">Green</p> + <p>White</p> + <p>White</p> + <p>White</p> + <p style="background-color: lime">Green</p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-complex-selector.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-complex-selector.html new file mode 100644 index 0000000..b751d83 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-complex-selector.html
@@ -0,0 +1,25 @@ +<!doctype html> +<html> +<head> +<title>:nth-child with complex selector list argument</title> +<link rel="help" href="https://w3c.github.io/csswg-drafts/selectors-4/#child-index"> +<link rel="match" href="nth-child-of-complex-selector-ref.html"> +<style> +/* At least 4 pair of <p> above, can be overlapping. The other selectors of the list are useless. */ +p:nth-child(4n of html:root>body>p+p:not(empty), :not(*), p:not(p), span, .notthere) { + background-color: lime; +} +</style> +</head> +<body> + <p>This test the styling of paragraphs with :nth-child(An+B of selector). If the test succeed, paragraphs that say "green" should have a green background.</p> + <p>White</p> + <p>White</p> + <p>White</p> + <p>Green</p> + <p>White</p> + <p>White</p> + <p>White</p> + <p>Green</p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-compound-selector-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-compound-selector-ref.html new file mode 100644 index 0000000..3acec23e6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-compound-selector-ref.html
@@ -0,0 +1,18 @@ +<!doctype html> +<html> +<body> + <p></p> + <p>This test the styling of paragraphs with :nth-child(An+B of selector). If the test succeed, paragraphs that say "green" should have a green background.</p> + <p>White!</p> + <p>White!</p> + <p>White!</p> + <p>White!</p> + <p>White!</p> + <p style="background-color: lime">Green</p> + <p>White!</p> + <p>White!</p> + <p>White!</p> + <p>White!</p> + <p>White!</p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-compound-selector.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-compound-selector.html new file mode 100644 index 0000000..5efefe6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-compound-selector.html
@@ -0,0 +1,29 @@ +<!doctype html> +<html> +<head> +<title>:nth-child with compound selector argument</title> +<link rel="help" href="https://w3c.github.io/csswg-drafts/selectors-4/#child-index"> +<link rel="match" href="nth-child-of-compound-selector-ref.html"> +<style> +/* 3n of paragraph with the class foobar but for which foobar is not the only class. */ +p:nth-child(3n+1 of p.foobar:not([class=foobar])) { + background-color: lime; +} +</style> +</head> +<body> + <p class="foobar foo"></p> + <p>This test the styling of paragraphs with :nth-child(An+B of selector). If the test succeed, paragraphs that say "green" should have a green background.</p> + <p class="foobar">White!</p> + <p class="foobar foo">White!</p> + <p>White!</p> + <p class="foo foobar">White!</p> + <p>White!</p> + <p class="foobar foo">Green</p> + <p class="foobar">White!</p> + <p class="foo foobar">White!</p> + <p class="foobar">White!</p> + <p class="foo foobar baz">White!</p> + <p>White!</p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-tagname-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-tagname-ref.html new file mode 100644 index 0000000..99c8262 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-tagname-ref.html
@@ -0,0 +1,16 @@ +<!doctype html> +<html> +<body> + <webkit></webkit> + <p>This test the styling of paragraphs with :nth-child(An+B of selector). If the test succeed, paragraphs that say "green" should have a green background.</p> + <p>White!</p> + <p>White!</p> + <fast>White!</fast> + <p>White!</p> + <p>White!</p> + <webkit style="background-color: lime">Green</webkit> + <p>White!</p> + <webkit>White!</webkit> + <p>White!</p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-tagname.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-tagname.html new file mode 100644 index 0000000..107e834 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-of-tagname.html
@@ -0,0 +1,26 @@ +<!doctype html> +<html> +<head> +<title>:nth-child with tagname selector list argument</title> +<link rel="help" href="https://w3c.github.io/csswg-drafts/selectors-4/#child-index"> +<link rel="match" href="nth-child-of-tagname-ref.html"> +<style> +:nth-child(odd of webkit, fast) { + background-color: lime; +} +</style> +</head> +<body> + <webkit></webkit> + <p>This test the styling of paragraphs with :nth-child(An+B of selector). If the test succeed, paragraphs that say "green" should have a green background.</p> + <p>White!</p> + <p>White!</p> + <fast>White!</fast> + <p>White!</p> + <p>White!</p> + <webkit>Green</webkit> + <p>White!</p> + <webkit>White!</webkit> + <p>White!</p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-1-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-1-ref.html new file mode 100644 index 0000000..df70316c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-1-ref.html
@@ -0,0 +1,17 @@ +<!doctype html> +<html> +<body> + <p>This test the specificity of :nth-child() with static specificity. The test passes if the text "target" is displayed white on green background. There should be 2 red rects on each side.</p> + <div> + <foo style="color: red; background-color: red;">Not target</foo> + <padding></padding> + <bar style="color: red; background-color: red;">Not target</bar> + <more-padding></more-padding> + <target style="color: white; background-color: green;">Target</target> + <more-padding></more-padding> + <foo style="color: red; background-color: red;">Not target</foo> + <padding></padding> + <bar style="color: red; background-color: red;">Not target</bar> + </div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-1.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-1.html new file mode 100644 index 0000000..d0b084a7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-1.html
@@ -0,0 +1,40 @@ +<!doctype html> +<html> +<head> +<title>:nth-child with selector list specificity</title> +<link rel="help" href="https://w3c.github.io/csswg-drafts/selectors-4/#child-index"> +<link rel="match" href="nth-child-specificity-1-ref.html"> +<style> + /* The following 3 rules should all have the same specificity when matching <target>. They should be be applied in order. */ + foo:nth-child(n), bar:nth-child(n), target:nth-child(n) { + background-color: red; + color: red; + } + :nth-child(3n of foo, bar, target) { + background-color: green; + color: blue; + } + foo.target, bar.target, target.target { + color: white; + } + * { + background-color: white; + color: black; + } +</style> +</head> +<body> + <p>This test the specificity of :nth-child() with static specificity. The test passes if the text "target" is displayed white on green background. There should be 2 red rects on each side.</p> + <div> + <foo>Not target</foo> + <padding></padding> + <bar>Not target</bar> + <more-padding></more-padding> + <target class="target">Target</target> + <more-padding></more-padding> + <foo>Not target</foo> + <padding></padding> + <bar>Not target</bar> + </div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-2-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-2-ref.html new file mode 100644 index 0000000..1f7d376 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-2-ref.html
@@ -0,0 +1,23 @@ +<!doctype html> +<html> +<head> +<style> + target { + display: block; + margin: 2px; + } +</style> +</head> +<body> + <div> + <target style="background-color: white; color: black; border: none;">Black text on white background.</target> + <target style="background-color: red; color: white; border: 5px solid purple;">White text on red background with a purple border.</target> + <target style="background-color: green; color: red; border: none;">Red text on green background.</target> + <target style="background-color: red; color: white; border: 5px solid purple;">White text on red background with a purple border.</target> + <target style="background-color: white; color: black; border: 5px solid blue;">Black text on white background with a blue border.</target> + <target style="background-color: red; color: white; border: 5px solid purple;">White text on red background with a purple border.</target> + <target style="background-color: green; color: red; border: 5px solid blue;">Red text on green background with a blue border.</target> + <target style="background-color: red; color: white; border: 5px solid purple;">White text on red background with a purple border.</target> + </div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-2.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-2.html new file mode 100644 index 0000000..a467e5e0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-2.html
@@ -0,0 +1,47 @@ +<!doctype html> +<html> +<head> +<title>:nth-child with selector list specificity</title> +<link rel="help" href="https://w3c.github.io/csswg-drafts/selectors-4/#child-index"> +<link rel="match" href="nth-child-specificity-2-ref.html"> +<style> + /* (1, 1, 0) */ + :nth-child(even of .foo, #bar, target) { + background-color: red; + color: white; + border: 5px solid purple; + } + + /* (0, 1, 1) */ + target.foo { + color: red; + } + + /* (0, 2, 0) */ + .foo.foo { + background-color: green; + } + /* (1, 0, 1) */ + target#bar { + border: 5px solid blue; + } + + target { + display: block; + margin: 2px; + } +</style> +</head> +<body> + <div> + <target>Black text on white background.</target> + <target>White text on red background with a purple border.</target> + <target class="foo">Red text on green background.</target> + <target class="foo">White text on red background with a purple border.</target> + <target id="bar">Black text on white background with a blue border.</target> + <target id="bar">White text on red background with a purple border.</target> + <target class="foo" id="bar">Red text on green background with a blue border.</target> + <target class="foo" id="bar">White text on red background with a purple border.</target> + </div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-3-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-3-ref.html new file mode 100644 index 0000000..b13bc50 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-3-ref.html
@@ -0,0 +1,23 @@ +<!doctype html> +<html> +<head> +<style> + target { + display: block; + margin: 2px; + } +</style> +</head> +<body> + <div> + <target>Black text.</target> + <target>Black text.</target> + <target style="color:red; border: 5px solid black;">Red text with black border.</target> + <target style="color:white; background-color:red; border: 5px solid purple;">White text on red background with purple border.</target> + <target style="border: 5px solid blue;">Black text with blue border.</target> + <target style="color:white; background-color:red; border: 5px solid purple;">White text on red background with purple border.</target> + <target style="color:red; background-color:green; border: 5px solid blue;">Red text on green background with blue border.</target> + <target style="color:white; background-color:red; border: 5px solid purple;">White text on red background with purple border.</target> + </div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-3.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-3.html new file mode 100644 index 0000000..f9c23b27 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-3.html
@@ -0,0 +1,51 @@ +<!doctype html> +<html> +<head> +<title>:nth-child with selector list specificity</title> +<link rel="help" href="https://w3c.github.io/csswg-drafts/selectors-4/#child-index"> +<link rel="match" href="nth-child-specificity-3-ref.html"> +<style> + /* (1, 2, 1) */ + :nth-child(even of target.foo, .foo#bar, target.foo#bar, target#bar) { + background-color: red; + color: white; + border: 5px solid purple; + } + + /* (0, 1, 1) */ + target.foo { + color: red; + } + /* (0, 2, 1) */ + target.foo.foo { + border: 5px solid black; + } + + /* (1, 1, 0) */ + .foo#bar { + background-color: green; + } + /* (1, 0, 1) */ + target#bar { + border: 5px solid blue; + } + + target { + display: block; + margin: 2px; + } +</style> +</head> +<body> + <div> + <target>Black text.</target> + <target>Black text.</target> + <target class="foo">Red text with black border.</target> + <target class="foo">White text on red background with purple border.</target> + <target id="bar">Black text with blue border.</target> + <target id="bar">White text on red background with purple border.</target> + <target class="foo" id="bar">Red text on green background with blue border.</target> + <target class="foo" id="bar">White text on red background with purple border.</target> + </div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-4-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-4-ref.html new file mode 100644 index 0000000..b6f26c9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-4-ref.html
@@ -0,0 +1,23 @@ +<!doctype html> +<html> +<head> +<style> + target { + display: block; + margin: 2px; + } +</style> +</head> +<body> + <div> + <target>Black text.</target> + <target>Black text.</target> + <target style="border: 5px solid blue;">Black text with blue border.</target> + <target style="color:white; background-color:red; border: 5px solid purple;">White text on red background with purple border.</target> + <target style="color:red; background-color:green; border: 5px solid blue;">Red text on green background with blue border.</target> + <target style="color:white; background-color:red; border: 5px solid purple;">White text on red background with purple border.</target> + <target style="color:red; border: 5px solid black;">Red text with black border.</target> + <target style="color:white; background-color:red; border: 5px solid purple;">White text on red background with purple border.</target> + </div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-4.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-4.html new file mode 100644 index 0000000..6286b01 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-child-specificity-4.html
@@ -0,0 +1,51 @@ +<!doctype html> +<html> +<head> +<title>:nth-child with selector list specificity</title> +<link rel="help" href="https://w3c.github.io/csswg-drafts/selectors-4/#child-index"> +<link rel="match" href="nth-child-specificity-4-ref.html"> +<style> + /* (1, 2, 1) */ + :nth-child(even of target.foo, .foo#bar, target.foo#bar, target#bar) { + background-color: red; + color: white; + border: 5px solid purple; + } + + /* (0, 1, 1) */ + target.foo { + color: red; + } + /* (0, 2, 1) */ + target.foo.foo { + border: 5px solid black; + } + + /* (1, 1, 0) */ + .foo#bar { + background-color: green; + } + /* (1, 0, 1) */ + target#bar { + border: 5px solid blue; + } + + target { + display: block; + margin: 2px; + } +</style> +</head> +<body> + <div> + <target>Black text.</target> + <target>Black text.</target> + <target id="bar">Black text with blue border.</target> + <target class="foo">White text on red background with purple border.</target> + <target class="foo" id="bar">Red text on green background with blue border.</target> + <target id="bar">White text on red background with purple border.</target> + <target class="foo">Red text with black border.</target> + <target class="foo" id="bar">White text on red background with purple border.</target> + </div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-classname-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-classname-ref.html new file mode 100644 index 0000000..7df68b2a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-classname-ref.html
@@ -0,0 +1,16 @@ +<!doctype html> +<html> +<body> + <p>This test the styling of paragraphs with :nth-last-child(An+B of selector). If the test succeed, paragraphs that say "green" should have a green background.</p> + <p>White</p> + <p>White</p> + <p style="background-color: lime">Green!</p> + <p>White</p> + <p>White</p> + <p>White</p> + <p>White</p> + <p style="background-color: lime">Green!</p> + <p>White</p> + <p>White</p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-classname.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-classname.html new file mode 100644 index 0000000..770fda3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-classname.html
@@ -0,0 +1,26 @@ +<!doctype html> +<html> +<head> +<title>:nth-last-child with .className selector list argument</title> +<link rel="help" href="https://w3c.github.io/csswg-drafts/selectors-4/#child-index"> +<link rel="match" href="nth-last-child-of-classname-ref.html"> +<style> +p:nth-last-child(even of .webkit, .fast) { + background-color: lime; +} +</style> +</head> +<body> + <p>This test the styling of paragraphs with :nth-last-child(An+B of selector). If the test succeed, paragraphs that say "green" should have a green background.</p> + <p>White</p> + <p>White</p> + <p class="webkit">Green!</p> + <p>White</p> + <p>White</p> + <p class="webkit">White</p> + <p>White</p> + <p class="fast">Green!</p> + <p>White</p> + <p class="webkit">White</p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-complex-selector-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-complex-selector-ref.html new file mode 100644 index 0000000..cda1902 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-complex-selector-ref.html
@@ -0,0 +1,14 @@ +<!doctype html> +<html> +<body> + <p>This test the styling of paragraphs with :nth-last-child(An+B of selector). If the test succeed, paragraphs that say "green" should have a green background.</p> + <p style="background-color: lime">Green</p> + <p>White</p> + <p>White</p> + <p>White</p> + <p style="background-color: lime">Green</p> + <p>White</p> + <p>White</p> + <p>White</p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-complex-selector.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-complex-selector.html new file mode 100644 index 0000000..0f1262c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-complex-selector.html
@@ -0,0 +1,24 @@ +<!doctype html> +<html> +<head> +<title>:nth-last-child with complex selector list argument</title> +<link rel="help" href="https://w3c.github.io/csswg-drafts/selectors-4/#child-index"> +<link rel="match" href="nth-last-child-of-complex-selector-ref.html"> +<style> +p:nth-last-child(4n of html:root>body>p+p:not(empty), :not(*), p:not(p), span, .notthere) { + background-color: lime; +} +</style> +</head> +<body> + <p>This test the styling of paragraphs with :nth-last-child(An+B of selector). If the test succeed, paragraphs that say "green" should have a green background.</p> + <p>Green</p> + <p>White</p> + <p>White</p> + <p>White</p> + <p>Green</p> + <p>White</p> + <p>White</p> + <p>White</p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-compound-selector-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-compound-selector-ref.html new file mode 100644 index 0000000..bc5c3ddb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-compound-selector-ref.html
@@ -0,0 +1,19 @@ +<!doctype html> +<html> +<body> + <p>This test the styling of paragraphs with :nth-last-child(An+B of selector). If the test succeed, paragraphs that say "green" should have a green background.</p> + + <p>White!</p> + <p>White!</p> + <p>White!</p> + <p>White!</p> + <p>White!</p> + <p style="background-color: lime">Green</p> + <p>White!</p> + <p>White!</p> + <p>White!</p> + <p>White!</p> + <p>White!</p> + <p></p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-compound-selector.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-compound-selector.html new file mode 100644 index 0000000..a7aa40f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-compound-selector.html
@@ -0,0 +1,29 @@ +<!doctype html> +<html> +<head> +<title>:nth-last-child with compound selector argument</title> +<link rel="help" href="https://w3c.github.io/csswg-drafts/selectors-4/#child-index"> +<link rel="match" href="nth-last-child-of-compound-selector-ref.html"> +<style> +p:nth-last-child(3n+1 of p.foobar:not([class=foobar])) { + background-color: lime; +} +</style> +</head> +<body> + <p>This test the styling of paragraphs with :nth-last-child(An+B of selector). If the test succeed, paragraphs that say "green" should have a green background.</p> + + <p>White!</p> + <p class="foo foobar baz">White!</p> + <p class="foobar">White!</p> + <p class="foo foobar">White!</p> + <p class="foobar">White!</p> + <p class="foobar foo">Green</p> + <p>White!</p> + <p class="foo foobar">White!</p> + <p>White!</p> + <p class="foobar foo">White!</p> + <p class="foobar">White!</p> + <p class="foobar foo"></p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-style-sharing-1-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-style-sharing-1-ref.html new file mode 100644 index 0000000..14ca8e4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-style-sharing-1-ref.html
@@ -0,0 +1,13 @@ +<!doctype html> +<html> +<body> + <p>Test that style-sharing does not ignore cases matching :nth-last-child(An+B of selector list).</p> + <p style="background-color: lime">Target</p> + <p>Target</p> + <p>Target</p> + <p style="background-color: lime">Target</p> + <p>Target</p> + <p>Target</p> + <p style="background-color: lime">Target</p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-style-sharing-1.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-style-sharing-1.html new file mode 100644 index 0000000..de3e263 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-style-sharing-1.html
@@ -0,0 +1,23 @@ +<!doctype html> +<html> +<head> +<title>:nth-last-child correct style-sharing</title> +<link rel="help" href="https://w3c.github.io/csswg-drafts/selectors-4/#child-index"> +<link rel="match" href="nth-last-child-of-style-sharing-1-ref.html"> +<style> +:nth-last-child(3n+1 of .target) { + background-color: lime; +} +</style> +</head> +<body> + <p>Test that style-sharing does not ignore cases matching :nth-last-child(An+B of selector list).</p> + <p class="target">Target</p> + <p class="target">Target</p> + <p class="target">Target</p> + <p class="target">Target</p> + <p class="target">Target</p> + <p class="target">Target</p> + <p class="target">Target</p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-style-sharing-2-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-style-sharing-2-ref.html new file mode 100644 index 0000000..1ef071d5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-style-sharing-2-ref.html
@@ -0,0 +1,15 @@ +<!doctype html> +<html> +<body> + <p>Test that style-sharing does not ignore cases matching :nth-last-child(An+B of selector list).</p> + <p>Target</p> + <p>Target</p> + <p style="background-color: lime">Target</p> + <p>Target</p> + <p>Target</p> + <p style="background-color: lime">Target</p> + <p>Target</p> + <p>Target</p> + <p style="background-color: lime">Target</p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-style-sharing-2.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-style-sharing-2.html new file mode 100644 index 0000000..19fc9af --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-style-sharing-2.html
@@ -0,0 +1,25 @@ +<!doctype html> +<html> +<head> +<title>:nth-last-child correct style-sharing</title> +<link rel="help" href="https://w3c.github.io/csswg-drafts/selectors-4/#child-index"> +<link rel="match" href="nth-last-child-of-style-sharing-2-ref.html"> +<style> +:nth-last-child(3n+1 of .target) { + background-color: lime; +} +</style> +</head> +<body> + <p>Test that style-sharing does not ignore cases matching :nth-last-child(An+B of selector list).</p> + <p class="target">Target</p> + <p class="target">Target</p> + <p class="target">Target</p> + <p class="target">Target</p> + <p class="target">Target</p> + <p class="target">Target</p> + <p class="target">Target</p> + <p class="target">Target</p> + <p class="target">Target</p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-tagname-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-tagname-ref.html new file mode 100644 index 0000000..e0dcc6b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-tagname-ref.html
@@ -0,0 +1,16 @@ +<!doctype html> +<html> +<body> + <p>This test the styling of paragraphs with :nth-last-child(An+B of selector). If the test succeed, paragraphs that say "green" should have a green background.</p> + <p>White!</p> + <webkit>White!</webkit> + <p>White!</p> + <webkit style="background-color: lime">Green</webkit> + <webkit>White!</webkit> + <p>White!</p> + <p>White!</p> + <fast style="background-color: lime">Green</fast> + <p>White!</p> + <p>White!</p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-tagname.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-tagname.html new file mode 100644 index 0000000..ddfd6528c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-of-tagname.html
@@ -0,0 +1,26 @@ +<!doctype html> +<html> +<head> +<title>:nth-last-child with tagname selector list argument</title> +<link rel="help" href="https://w3c.github.io/csswg-drafts/selectors-4/#child-index"> +<link rel="match" href="nth-last-child-of-tagname-ref.html"> +<style> +:nth-last-child(odd of webkit, fast) { + background-color: lime; +} +</style> +</head> +<body> + <p>This test the styling of paragraphs with :nth-last-child(An+B of selector). If the test succeed, paragraphs that say "green" should have a green background.</p> + <p>White!</p> + <webkit>White!</webkit> + <p>White!</p> + <webkit>Green</webkit> + <webkit>White!</webkit> + <p>White!</p> + <p>White!</p> + <fast>Green</fast> + <p>White!</p> + <p>White!</p> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-1-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-1-ref.html new file mode 100644 index 0000000..609279fd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-1-ref.html
@@ -0,0 +1,17 @@ +<!doctype html> +<html> +<body> + <p>This test the specificity of :nth-last-child() with static specificity. The test passes if the text "target" is displayed white on green background. There should be 2 red rects on each side.</p> + <div> + <foo style="color: red; background-color: red;">Not target</foo> + <padding></padding> + <bar style="color: red; background-color: red;">Not target</bar> + <more-padding></more-padding> + <target style="color: white; background-color: green;">Target</target> + <more-padding></more-padding> + <foo style="color: red; background-color: red;">Not target</foo> + <padding></padding> + <bar style="color: red; background-color: red;">Not target</bar> + </div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-1.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-1.html new file mode 100644 index 0000000..cc4f542 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-1.html
@@ -0,0 +1,40 @@ +<!doctype html> +<html> +<head> +<title>:nth-last-child with selector list specificity</title> +<link rel="help" href="https://w3c.github.io/csswg-drafts/selectors-4/#child-index"> +<link rel="match" href="nth-last-child-specificity-1-ref.html"> +<style> + /* The following 3 rules should all have the same specificity when matching <target>. They should be be applied in order. */ + foo:nth-last-child(n), bar:nth-last-child(n), target:nth-last-child(n) { + background-color: red; + color: red; + } + :nth-last-child(3n of foo, bar, target) { + background-color: green; + color: blue; + } + foo.target, bar.target, target.target { + color: white; + } + * { + background-color: white; + color: black; + } +</style> +</head> +<body> + <p>This test the specificity of :nth-last-child() with static specificity. The test passes if the text "target" is displayed white on green background. There should be 2 red rects on each side.</p> + <div> + <foo>Not target</foo> + <padding></padding> + <bar>Not target</bar> + <more-padding></more-padding> + <target class="target">Target</target> + <more-padding></more-padding> + <foo>Not target</foo> + <padding></padding> + <bar>Not target</bar> + </div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-2-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-2-ref.html new file mode 100644 index 0000000..70c44b8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-2-ref.html
@@ -0,0 +1,23 @@ +<!doctype html> +<html> +<head> +<style> + target { + display: block; + margin: 2px; + } +</style> +</head> +<body> + <div> + <target style="background-color: red; color: white; border: 5px solid purple;">White text on red background with a purple border.</target> + <target style="background-color: white; color: black; border: none;">Black text on white background.</target> + <target style="background-color: red; color: white; border: 5px solid purple;">White text on red background with a purple border.</target> + <target style="background-color: green; color: red; border: none;">Red text on green background.</target> + <target style="background-color: red; color: white; border: 5px solid purple;">White text on red background with a purple border.</target> + <target style="background-color: white; color: black; border: 5px solid blue;">Black text on white background with a blue border.</target> + <target style="background-color: red; color: white; border: 5px solid purple;">White text on red background with a purple border.</target> + <target style="background-color: green; color: red; border: 5px solid blue;">Red text on green background with a blue border.</target> + </div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-2.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-2.html new file mode 100644 index 0000000..3ddb43b6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-2.html
@@ -0,0 +1,47 @@ +<!doctype html> +<html> +<head> +<title>:nth-last-child with selector list specificity</title> +<link rel="help" href="https://w3c.github.io/csswg-drafts/selectors-4/#child-index"> +<link rel="match" href="nth-last-child-specificity-2-ref.html"> +<style> + /* (1, 1, 0) */ + :nth-last-child(even of .foo, #bar, target) { + background-color: red; + color: white; + border: 5px solid purple; + } + + /* (0, 1, 1) */ + target.foo { + color: red; + } + + /* (0, 2, 0) */ + .foo.foo { + background-color: green; + } + /* (1, 0, 1) */ + target#bar { + border: 5px solid blue; + } + + target { + display: block; + margin: 2px; + } +</style> +</head> +<body> + <div> + <target>White text on red background with a purple border.</target> + <target>Black text on white background.</target> + <target class="foo">White text on red background with a purple border.</target> + <target class="foo">Red text on green background.</target> + <target id="bar">White text on red background with a purple border.</target> + <target id="bar">Black text on white background with a blue border.</target> + <target class="foo" id="bar">White text on red background with a purple border.</target> + <target class="foo" id="bar">Red text on green background with a blue border.</target> + </div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-3-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-3-ref.html new file mode 100644 index 0000000..8adc397 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-3-ref.html
@@ -0,0 +1,23 @@ +<!doctype html> +<html> +<head> +<style> + target { + display: block; + margin: 2px; + } +</style> +</head> +<body> + <div> + <target>Black text.</target> + <target>Black text.</target> + <target style="color:white; background-color:red; border: 5px solid purple;">White text on red background with purple border.</target> + <target style="color:red; border: 5px solid black;">Red text with black border.</target> + <target style="color:white; background-color:red; border: 5px solid purple;">White text on red background with purple border.</target> + <target style="border: 5px solid blue;">Black text with blue border.</target> + <target style="color:white; background-color:red; border: 5px solid purple;">White text on red background with purple border.</target> + <target style="color:red; background-color:green; border: 5px solid blue;">Red text on green background with blue border.</target> + </div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-3.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-3.html new file mode 100644 index 0000000..673b435 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-3.html
@@ -0,0 +1,51 @@ +<!doctype html> +<html> +<head> +<title>:nth-last-child with selector list specificity</title> +<link rel="help" href="https://w3c.github.io/csswg-drafts/selectors-4/#child-index"> +<link rel="match" href="nth-last-child-specificity-3-ref.html"> +<style> + /* (1, 2, 1) */ + :nth-last-child(even of target.foo, .foo#bar, target.foo#bar, target#bar) { + background-color: red; + color: white; + border: 5px solid purple; + } + + /* (0, 1, 1) */ + target.foo { + color: red; + } + /* (0, 2, 1) */ + target.foo.foo { + border: 5px solid black; + } + + /* (1, 1, 0) */ + .foo#bar { + background-color: green; + } + /* (1, 0, 1) */ + target#bar { + border: 5px solid blue; + } + + target { + display: block; + margin: 2px; + } +</style> +</head> +<body> + <div> + <target>Black text.</target> + <target>Black text.</target> + <target class="foo">White text on red background with purple border.</target> + <target class="foo">Red text with black border.</target> + <target id="bar">White text on red background with purple border.</target> + <target id="bar">Black text with blue border.</target> + <target class="foo" id="bar">White text on red background with purple border.</target> + <target class="foo" id="bar">Red text on green background with blue border.</target> + </div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-4-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-4-ref.html new file mode 100644 index 0000000..f0042d1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-4-ref.html
@@ -0,0 +1,23 @@ +<!doctype html> +<html> +<head> +<style> + target { + display: block; + margin: 2px; + } +</style> +</head> +<body> + <div> + <target>Black text.</target> + <target>Black text.</target> + <target style="color:white; background-color:red; border: 5px solid purple;">White text on red background with purple border.</target> + <target style="border: 5px solid blue;">Black text with blue border.</target> + <target style="color:white; background-color:red; border: 5px solid purple;">White text on red background with purple border.</target> + <target style="color:red; background-color:green; border: 5px solid blue;">Red text on green background with blue border.</target> + <target style="color:white; background-color:red; border: 5px solid purple;">White text on red background with purple border.</target> + <target style="color:red; border: 5px solid black;">Red text with black border.</target> + </div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-4.html b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-4.html new file mode 100644 index 0000000..b690ea2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/nth-last-child-specificity-4.html
@@ -0,0 +1,51 @@ +<!doctype html> +<html> +<head> +<title>:nth-last-child with selector list specificity</title> +<link rel="help" href="https://w3c.github.io/csswg-drafts/selectors-4/#child-index"> +<link rel="match" href="nth-last-child-specificity-4-ref.html"> +<style> + /* (1, 2, 1) */ + :nth-last-child(even of target.foo, .foo#bar, target.foo#bar, target#bar) { + background-color: red; + color: white; + border: 5px solid purple; + } + + /* (0, 1, 1) */ + target.foo { + color: red; + } + /* (0, 2, 1) */ + target.foo.foo { + border: 5px solid black; + } + + /* (1, 1, 0) */ + .foo#bar { + background-color: green; + } + /* (1, 0, 1) */ + target#bar { + border: 5px solid blue; + } + + target { + display: block; + margin: 2px; + } +</style> +</head> +<body> + <div> + <target>Black text.</target> + <target>Black text.</target> + <target class="foo">White text on red background with purple border.</target> + <target id="bar">Black text with blue border.</target> + <target id="bar">White text on red background with purple border.</target> + <target class="foo" id="bar">Red text on green background with blue border.</target> + <target class="foo" id="bar">White text on red background with purple border.</target> + <target class="foo">Red text with black border.</target> + </div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/docs/writing-tests/testdriver.md b/third_party/blink/web_tests/external/wpt/docs/writing-tests/testdriver.md index cc280084..82ad4ff 100644 --- a/third_party/blink/web_tests/external/wpt/docs/writing-tests/testdriver.md +++ b/third_party/blink/web_tests/external/wpt/docs/writing-tests/testdriver.md
@@ -131,9 +131,9 @@ window. For example, in an auxillary browsing context: ```js -testdriver.set_test_context(window.opener) -await testdriver.click(document.getElementsByTagName("button")[0]) -testdriver.message_test("click complete") +test_driver.set_test_context(window.opener) +await test_driver.click(document.getElementsByTagName("button")[0]) +test_driver.message_test("click complete") ``` The requirement to have a handle to the test window does mean it's
diff --git a/third_party/blink/web_tests/external/wpt/editing/crashtests/delete-in-designMode-without-explicitly-setting-focus.html b/third_party/blink/web_tests/external/wpt/editing/crashtests/delete-in-designMode-without-explicitly-setting-focus.html new file mode 100644 index 0000000..16e1808 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/editing/crashtests/delete-in-designMode-without-explicitly-setting-focus.html
@@ -0,0 +1,17 @@ +<!doctype html> +<html> +<head> +<meta charset="utf-8"> +<script> +document.addEventListener("DOMContentLoaded", () => { + const dl = document.querySelector("dl"); + dl.textContent = "�"; + document.designMode = "on"; + document.execCommand("delete"); +}) +</script> +</head> +<del> + <dl></dl> +</del> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/editing/crashtests/inserthorizontalrule-in-textarea-in-editor-and-undo-on-error-events.html b/third_party/blink/web_tests/external/wpt/editing/crashtests/inserthorizontalrule-in-textarea-in-editor-and-undo-on-error-events.html new file mode 100644 index 0000000..204f75a8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/editing/crashtests/inserthorizontalrule-in-textarea-in-editor-and-undo-on-error-events.html
@@ -0,0 +1,31 @@ +<!doctype html> +<html class="test-wait"> +<head> +<meta charset="utf-8"> +<script> +var count = 0; +function onError() { + if (++count > 2) { + document.documentElement.removeAttribute("class"); + return; + } + const object = document.getElementById("a"); + const mi = document.getElementById("b"); + object.data = ""; + object.appendChild(document.getElementById("c")); + mi.appendChild(document.getElementById("c")); + getSelection().collapse(document.getElementById("c"), 0); + document.execCommand("undo"); + document.execCommand("insertHorizontalRule"); +} +</script> +</head> +<body> +<textarea id="c">a</textarea> +<dt contenteditable="true"> +<mi id="b">#</mi> +<object id="a" onerror="onError()"> +</object> +</dt> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/editing/crashtests/normalize_document_at_DOMSubtreeModified_during_insertparagraph.html b/third_party/blink/web_tests/external/wpt/editing/crashtests/normalize_document_at_DOMSubtreeModified_during_insertparagraph.html new file mode 100644 index 0000000..a8cbaf7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/editing/crashtests/normalize_document_at_DOMSubtreeModified_during_insertparagraph.html
@@ -0,0 +1,16 @@ +<!doctype html> +<html> +<head> +<meta charset="utf-8"> +<script> +addEventListener("load", () => { + document.documentElement.innerHTML = "<main>\n>"; + document.addEventListener("DOMSubtreeModified", () => { + document.normalize(); + }, {capture: true}); + document.designMode = "on" + document.execCommand("insertParagraph"); +}); +</script> +</head> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/editing/other/undo-insertparagraph-after-moving-split-nodes-expected.txt b/third_party/blink/web_tests/external/wpt/editing/other/undo-insertparagraph-after-moving-split-nodes-expected.txt new file mode 100644 index 0000000..6f8b410 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/editing/other/undo-insertparagraph-after-moving-split-nodes-expected.txt
@@ -0,0 +1,7 @@ +This is a testharness.js-based test. +FAIL Undo insertParagraph after moving right node to different paragraph promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL Undo insertParagraph after moving left node to different paragraph promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL Undo insertParagraph after moving right node into the left node promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL Undo insertParagraph after moving left node into the right node promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/editing/other/undo-insertparagraph-after-moving-split-nodes.html b/third_party/blink/web_tests/external/wpt/editing/other/undo-insertparagraph-after-moving-split-nodes.html new file mode 100644 index 0000000..c61bcff9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/editing/other/undo-insertparagraph-after-moving-split-nodes.html
@@ -0,0 +1,109 @@ +<!doctype html> +<html> +<head> +<meta charset="utf-8"> +<meta name="timeout" content="long"> +<title>Undo after splitting nodes are moved</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/testdriver-actions.js"></script> +<script src="../include/editor-test-utils.js"></script> +</head> +<body> +<div contenteditable></div> +<script> +"use strict"; + +document.execCommand("defaultParagraphSeparator", false, "div"); +const utils = + new EditorTestUtils(document.querySelector("div[contenteditable]")); + +promise_test(async t => { + utils.setupEditingHost( + `<div>abc[]def</div><p>ghi</p>` + ); + await utils.sendEnterKey(); + const right = utils.editingHost.querySelector("div + div"); + utils.editingHost.appendChild(right); + // Now, the right <div> is after the <p>, it should be merged into the left + // <div> before the <p>. + document.execCommand("undo"); + assert_in_array( + utils.editingHost.innerHTML, + [ + "<div>abcdef</div><p>ghi</p>", + "<div>abcdef<br></div><p>ghi</p>", + ] + ); +}, "Undo insertParagraph after moving right node to different paragraph"); + +promise_test(async () => { + utils.setupEditingHost( + `<p>abc</p><div>def[]ghi</div>` + ); + await utils.sendEnterKey(); + const left = utils.editingHost.querySelector("div"); + utils.editingHost.insertBefore(left, document.querySelector("p")); + // Now, the left <div> is before the <p>, the right <div> after the <p> should + // be merged into it. + document.execCommand("undo"); + assert_in_array( + utils.editingHost.innerHTML, + [ + "<div>defghi</div><p>abc</p>", + "<div>defghi<br></div><p>abc</p>", + ] + ); +}, "Undo insertParagraph after moving left node to different paragraph"); + +promise_test(async () => { + utils.setupEditingHost( + `<div>abc[]def</div>` + ); + await utils.sendEnterKey(); + const left = utils.editingHost.querySelector("div"); + const right = utils.editingHost.querySelector("div + div"); + left.insertBefore(right, left.firstChild); + // Now, the right <div> is a child node of the left <div>. Its children + // should be merged to the parent. + document.execCommand("undo"); + assert_in_array( + utils.editingHost.innerHTML, + [ + "<div>abcdef</div>", + "<div>abcdef<br></div>", + ] + ); +}, "Undo insertParagraph after moving right node into the left node"); + +promise_test(async () => { + utils.setupEditingHost( + `<div>abc[]def</div>` + ); + await utils.sendEnterKey(); + const left = utils.editingHost.querySelector("div"); + const right = utils.editingHost.querySelector("div + div"); + right.appendChild(left); + // Now, the right <div> is parent of the left <div>. The children of the + // right <div> should be moved to the child left <div>, but the right <div> + // should be removed. + document.execCommand("undo"); + assert_equals( + utils.editingHost.innerHTML, + "", + "The right <div> containing the left <div> should be removed" + ); + assert_in_array( + left.innerHTML, + [ + "abcdef", + "abcdef<br>", + ], + "The left <div> which was disconnected should have the original content" + ); +}, "Undo insertParagraph after moving left node into the right node"); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/headers/headers-basic.any-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/api/headers/headers-basic.any-expected.txt new file mode 100644 index 0000000..bc7e6fb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/api/headers/headers-basic.any-expected.txt
@@ -0,0 +1,26 @@ +This is a testharness.js-based test. +PASS Create headers from no parameter +PASS Create headers from undefined parameter +PASS Create headers from empty object +PASS Create headers with null should throw +PASS Create headers with 1 should throw +PASS Create headers with sequence +PASS Create headers with record +PASS Create headers with existing headers +PASS Create headers with existing headers with custom iterator +PASS Check append method +PASS Check set method +PASS Check has method +PASS Check delete method +PASS Check get method +PASS Check keys method +PASS Check values method +PASS Check entries method +PASS Check Symbol.iterator method +PASS Check forEach method +FAIL Iteration skips elements removed while iterating assert_array_equals: lengths differ, expected array ["bar", "baz"] length 2, got ["bar", "baz", "foo"] length 3 +FAIL Removing elements already iterated over causes an element to be skipped during iteration assert_array_equals: lengths differ, expected array ["bar", "baz", "quux"] length 3, got ["bar", "baz", "foo", "quux"] length 4 +FAIL Appending a value pair during iteration causes it to be reached during iteration assert_array_equals: lengths differ, expected array ["bar", "baz", "foo", "quux", "x-yz"] length 5, got ["bar", "baz", "foo", "quux"] length 4 +FAIL Prepending a value pair before the current element position causes it to be skipped during iteration and adds the current element a second time assert_array_equals: lengths differ, expected array ["bar", "baz", "baz", "foo", "quux"] length 5, got ["bar", "baz", "foo", "quux"] length 4 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/headers/headers-basic.any.js b/third_party/blink/web_tests/external/wpt/fetch/api/headers/headers-basic.any.js index 398ddcf..ead1047 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/api/headers/headers-basic.any.js +++ b/third_party/blink/web_tests/external/wpt/fetch/api/headers/headers-basic.any.js
@@ -218,3 +218,58 @@ }); assert_true(reference.next().done); }, "Check forEach method"); + +test(() => { + const headers = new Headers({"foo": "2", "baz": "1", "BAR": "0"}); + const actualKeys = []; + const actualValues = []; + for (const [header, value] of headers) { + actualKeys.push(header); + actualValues.push(value); + headers.delete("foo"); + } + assert_array_equals(actualKeys, ["bar", "baz"]); + assert_array_equals(actualValues, ["0", "1"]); +}, "Iteration skips elements removed while iterating"); + +test(() => { + const headers = new Headers({"foo": "2", "baz": "1", "BAR": "0", "quux": "3"}); + const actualKeys = []; + const actualValues = []; + for (const [header, value] of headers) { + actualKeys.push(header); + actualValues.push(value); + if (header === "baz") + headers.delete("bar"); + } + assert_array_equals(actualKeys, ["bar", "baz", "quux"]); + assert_array_equals(actualValues, ["0", "1", "3"]); +}, "Removing elements already iterated over causes an element to be skipped during iteration"); + +test(() => { + const headers = new Headers({"foo": "2", "baz": "1", "BAR": "0", "quux": "3"}); + const actualKeys = []; + const actualValues = []; + for (const [header, value] of headers) { + actualKeys.push(header); + actualValues.push(value); + if (header === "baz") + headers.append("X-yZ", "4"); + } + assert_array_equals(actualKeys, ["bar", "baz", "foo", "quux", "x-yz"]); + assert_array_equals(actualValues, ["0", "1", "2", "3", "4"]); +}, "Appending a value pair during iteration causes it to be reached during iteration"); + +test(() => { + const headers = new Headers({"foo": "2", "baz": "1", "BAR": "0", "quux": "3"}); + const actualKeys = []; + const actualValues = []; + for (const [header, value] of headers) { + actualKeys.push(header); + actualValues.push(value); + if (header === "baz") + headers.append("abc", "-1"); + } + assert_array_equals(actualKeys, ["bar", "baz", "baz", "foo", "quux"]); + assert_array_equals(actualValues, ["0", "1", "1", "2", "3"]); +}, "Prepending a value pair before the current element position causes it to be skipped during iteration and adds the current element a second time");
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/headers/headers-basic.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/api/headers/headers-basic.any.serviceworker-expected.txt new file mode 100644 index 0000000..bc7e6fb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/api/headers/headers-basic.any.serviceworker-expected.txt
@@ -0,0 +1,26 @@ +This is a testharness.js-based test. +PASS Create headers from no parameter +PASS Create headers from undefined parameter +PASS Create headers from empty object +PASS Create headers with null should throw +PASS Create headers with 1 should throw +PASS Create headers with sequence +PASS Create headers with record +PASS Create headers with existing headers +PASS Create headers with existing headers with custom iterator +PASS Check append method +PASS Check set method +PASS Check has method +PASS Check delete method +PASS Check get method +PASS Check keys method +PASS Check values method +PASS Check entries method +PASS Check Symbol.iterator method +PASS Check forEach method +FAIL Iteration skips elements removed while iterating assert_array_equals: lengths differ, expected array ["bar", "baz"] length 2, got ["bar", "baz", "foo"] length 3 +FAIL Removing elements already iterated over causes an element to be skipped during iteration assert_array_equals: lengths differ, expected array ["bar", "baz", "quux"] length 3, got ["bar", "baz", "foo", "quux"] length 4 +FAIL Appending a value pair during iteration causes it to be reached during iteration assert_array_equals: lengths differ, expected array ["bar", "baz", "foo", "quux", "x-yz"] length 5, got ["bar", "baz", "foo", "quux"] length 4 +FAIL Prepending a value pair before the current element position causes it to be skipped during iteration and adds the current element a second time assert_array_equals: lengths differ, expected array ["bar", "baz", "baz", "foo", "quux"] length 5, got ["bar", "baz", "foo", "quux"] length 4 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/headers/headers-basic.any.sharedworker-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/api/headers/headers-basic.any.sharedworker-expected.txt new file mode 100644 index 0000000..bc7e6fb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/api/headers/headers-basic.any.sharedworker-expected.txt
@@ -0,0 +1,26 @@ +This is a testharness.js-based test. +PASS Create headers from no parameter +PASS Create headers from undefined parameter +PASS Create headers from empty object +PASS Create headers with null should throw +PASS Create headers with 1 should throw +PASS Create headers with sequence +PASS Create headers with record +PASS Create headers with existing headers +PASS Create headers with existing headers with custom iterator +PASS Check append method +PASS Check set method +PASS Check has method +PASS Check delete method +PASS Check get method +PASS Check keys method +PASS Check values method +PASS Check entries method +PASS Check Symbol.iterator method +PASS Check forEach method +FAIL Iteration skips elements removed while iterating assert_array_equals: lengths differ, expected array ["bar", "baz"] length 2, got ["bar", "baz", "foo"] length 3 +FAIL Removing elements already iterated over causes an element to be skipped during iteration assert_array_equals: lengths differ, expected array ["bar", "baz", "quux"] length 3, got ["bar", "baz", "foo", "quux"] length 4 +FAIL Appending a value pair during iteration causes it to be reached during iteration assert_array_equals: lengths differ, expected array ["bar", "baz", "foo", "quux", "x-yz"] length 5, got ["bar", "baz", "foo", "quux"] length 4 +FAIL Prepending a value pair before the current element position causes it to be skipped during iteration and adds the current element a second time assert_array_equals: lengths differ, expected array ["bar", "baz", "baz", "foo", "quux"] length 5, got ["bar", "baz", "foo", "quux"] length 4 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/headers/headers-basic.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/api/headers/headers-basic.any.worker-expected.txt new file mode 100644 index 0000000..bc7e6fb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/api/headers/headers-basic.any.worker-expected.txt
@@ -0,0 +1,26 @@ +This is a testharness.js-based test. +PASS Create headers from no parameter +PASS Create headers from undefined parameter +PASS Create headers from empty object +PASS Create headers with null should throw +PASS Create headers with 1 should throw +PASS Create headers with sequence +PASS Create headers with record +PASS Create headers with existing headers +PASS Create headers with existing headers with custom iterator +PASS Check append method +PASS Check set method +PASS Check has method +PASS Check delete method +PASS Check get method +PASS Check keys method +PASS Check values method +PASS Check entries method +PASS Check Symbol.iterator method +PASS Check forEach method +FAIL Iteration skips elements removed while iterating assert_array_equals: lengths differ, expected array ["bar", "baz"] length 2, got ["bar", "baz", "foo"] length 3 +FAIL Removing elements already iterated over causes an element to be skipped during iteration assert_array_equals: lengths differ, expected array ["bar", "baz", "quux"] length 3, got ["bar", "baz", "foo", "quux"] length 4 +FAIL Appending a value pair during iteration causes it to be reached during iteration assert_array_equals: lengths differ, expected array ["bar", "baz", "foo", "quux", "x-yz"] length 5, got ["bar", "baz", "foo", "quux"] length 4 +FAIL Prepending a value pair before the current element position causes it to be skipped during iteration and adds the current element a second time assert_array_equals: lengths differ, expected array ["bar", "baz", "baz", "foo", "quux"] length 5, got ["bar", "baz", "foo", "quux"] length 4 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/resources/helper.js b/third_party/blink/web_tests/external/wpt/fetch/metadata/resources/helper.js index 608a5297..725f9a7e 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/resources/helper.js +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/resources/helper.js
@@ -40,20 +40,3 @@ test(t => assert_equals(value.site, expected.site), `${tag}: sec-fetch-site`); test(t => assert_equals(value.user, expected.user), `${tag}: sec-fetch-user`); } - -/** - * @param {object} value - * @param {string} tag - **/ -function assert_no_headers(value, tag) { - if (typeof(value) === "string"){ - if (value == "No header has been recorded") return; - value = JSON.parse(value); - } - - test(t => assert_equals(value.mode, ""), `${tag}: sec-fetch-mode`); - test(t => assert_equals(value.site, ""), `${tag}: sec-fetch-site`); - if (expected.hasOwnProperty("user")) - test(t => assert_equals(value.user, ""), `${tag}: sec-fetch-user`); - test(t => assert_equals(value.dest, ""), `${tag}: sec-fetch-dest`); -}
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/compute-pressure.idl b/third_party/blink/web_tests/external/wpt/interfaces/compute-pressure.idl index e855b30c..ae409fc 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/compute-pressure.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/compute-pressure.idl
@@ -28,11 +28,12 @@ [Exposed=Window] static Promise<PermissionState> requestPermission(); }; -dictionary PressureRecord { - PressureSource source; - PressureState state; - sequence<PressureFactor> factors; - DOMHighResTimeStamp time; +[Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext] +interface PressureRecord { + readonly attribute PressureSource source; + readonly attribute PressureState state; + readonly attribute FrozenArray<PressureFactor> factors; + readonly attribute DOMHighResTimeStamp time; }; dictionary PressureObserverOptions {
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/css-shared-element-transitions.idl b/third_party/blink/web_tests/external/wpt/interfaces/css-view-transitions.idl similarity index 66% rename from third_party/blink/web_tests/external/wpt/interfaces/css-shared-element-transitions.idl rename to third_party/blink/web_tests/external/wpt/interfaces/css-view-transitions.idl index da2e9e4..26c2e30 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/css-shared-element-transitions.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/css-view-transitions.idl
@@ -1,20 +1,20 @@ // GENERATED CONTENT - DO NOT EDIT // Content was automatically extracted by Reffy into webref // (https://github.com/w3c/webref) -// Source: CSS Shared Element Transitions Module Level 1 (https://drafts.csswg.org/css-shared-element-transitions-1/) +// Source: CSS View Transitions Module Level 1 (https://drafts.csswg.org/css-view-transitions-1/) partial interface Document { - DOMTransition createTransition(DOMTransitionInit init); + ViewTransition createTransition(ViewTransitionInit init); }; -dictionary DOMTransitionInit { +dictionary ViewTransitionInit { required UpdateDOMCallback updateDOM; }; callback UpdateDOMCallback = Promise<any> (); [Exposed=Window] -interface DOMTransition { +interface ViewTransition { undefined skipTransition(); readonly attribute Promise<undefined> finished; readonly attribute Promise<undefined> ready;
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/fs.idl b/third_party/blink/web_tests/external/wpt/interfaces/fs.idl index 0bda456..ee058692 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/fs.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/fs.idl
@@ -75,7 +75,7 @@ }; dictionary FileSystemReadWriteOptions { - [EnforceRange] required unsigned long long at; + [EnforceRange] unsigned long long at = 0; }; [Exposed=DedicatedWorker, SecureContext]
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/screen-capture.idl b/third_party/blink/web_tests/external/wpt/interfaces/screen-capture.idl index 908fce2..b8bd4652 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/screen-capture.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/screen-capture.idl
@@ -31,7 +31,7 @@ dictionary DisplayMediaStreamOptions { (boolean or MediaTrackConstraints) video = true; (boolean or MediaTrackConstraints) audio = false; - CaptureController controller = null; + CaptureController controller; SelfCapturePreferenceEnum selfBrowserSurface; SystemAudioPreferenceEnum systemAudio; SurfaceSwitchingPreferenceEnum surfaceSwitching;
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/webauthn.idl b/third_party/blink/web_tests/external/wpt/interfaces/webauthn.idl index 03a6230..d35ebbf 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/webauthn.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/webauthn.idl
@@ -125,6 +125,7 @@ [SameObject] readonly attribute ArrayBuffer authenticatorData; [SameObject] readonly attribute ArrayBuffer signature; [SameObject] readonly attribute ArrayBuffer? userHandle; + [SameObject] readonly attribute ArrayBuffer? attestationObject; }; dictionary PublicKeyCredentialParameters { @@ -143,6 +144,7 @@ sequence<PublicKeyCredentialDescriptor> excludeCredentials = []; AuthenticatorSelectionCriteria authenticatorSelection; DOMString attestation = "none"; + sequence<DOMString> attestationFormats = []; AuthenticationExtensionsClientInputs extensions; }; @@ -190,6 +192,8 @@ USVString rpId; sequence<PublicKeyCredentialDescriptor> allowCredentials = []; DOMString userVerification = "preferred"; + DOMString attestation = "none"; + sequence<DOMString> attestationFormats = []; AuthenticationExtensionsClientInputs extensions; }; @@ -325,3 +329,21 @@ partial dictionary AuthenticationExtensionsClientOutputs { UvmEntries uvm; }; + +dictionary AuthenticationExtensionsDevicePublicKeyInputs { + DOMString attestation = "none"; + sequence<DOMString> attestationFormats = []; +}; + +partial dictionary AuthenticationExtensionsClientInputs { + AuthenticationExtensionsDevicePublicKeyInputs devicePubKey; +}; + +dictionary AuthenticationExtensionsDevicePublicKeyOutputs { + ArrayBuffer authenticatorOutput; + ArrayBuffer signature; +}; + +partial dictionary AuthenticationExtensionsClientOutputs { + AuthenticationExtensionsDevicePublicKeyOutputs devicePubKey; +};
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/webcodecs.idl b/third_party/blink/web_tests/external/wpt/interfaces/webcodecs.idl index 4854d96..b92dd9d 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/webcodecs.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/webcodecs.idl
@@ -206,7 +206,7 @@ callback WebCodecsErrorCallback = undefined(DOMException error); -[Exposed=(Window,DedicatedWorker)] +[Exposed=(Window,DedicatedWorker), Serializable] interface EncodedAudioChunk { constructor(EncodedAudioChunkInit init); readonly attribute EncodedAudioChunkType type; @@ -229,7 +229,7 @@ "delta", }; -[Exposed=(Window,DedicatedWorker)] +[Exposed=(Window,DedicatedWorker), Serializable] interface EncodedVideoChunk { constructor(EncodedVideoChunkInit init); readonly attribute EncodedVideoChunkType type; @@ -244,7 +244,7 @@ required EncodedVideoChunkType type; [EnforceRange] required long long timestamp; // microseconds [EnforceRange] unsigned long long duration; // microseconds - required BufferSource data; + required [AllowShared] BufferSource data; }; enum EncodedVideoChunkType {
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/webrtc-stats.idl b/third_party/blink/web_tests/external/wpt/interfaces/webrtc-stats.idl index ec80449..237c7e47 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/webrtc-stats.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/webrtc-stats.idl
@@ -42,7 +42,6 @@ unsigned long long packetsReceived; long long packetsLost; double jitter; - unsigned long framesDropped; }; dictionary RTCInboundRtpStreamStats : RTCReceivedRtpStreamStats { @@ -52,6 +51,7 @@ DOMString remoteId; unsigned long framesDecoded; unsigned long keyFramesDecoded; + unsigned long framesDropped; unsigned long frameWidth; unsigned long frameHeight; double framesPerSecond; @@ -59,6 +59,10 @@ double totalDecodeTime; double totalInterFrameDelay; double totalSquaredInterFrameDelay; + unsigned long pauseCount; + double totalPausesDuration; + unsigned long freezeCount; + double totalFreezesDuration; DOMHighResTimeStamp lastPacketReceivedTimestamp; unsigned long long headerBytesReceived; unsigned long long packetsDiscarded; @@ -87,6 +91,8 @@ DOMString decoderImplementation; DOMString playoutId; boolean powerEfficientDecoder; + unsigned long framesAssembledFromMultiplePackets; + double totalAssemblyTime; }; dictionary RTCRemoteInboundRtpStreamStats : RTCReceivedRtpStreamStats { @@ -231,6 +237,11 @@ long priority; DOMString url; RTCIceServerTransportProtocol relayProtocol; + DOMString foundation; + DOMString relatedAddress; + long relatedPort; + DOMString usernameFragment; + RTCIceTcpCandidateType tcpType; }; dictionary RTCIceCandidatePairStats : RTCStats {
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/webtransport.idl b/third_party/blink/web_tests/external/wpt/interfaces/webtransport.idl index ed21e2c..1aa5a51 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/webtransport.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/webtransport.idl
@@ -113,8 +113,8 @@ [Exposed=(Window,Worker), SecureContext] interface WebTransportBidirectionalStream { - readonly attribute ReadableStream readable; - readonly attribute WritableStream writable; + readonly attribute WebTransportReceiveStream readable; + readonly attribute WebTransportSendStream writable; }; [Exposed=(Window,Worker), SecureContext]
diff --git a/third_party/blink/web_tests/external/wpt/permissions/non-fully-active.https-expected.txt b/third_party/blink/web_tests/external/wpt/permissions/non-fully-active.https-expected.txt new file mode 100644 index 0000000..cf5b4c0a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions/non-fully-active.https-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +FAIL Trying to query() a non-fully active document rejects with a InvalidStateError promise_rejects_dom: must reject in the right global when the document is not fully active function "function() { throw e }" threw object "TypeError: Failed to execute 'query' on 'Permissions': Failed to read the 'name' property from 'PermissionDescriptor': The provided value 'whatever' is not a valid enum value of type PermissionName." that is not a DOMException InvalidStateError: property "code" is equal to undefined, expected 11 +PASS Permission change events shouldn't fire on non-fully active document +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/permissions/non-fully-active.https.html b/third_party/blink/web_tests/external/wpt/permissions/non-fully-active.https.html new file mode 100644 index 0000000..1c11afa --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions/non-fully-active.https.html
@@ -0,0 +1,108 @@ +<!DOCTYPE html> +<meta charset="utf-8" /> +<title>Geolocation Test: non-fully active document</title> +<link rel="help" href="https://github.com/w3c/permissions/pull/365" /> +<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> +<body></body> +<script> + // Creates the iframe, wait for it to load... + async function attachIframe() { + const iframe = document.createElement("iframe"); + await new Promise((resolve) => { + iframe.src = "resources/empty.html"; + iframe.addEventListener("load", resolve, { once: true }); + document.body.appendChild(iframe); + }); + return iframe; + } + + promise_test(async (t) => { + const iframe = await attachIframe(); + + // Steal the needed references + const { permissions } = iframe.contentWindow.navigator; + const TypeErrorCtor = iframe.contentWindow.TypeError; + const DOMExceptionCtor = iframe.contentWindow.DOMException; + + // Let's check that ordering is correct. + await promise_rejects_js( + t, + TypeErrorCtor, + permissions.query({ name: "xxxxx-not-supported" }), + "query() should reject if the feature is not supported" + ); + + // no longer fully active, let's try that again... + iframe.remove(); + + // Now, let's try with Geolocation as it's supported by all browsers. + await promise_rejects_dom( + t, + "InvalidStateError", + DOMExceptionCtor, + permissions.query({ name: "whatever" }), + "must reject in the right global when the document is not fully active" + ); + + // Re-attach, and go back to fully active. + document.body.appendChild(iframe); + await new Promise((resolve) => + iframe.addEventListener("load", resolve, { once: true }) + ); + + // And we are back to fully active, so this should not reject. + const status = await iframe.contentWindow.navigator.permissions.query({ + name: "geolocation", + }); + assert_equals(status.name, "geolocation"); + iframe.remove(); + }, "Trying to query() a non-fully active document rejects with a InvalidStateError"); + + promise_test(async (t) => { + // Create the iframe, wait for it to load... + const iframe = await attachIframe(); + + // Get the status + const initialStatus = + await iframe.contentWindow.navigator.permissions.query({ + name: "geolocation", + }); + + assert_true("onchange" in initialStatus, "onchange is supported"); + + // Let's check events are firing... + await new Promise(async (resolve) => { + const newState = initialStatus.state === "prompt" ? "denied" : "granted"; + initialStatus.addEventListener("change", resolve, { once: true }); + await test_driver.set_permission({ name: "geolocation" }, newState); + }); + + // No longer fully active... + iframe.remove(); + + await new Promise(async (resolve, reject) => { + // Gets dropped on the floor. + initialStatus.addEventListener("change", reject, { once: true }); + await test_driver.set_permission({ name: "geolocation" }, "prompt"); + // Try to force it synthetically. This would trigger the event synchronously. + initialStatus.dispatchEvent(new Event("change")); + resolve(); + }); + + // Re-attach, and go back to fully active. + document.body.appendChild(iframe); + await new Promise((resolve) => + iframe.addEventListener("load", resolve, { once: true }) + ); + + // Finally, let's recheck that permission state. + const finalStatus = await iframe.contentWindow.navigator.permissions.query({ + name: "geolocation", + }); + assert_equals(finalStatus.state, "prompt", "expected prompt state"); + iframe.remove(); + }, "Permission change events shouldn't fire on non-fully active document"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions/resources/empty.html b/third_party/blink/web_tests/external/wpt/permissions/resources/empty.html new file mode 100644 index 0000000..b0653f8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions/resources/empty.html
@@ -0,0 +1,3 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Just a support file</title>
diff --git a/third_party/blink/web_tests/external/wpt/resources/testdriver.js b/third_party/blink/web_tests/external/wpt/resources/testdriver.js index 3474a33..d23f9fb 100644 --- a/third_party/blink/web_tests/external/wpt/resources/testdriver.js +++ b/third_party/blink/web_tests/external/wpt/resources/testdriver.js
@@ -677,7 +677,7 @@ return Promise.reject(new Error("unimplemented")); }, - delete_named_cookie: function(name, context=null) { + get_named_cookie: function(name, context=null) { return Promise.reject(new Error("unimplemented")); },
diff --git a/third_party/blink/web_tests/external/wpt/screen-orientation/nested-documents-expected.txt b/third_party/blink/web_tests/external/wpt/screen-orientation/nested-documents-expected.txt new file mode 100644 index 0000000..a8d359c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/screen-orientation/nested-documents-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +FAIL Requesting orientation lock from one document cancels the lock request from another document assert_unreached: Should have rejected: undefined Reached unreachable code +FAIL The orientation lock from one document affects lock requests from other documents assert_unreached: Should have rejected: Expected request to lock orientation from iframe 0 to abort Reached unreachable code +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/screen-orientation/nested-documents.html b/third_party/blink/web_tests/external/wpt/screen-orientation/nested-documents.html new file mode 100644 index 0000000..efaed9c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/screen-orientation/nested-documents.html
@@ -0,0 +1,85 @@ +<!DOCTYPE html> +<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> +<body> + <script type="module"> + import { + attachIframe, + makeCleanup, + getOppositeOrientation, + } from "./resources/orientation-utils.js"; + + promise_test(async (t) => { + t.add_cleanup(makeCleanup()); + const iframe = await attachIframe(); + const iframeWin = iframe.contentWindow; + + // Go full screen + await test_driver.bless("request full screen"); + await iframe.contentDocument.documentElement.requestFullscreen(); + + // Lock the orientation from the iframe + const opposite = getOppositeOrientation(); + const iframePromise = iframeWin.screen.orientation.lock(opposite); + + // Calling lock() from top-level will cancel the iframe's promise + const topPromise = window.screen.orientation.lock(opposite); + await promise_rejects_dom( + t, + "AbortError", + iframeWin.DOMException, + iframePromise + ); + await topPromise; + }, "Requesting orientation lock from one document cancels the lock request from another document"); + + promise_test(async (t) => { + t.add_cleanup(makeCleanup()); + // Create 3 nested iframes + const src = "/screen-orientation/resources/empty.html"; + const outerIframe = await attachIframe({ src: `${src}#1` }); + const innerIframe = await attachIframe({ + context: outerIframe.contentWindow, + src: `${src}#2`, + }); + + const iframes = [outerIframe, innerIframe]; + + // Go full screen + await test_driver.bless("request full screen"); + await innerIframe.contentDocument.documentElement.requestFullscreen(); + const opposite = getOppositeOrientation(); + + // Each iframe tries to lock the orientation + const requestToLock = iframes.map((iframe) => { + return { + promise: iframe.contentWindow.screen.orientation.lock(opposite), + context: iframe.contentWindow, + }; + }); + + // But calling lock() from top-level will aborts all iframe's promises + const topPromise = window.screen.orientation.lock(opposite); + + // Check that all promises are rejected with AbortError + const abortedPromises = []; + for (let i = 0; i < requestToLock.length; i++) { + const { promise, context } = requestToLock[i]; + const p = promise_rejects_dom( + t, + "AbortError", + context.DOMException, + promise, + `Expected request to lock orientation from iframe ${i} to abort` + ); + abortedPromises.push(p); + } + await Promise.all(abortedPromises); + + // Finally, top-level promise resolves + await topPromise; + }, "The orientation lock from one document affects lock requests from other documents"); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/screen-orientation/non-fully-active.html b/third_party/blink/web_tests/external/wpt/screen-orientation/non-fully-active.html index 61066eb..2590442 100644 --- a/third_party/blink/web_tests/external/wpt/screen-orientation/non-fully-active.html +++ b/third_party/blink/web_tests/external/wpt/screen-orientation/non-fully-active.html
@@ -4,19 +4,11 @@ <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> <body> -<script> - async function attachIFrame() { - const iframe = document.createElement("iframe"); - document.body.appendChild(iframe); - await new Promise((resolve) => { - iframe.onload = resolve; - iframe.src = "about:blank"; - }); - return iframe; - } +<script type="module"> + import { attachIframe } from "./resources/orientation-utils.js"; promise_test(async (t) => { - const iframe = await attachIFrame(); + const iframe = await attachIframe(); const { orientation } = iframe.contentWindow.screen; const opposite = orientation.type.startsWith("portrait") ? "landscape" @@ -34,7 +26,7 @@ }, "Attempting to lock non-fully active documents results in a InvalidStateError"); promise_test(async (t) => { - const iframe = await attachIFrame(); + const iframe = await attachIframe(); const { orientation } = iframe.contentWindow.screen; const frameDOMException = iframe.contentWindow.DOMException; @@ -44,7 +36,7 @@ }, "Attempting to unlock non-fully active documents results in a InvalidStateError"); promise_test(async (t) => { - const iframe = await attachIFrame(); + const iframe = await attachIframe(); const { orientation } = iframe.contentWindow.screen; const opposite = orientation.type.startsWith("portrait")
diff --git a/third_party/blink/web_tests/external/wpt/screen-orientation/resources/orientation-utils.js b/third_party/blink/web_tests/external/wpt/screen-orientation/resources/orientation-utils.js index f2fb045f..22831589 100644 --- a/third_party/blink/web_tests/external/wpt/screen-orientation/resources/orientation-utils.js +++ b/third_party/blink/web_tests/external/wpt/screen-orientation/resources/orientation-utils.js
@@ -1,22 +1,33 @@ -export async function loadIframe(src = "/screen-orientation/resources/blank.html") { - const iframe = document.createElement("iframe"); - iframe.src = src; - document.body.appendChild(iframe); - return new Promise(r => { - if (iframe.contentDocument.readyState === "complete") { - return r(iframe); - } - iframe.onload = () => r(iframe); +/** + * + * @param {object} options + * @param {string} options.src - The iframe src + * @param {Window} options.context - The browsing context in which the iframe will be created + * @returns + */ +export async function attachIframe(options = {}) { + const { src, context } = { + ...{ src: "about:blank", context: self }, + ...options, + }; + const iframe = context.document.createElement("iframe"); + await new Promise((resolve) => { + iframe.onload = resolve; + iframe.src = src; + context.document.body.appendChild(iframe); }); + return iframe; } export function getOppositeOrientation() { - const { type: currentOrientation } = screen.orientation; - const isPortrait = currentOrientation.includes("portrait"); - return isPortrait ? "landscape" : "portrait"; + return screen.orientation.type.startsWith("portrait") + ? "landscape" + : "portrait"; } -export function makeCleanup(initialOrientation = screen.orientation?.type.split(/-/)[0]) { +export function makeCleanup( + initialOrientation = screen.orientation?.type.split(/-/)[0] +) { return async () => { if (initialOrientation) { await screen.orientation.lock(initialOrientation); @@ -25,5 +36,5 @@ requestAnimationFrame(async () => { await document.exitFullscreen(); }); - } + }; }
diff --git a/third_party/blink/web_tests/external/wpt/webauthn/idlharness.https.window-expected.txt b/third_party/blink/web_tests/external/wpt/webauthn/idlharness.https.window-expected.txt index 594cc25..475986c5 100644 --- a/third_party/blink/web_tests/external/wpt/webauthn/idlharness.https.window-expected.txt +++ b/third_party/blink/web_tests/external/wpt/webauthn/idlharness.https.window-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 82 tests; 79 PASS, 3 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 87 tests; 83 PASS, 4 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS idl_test setup PASS idl_test validation PASS Partial dictionary CredentialCreationOptions: original dictionary defined @@ -36,6 +36,10 @@ PASS Partial dictionary AuthenticationExtensionsClientInputs[6]: member names are unique PASS Partial dictionary AuthenticationExtensionsClientOutputs[6]: original dictionary defined PASS Partial dictionary AuthenticationExtensionsClientOutputs[6]: member names are unique +PASS Partial dictionary AuthenticationExtensionsClientInputs[7]: original dictionary defined +PASS Partial dictionary AuthenticationExtensionsClientInputs[7]: member names are unique +PASS Partial dictionary AuthenticationExtensionsClientOutputs[7]: original dictionary defined +PASS Partial dictionary AuthenticationExtensionsClientOutputs[7]: member names are unique PASS Partial dictionary CredentialRequestOptions[2]: member names are unique PASS Partial dictionary CredentialCreationOptions[2]: member names are unique PASS Partial dictionary CredentialRequestOptions[3]: member names are unique @@ -82,5 +86,6 @@ PASS AuthenticatorAssertionResponse interface: attribute authenticatorData PASS AuthenticatorAssertionResponse interface: attribute signature PASS AuthenticatorAssertionResponse interface: attribute userHandle +FAIL AuthenticatorAssertionResponse interface: attribute attestationObject assert_true: The prototype object must have a property "attestationObject" expected true got false Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any-expected.txt b/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any-expected.txt index d3ff6ff3..31a77c9 100644 --- a/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any-expected.txt +++ b/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any-expected.txt
@@ -1,6 +1,6 @@ This is a testharness.js-based test. -Found 389 tests; 164 PASS, 225 FAIL, 0 TIMEOUT, 0 NOTRUN. -FAIL idl_test setup promise_test: Unhandled rejection with value: object "TypeError: Failed to construct 'MLGraphBuilder': parameter 1 is not of type 'MLContext'." +Found 389 tests; 163 PASS, 226 FAIL, 0 TIMEOUT, 0 NOTRUN. +FAIL idl_test setup assert_unreached: navigator.ml.createContext returned a Promise Reached unreachable code PASS idl_test validation PASS Partial interface MLContext: original interface defined PASS Partial interface MLContext: member names are unique @@ -127,12 +127,12 @@ PASS MLContext interface: member compute FAIL MLContext interface: operation computeAsync(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) assert_own_property: interface prototype object missing non-static operation expected property "computeAsync" missing FAIL MLContext interface: operation createCommandEncoder() assert_own_property: interface prototype object missing non-static operation expected property "createCommandEncoder" missing -FAIL MLContext must be primary interface of context assert_equals: context's prototype is not MLContext.prototype expected object "[object MLContext]" but got object "[object Promise]" -FAIL Stringification of context assert_class_string: class string of context expected "[object MLContext]" but got "[object Promise]" -PASS MLContext interface: context must not have property "compute" -FAIL MLContext interface: context must inherit property "computeAsync(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)" with the proper type assert_inherits: property "computeAsync" not found in prototype chain -FAIL MLContext interface: calling computeAsync(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) on context with too few arguments must throw TypeError assert_inherits: property "computeAsync" not found in prototype chain -FAIL MLContext interface: context must inherit property "createCommandEncoder()" with the proper type assert_inherits: property "createCommandEncoder" not found in prototype chain +FAIL MLContext must be primary interface of context assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: context is not defined" +FAIL Stringification of context assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: context is not defined" +FAIL MLContext interface: context must not have property "compute" assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: context is not defined" +FAIL MLContext interface: context must inherit property "computeAsync(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: context is not defined" +FAIL MLContext interface: calling computeAsync(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) on context with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: context is not defined" +FAIL MLContext interface: context must inherit property "createCommandEncoder()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: context is not defined" PASS MLOperand interface: existence and properties of interface object PASS MLOperand interface object length PASS MLOperand interface object name
diff --git a/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any.js index ffb50118..5f53831 100644 --- a/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any.js +++ b/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any.js
@@ -35,7 +35,15 @@ } for (const deviceType of DeviceTypeArray) { - self.context = navigator.ml.createContext({deviceType}); + const context = navigator.ml.createContext({deviceType}); + // Per spec navigator.ml.createContext should return a MLContext, but + // in Chromium it returns a Promise<MLContext>. Fail the setup if this + // happens, since the tests wouldn't make sense. + if (context instanceof Promise) { + context.catch(() => {}); + assert_unreached('navigator.ml.createContext returned a Promise'); + } + self.context = context; self.builder = new MLGraphBuilder(context); self.input = builder.input('input', {type: 'float32', dimensions: [1, 1, 5, 5]}); self.filter = builder.constant({type: 'float32', dimensions: [1, 1, 3, 3]}, new Float32Array(9).fill(1));
diff --git a/third_party/blink/web_tests/external/wpt/webrtc-stats/supported-stats-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/webrtc-stats/supported-stats-expected.txt similarity index 91% rename from third_party/blink/web_tests/external/wpt/webrtc-stats/supported-stats-expected.txt rename to third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/webrtc-stats/supported-stats-expected.txt index a1cbb24..da29e15 100644 --- a/third_party/blink/web_tests/external/wpt/webrtc-stats/supported-stats-expected.txt +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/webrtc-stats/supported-stats-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 245 tests; 215 PASS, 30 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 260 tests; 226 PASS, 34 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS getStats succeeds PASS Validating stats PASS codec's payloadType @@ -17,6 +17,7 @@ PASS inbound-rtp's remoteId PASS inbound-rtp's framesDecoded PASS inbound-rtp's keyFramesDecoded +PASS inbound-rtp's framesDropped PASS inbound-rtp's frameWidth PASS inbound-rtp's frameHeight PASS inbound-rtp's framesPerSecond @@ -24,6 +25,10 @@ PASS inbound-rtp's totalDecodeTime PASS inbound-rtp's totalInterFrameDelay PASS inbound-rtp's totalSquaredInterFrameDelay +PASS inbound-rtp's pauseCount +PASS inbound-rtp's totalPausesDuration +PASS inbound-rtp's freezeCount +PASS inbound-rtp's totalFreezesDuration PASS inbound-rtp's lastPacketReceivedTimestamp PASS inbound-rtp's headerBytesReceived PASS inbound-rtp's packetsDiscarded @@ -52,10 +57,11 @@ PASS inbound-rtp's decoderImplementation FAIL inbound-rtp's playoutId assert_true: Is playoutId present expected true got false FAIL inbound-rtp's powerEfficientDecoder assert_true: Is powerEfficientDecoder present expected true got false +PASS inbound-rtp's framesAssembledFromMultiplePackets +PASS inbound-rtp's totalAssemblyTime PASS inbound-rtp's packetsReceived PASS inbound-rtp's packetsLost PASS inbound-rtp's jitter -PASS inbound-rtp's framesDropped PASS inbound-rtp's ssrc PASS inbound-rtp's transportId PASS inbound-rtp's codecId @@ -107,7 +113,6 @@ FAIL remote-inbound-rtp's packetsReceived assert_true: Is packetsReceived present expected true got false PASS remote-inbound-rtp's packetsLost PASS remote-inbound-rtp's jitter -FAIL remote-inbound-rtp's framesDropped assert_true: Is framesDropped present expected true got false PASS remote-inbound-rtp's ssrc PASS remote-inbound-rtp's kind PASS remote-inbound-rtp's transportId @@ -224,6 +229,11 @@ PASS local-candidate's priority FAIL local-candidate's url assert_true: Is url present expected true got false FAIL local-candidate's relayProtocol assert_true: Is relayProtocol present expected true got false +PASS local-candidate's foundation +FAIL local-candidate's relatedAddress assert_true: Is relatedAddress present expected true got false +FAIL local-candidate's relatedPort assert_true: Is relatedPort present expected true got false +PASS local-candidate's usernameFragment +PASS local-candidate's tcpType PASS local-candidate's timestamp PASS local-candidate's type PASS local-candidate's id @@ -235,6 +245,11 @@ PASS remote-candidate's priority FAIL remote-candidate's url assert_true: Is url present expected true got false FAIL remote-candidate's relayProtocol assert_true: Is relayProtocol present expected true got false +PASS remote-candidate's foundation +FAIL remote-candidate's relatedAddress assert_true: Is relatedAddress present expected true got false +FAIL remote-candidate's relatedPort assert_true: Is relatedPort present expected true got false +PASS remote-candidate's usernameFragment +FAIL remote-candidate's tcpType assert_true: Is tcpType present expected true got false PASS remote-candidate's timestamp PASS remote-candidate's type PASS remote-candidate's id
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/compositing/lots-of-img-layers-with-opacity-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/compositing/lots-of-img-layers-with-opacity-expected.png new file mode 100644 index 0000000..73166da --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/highdpi/compositing/lots-of-img-layers-with-opacity-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/compositing/perpendicular-layer-sorting-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/compositing/perpendicular-layer-sorting-expected.png new file mode 100644 index 0000000..786ecac --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/highdpi/compositing/perpendicular-layer-sorting-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png new file mode 100644 index 0000000..0e9205c --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/highdpi/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/lots-of-img-layers-with-opacity-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/lots-of-img-layers-with-opacity-expected.png new file mode 100644 index 0000000..73166da --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/lots-of-img-layers-with-opacity-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/perpendicular-layer-sorting-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/perpendicular-layer-sorting-expected.png new file mode 100644 index 0000000..786ecac --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/perpendicular-layer-sorting-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/sub-pixel/transformed-iframe-copy-on-scroll-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/fast/sub-pixel/transformed-iframe-copy-on-scroll-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/sub-pixel/transformed-iframe-copy-on-scroll-expected.png rename to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/fast/sub-pixel/transformed-iframe-copy-on-scroll-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png new file mode 100644 index 0000000..0e9205c --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/lots-of-img-layers-with-opacity-expected.png b/third_party/blink/web_tests/platform/linux/compositing/lots-of-img-layers-with-opacity-expected.png index 73166da..05cc07b 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/lots-of-img-layers-with-opacity-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/lots-of-img-layers-with-opacity-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/webrtc-stats/supported-stats-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/webrtc-stats/supported-stats-expected.txt similarity index 90% copy from third_party/blink/web_tests/external/wpt/webrtc-stats/supported-stats-expected.txt copy to third_party/blink/web_tests/platform/linux/external/wpt/webrtc-stats/supported-stats-expected.txt index a1cbb24..fad37c1d 100644 --- a/third_party/blink/web_tests/external/wpt/webrtc-stats/supported-stats-expected.txt +++ b/third_party/blink/web_tests/platform/linux/external/wpt/webrtc-stats/supported-stats-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 245 tests; 215 PASS, 30 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 260 tests; 225 PASS, 35 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS getStats succeeds PASS Validating stats PASS codec's payloadType @@ -17,6 +17,7 @@ PASS inbound-rtp's remoteId PASS inbound-rtp's framesDecoded PASS inbound-rtp's keyFramesDecoded +PASS inbound-rtp's framesDropped PASS inbound-rtp's frameWidth PASS inbound-rtp's frameHeight PASS inbound-rtp's framesPerSecond @@ -24,6 +25,10 @@ PASS inbound-rtp's totalDecodeTime PASS inbound-rtp's totalInterFrameDelay PASS inbound-rtp's totalSquaredInterFrameDelay +PASS inbound-rtp's pauseCount +PASS inbound-rtp's totalPausesDuration +PASS inbound-rtp's freezeCount +PASS inbound-rtp's totalFreezesDuration PASS inbound-rtp's lastPacketReceivedTimestamp PASS inbound-rtp's headerBytesReceived PASS inbound-rtp's packetsDiscarded @@ -52,10 +57,11 @@ PASS inbound-rtp's decoderImplementation FAIL inbound-rtp's playoutId assert_true: Is playoutId present expected true got false FAIL inbound-rtp's powerEfficientDecoder assert_true: Is powerEfficientDecoder present expected true got false +PASS inbound-rtp's framesAssembledFromMultiplePackets +PASS inbound-rtp's totalAssemblyTime PASS inbound-rtp's packetsReceived PASS inbound-rtp's packetsLost PASS inbound-rtp's jitter -PASS inbound-rtp's framesDropped PASS inbound-rtp's ssrc PASS inbound-rtp's transportId PASS inbound-rtp's codecId @@ -107,7 +113,6 @@ FAIL remote-inbound-rtp's packetsReceived assert_true: Is packetsReceived present expected true got false PASS remote-inbound-rtp's packetsLost PASS remote-inbound-rtp's jitter -FAIL remote-inbound-rtp's framesDropped assert_true: Is framesDropped present expected true got false PASS remote-inbound-rtp's ssrc PASS remote-inbound-rtp's kind PASS remote-inbound-rtp's transportId @@ -224,6 +229,11 @@ PASS local-candidate's priority FAIL local-candidate's url assert_true: Is url present expected true got false FAIL local-candidate's relayProtocol assert_true: Is relayProtocol present expected true got false +PASS local-candidate's foundation +FAIL local-candidate's relatedAddress assert_true: Is relatedAddress present expected true got false +FAIL local-candidate's relatedPort assert_true: Is relatedPort present expected true got false +PASS local-candidate's usernameFragment +FAIL local-candidate's tcpType assert_true: Is tcpType present expected true got false PASS local-candidate's timestamp PASS local-candidate's type PASS local-candidate's id @@ -235,6 +245,11 @@ PASS remote-candidate's priority FAIL remote-candidate's url assert_true: Is url present expected true got false FAIL remote-candidate's relayProtocol assert_true: Is relayProtocol present expected true got false +PASS remote-candidate's foundation +FAIL remote-candidate's relatedAddress assert_true: Is relatedAddress present expected true got false +FAIL remote-candidate's relatedPort assert_true: Is relatedPort present expected true got false +PASS remote-candidate's usernameFragment +FAIL remote-candidate's tcpType assert_true: Is tcpType present expected true got false PASS remote-candidate's timestamp PASS remote-candidate's type PASS remote-candidate's id
diff --git a/third_party/blink/web_tests/platform/linux/fast/sub-pixel/transformed-iframe-copy-on-scroll-expected.png b/third_party/blink/web_tests/platform/linux/fast/sub-pixel/transformed-iframe-copy-on-scroll-expected.png index 64f2ff1..cd8565e 100644 --- a/third_party/blink/web_tests/platform/linux/fast/sub-pixel/transformed-iframe-copy-on-scroll-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/sub-pixel/transformed-iframe-copy-on-scroll-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png b/third_party/blink/web_tests/platform/linux/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png index 0e9205c..fecce9b 100644 --- a/third_party/blink/web_tests/platform/linux/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png +++ b/third_party/blink/web_tests/platform/linux/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/compute-pressure/external/wpt/compute-pressure/idlharness.https.window-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/compute-pressure/external/wpt/compute-pressure/idlharness.https.window-expected.txt new file mode 100644 index 0000000..a4567ee7 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/compute-pressure/external/wpt/compute-pressure/idlharness.https.window-expected.txt
@@ -0,0 +1,37 @@ +This is a testharness.js-based test. +PASS idl_test setup +PASS idl_test validation +PASS PressureObserver interface: existence and properties of interface object +PASS PressureObserver interface object length +PASS PressureObserver interface object name +PASS PressureObserver interface: existence and properties of interface prototype object +PASS PressureObserver interface: existence and properties of interface prototype object's "constructor" property +PASS PressureObserver interface: existence and properties of interface prototype object's @@unscopables property +PASS PressureObserver interface: operation observe(PressureSource) +PASS PressureObserver interface: operation unobserve(PressureSource) +PASS PressureObserver interface: operation disconnect() +PASS PressureObserver interface: operation takeRecords() +PASS PressureObserver interface: attribute supportedSources +FAIL PressureObserver interface: operation requestPermission() assert_own_property: interface object missing static operation expected property "requestPermission" missing +PASS PressureObserver must be primary interface of observer +PASS Stringification of observer +PASS PressureObserver interface: observer must inherit property "observe(PressureSource)" with the proper type +PASS PressureObserver interface: calling observe(PressureSource) on observer with too few arguments must throw TypeError +PASS PressureObserver interface: observer must inherit property "unobserve(PressureSource)" with the proper type +PASS PressureObserver interface: calling unobserve(PressureSource) on observer with too few arguments must throw TypeError +PASS PressureObserver interface: observer must inherit property "disconnect()" with the proper type +PASS PressureObserver interface: observer must inherit property "takeRecords()" with the proper type +PASS PressureObserver interface: observer must inherit property "supportedSources" with the proper type +PASS PressureObserver interface: observer must inherit property "requestPermission()" with the proper type +FAIL PressureRecord interface: existence and properties of interface object assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing +FAIL PressureRecord interface object length assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing +FAIL PressureRecord interface object name assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing +FAIL PressureRecord interface: existence and properties of interface prototype object assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing +FAIL PressureRecord interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing +FAIL PressureRecord interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing +FAIL PressureRecord interface: attribute source assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing +FAIL PressureRecord interface: attribute state assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing +FAIL PressureRecord interface: attribute factors assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing +FAIL PressureRecord interface: attribute time assert_own_property: self does not have own property "PressureRecord" expected property "PressureRecord" missing +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/lots-of-img-layers-with-opacity-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/lots-of-img-layers-with-opacity-expected.png index 38f4c4af..19152cc 100644 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/lots-of-img-layers-with-opacity-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/lots-of-img-layers-with-opacity-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/lots-of-img-layers-with-opacity-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/lots-of-img-layers-with-opacity-expected.png index 38f4c4af..19152cc 100644 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/lots-of-img-layers-with-opacity-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/lots-of-img-layers-with-opacity-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/perspective-interest-rect-expected.png b/third_party/blink/web_tests/platform/mac/compositing/perspective-interest-rect-expected.png index 6e644bb..27339b5 100644 --- a/third_party/blink/web_tests/platform/mac/compositing/perspective-interest-rect-expected.png +++ b/third_party/blink/web_tests/platform/mac/compositing/perspective-interest-rect-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/webrtc-stats/supported-stats-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/webrtc-stats/supported-stats-expected.txt similarity index 90% copy from third_party/blink/web_tests/external/wpt/webrtc-stats/supported-stats-expected.txt copy to third_party/blink/web_tests/platform/mac/external/wpt/webrtc-stats/supported-stats-expected.txt index a1cbb24..fad37c1d 100644 --- a/third_party/blink/web_tests/external/wpt/webrtc-stats/supported-stats-expected.txt +++ b/third_party/blink/web_tests/platform/mac/external/wpt/webrtc-stats/supported-stats-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 245 tests; 215 PASS, 30 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 260 tests; 225 PASS, 35 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS getStats succeeds PASS Validating stats PASS codec's payloadType @@ -17,6 +17,7 @@ PASS inbound-rtp's remoteId PASS inbound-rtp's framesDecoded PASS inbound-rtp's keyFramesDecoded +PASS inbound-rtp's framesDropped PASS inbound-rtp's frameWidth PASS inbound-rtp's frameHeight PASS inbound-rtp's framesPerSecond @@ -24,6 +25,10 @@ PASS inbound-rtp's totalDecodeTime PASS inbound-rtp's totalInterFrameDelay PASS inbound-rtp's totalSquaredInterFrameDelay +PASS inbound-rtp's pauseCount +PASS inbound-rtp's totalPausesDuration +PASS inbound-rtp's freezeCount +PASS inbound-rtp's totalFreezesDuration PASS inbound-rtp's lastPacketReceivedTimestamp PASS inbound-rtp's headerBytesReceived PASS inbound-rtp's packetsDiscarded @@ -52,10 +57,11 @@ PASS inbound-rtp's decoderImplementation FAIL inbound-rtp's playoutId assert_true: Is playoutId present expected true got false FAIL inbound-rtp's powerEfficientDecoder assert_true: Is powerEfficientDecoder present expected true got false +PASS inbound-rtp's framesAssembledFromMultiplePackets +PASS inbound-rtp's totalAssemblyTime PASS inbound-rtp's packetsReceived PASS inbound-rtp's packetsLost PASS inbound-rtp's jitter -PASS inbound-rtp's framesDropped PASS inbound-rtp's ssrc PASS inbound-rtp's transportId PASS inbound-rtp's codecId @@ -107,7 +113,6 @@ FAIL remote-inbound-rtp's packetsReceived assert_true: Is packetsReceived present expected true got false PASS remote-inbound-rtp's packetsLost PASS remote-inbound-rtp's jitter -FAIL remote-inbound-rtp's framesDropped assert_true: Is framesDropped present expected true got false PASS remote-inbound-rtp's ssrc PASS remote-inbound-rtp's kind PASS remote-inbound-rtp's transportId @@ -224,6 +229,11 @@ PASS local-candidate's priority FAIL local-candidate's url assert_true: Is url present expected true got false FAIL local-candidate's relayProtocol assert_true: Is relayProtocol present expected true got false +PASS local-candidate's foundation +FAIL local-candidate's relatedAddress assert_true: Is relatedAddress present expected true got false +FAIL local-candidate's relatedPort assert_true: Is relatedPort present expected true got false +PASS local-candidate's usernameFragment +FAIL local-candidate's tcpType assert_true: Is tcpType present expected true got false PASS local-candidate's timestamp PASS local-candidate's type PASS local-candidate's id @@ -235,6 +245,11 @@ PASS remote-candidate's priority FAIL remote-candidate's url assert_true: Is url present expected true got false FAIL remote-candidate's relayProtocol assert_true: Is relayProtocol present expected true got false +PASS remote-candidate's foundation +FAIL remote-candidate's relatedAddress assert_true: Is relatedAddress present expected true got false +FAIL remote-candidate's relatedPort assert_true: Is relatedPort present expected true got false +PASS remote-candidate's usernameFragment +FAIL remote-candidate's tcpType assert_true: Is tcpType present expected true got false PASS remote-candidate's timestamp PASS remote-candidate's type PASS remote-candidate's id
diff --git a/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png b/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png index 34fca42..42e91d5 100644 --- a/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png +++ b/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-origins-expected.png b/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-origins-expected.png index dd8e5ba..ba6645b 100644 --- a/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-origins-expected.png +++ b/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-origins-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png b/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png index 4ffef74..156535b 100644 --- a/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png +++ b/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/perspective-interest-rect-expected.png b/third_party/blink/web_tests/platform/win/compositing/perspective-interest-rect-expected.png index 3f9b61bd5..1d9711d32 100644 --- a/third_party/blink/web_tests/platform/win/compositing/perspective-interest-rect-expected.png +++ b/third_party/blink/web_tests/platform/win/compositing/perspective-interest-rect-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/webrtc-stats/supported-stats-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webrtc-stats/supported-stats-expected.txt similarity index 91% copy from third_party/blink/web_tests/external/wpt/webrtc-stats/supported-stats-expected.txt copy to third_party/blink/web_tests/platform/win/external/wpt/webrtc-stats/supported-stats-expected.txt index a1cbb24..da29e15 100644 --- a/third_party/blink/web_tests/external/wpt/webrtc-stats/supported-stats-expected.txt +++ b/third_party/blink/web_tests/platform/win/external/wpt/webrtc-stats/supported-stats-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 245 tests; 215 PASS, 30 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 260 tests; 226 PASS, 34 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS getStats succeeds PASS Validating stats PASS codec's payloadType @@ -17,6 +17,7 @@ PASS inbound-rtp's remoteId PASS inbound-rtp's framesDecoded PASS inbound-rtp's keyFramesDecoded +PASS inbound-rtp's framesDropped PASS inbound-rtp's frameWidth PASS inbound-rtp's frameHeight PASS inbound-rtp's framesPerSecond @@ -24,6 +25,10 @@ PASS inbound-rtp's totalDecodeTime PASS inbound-rtp's totalInterFrameDelay PASS inbound-rtp's totalSquaredInterFrameDelay +PASS inbound-rtp's pauseCount +PASS inbound-rtp's totalPausesDuration +PASS inbound-rtp's freezeCount +PASS inbound-rtp's totalFreezesDuration PASS inbound-rtp's lastPacketReceivedTimestamp PASS inbound-rtp's headerBytesReceived PASS inbound-rtp's packetsDiscarded @@ -52,10 +57,11 @@ PASS inbound-rtp's decoderImplementation FAIL inbound-rtp's playoutId assert_true: Is playoutId present expected true got false FAIL inbound-rtp's powerEfficientDecoder assert_true: Is powerEfficientDecoder present expected true got false +PASS inbound-rtp's framesAssembledFromMultiplePackets +PASS inbound-rtp's totalAssemblyTime PASS inbound-rtp's packetsReceived PASS inbound-rtp's packetsLost PASS inbound-rtp's jitter -PASS inbound-rtp's framesDropped PASS inbound-rtp's ssrc PASS inbound-rtp's transportId PASS inbound-rtp's codecId @@ -107,7 +113,6 @@ FAIL remote-inbound-rtp's packetsReceived assert_true: Is packetsReceived present expected true got false PASS remote-inbound-rtp's packetsLost PASS remote-inbound-rtp's jitter -FAIL remote-inbound-rtp's framesDropped assert_true: Is framesDropped present expected true got false PASS remote-inbound-rtp's ssrc PASS remote-inbound-rtp's kind PASS remote-inbound-rtp's transportId @@ -224,6 +229,11 @@ PASS local-candidate's priority FAIL local-candidate's url assert_true: Is url present expected true got false FAIL local-candidate's relayProtocol assert_true: Is relayProtocol present expected true got false +PASS local-candidate's foundation +FAIL local-candidate's relatedAddress assert_true: Is relatedAddress present expected true got false +FAIL local-candidate's relatedPort assert_true: Is relatedPort present expected true got false +PASS local-candidate's usernameFragment +PASS local-candidate's tcpType PASS local-candidate's timestamp PASS local-candidate's type PASS local-candidate's id @@ -235,6 +245,11 @@ PASS remote-candidate's priority FAIL remote-candidate's url assert_true: Is url present expected true got false FAIL remote-candidate's relayProtocol assert_true: Is relayProtocol present expected true got false +PASS remote-candidate's foundation +FAIL remote-candidate's relatedAddress assert_true: Is relatedAddress present expected true got false +FAIL remote-candidate's relatedPort assert_true: Is relatedPort present expected true got false +PASS remote-candidate's usernameFragment +FAIL remote-candidate's tcpType assert_true: Is tcpType present expected true got false PASS remote-candidate's timestamp PASS remote-candidate's type PASS remote-candidate's id
diff --git a/third_party/blink/web_tests/platform/win/fast/sub-pixel/transformed-iframe-copy-on-scroll-expected.png b/third_party/blink/web_tests/platform/win/fast/sub-pixel/transformed-iframe-copy-on-scroll-expected.png index efd71c08..fd582ec 100644 --- a/third_party/blink/web_tests/platform/win/fast/sub-pixel/transformed-iframe-copy-on-scroll-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/sub-pixel/transformed-iframe-copy-on-scroll-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png b/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png index 89795bb..9205868f 100644 --- a/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png +++ b/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png b/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png index e1aadda..47ca428 100644 --- a/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png +++ b/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/compute-pressure/external/wpt/compute-pressure/idlharness.https.window-expected.txt b/third_party/blink/web_tests/platform/win/virtual/compute-pressure/external/wpt/compute-pressure/idlharness.https.window-expected.txt new file mode 100644 index 0000000..4d3c7af --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/compute-pressure/external/wpt/compute-pressure/idlharness.https.window-expected.txt
@@ -0,0 +1,27 @@ +This is a testharness.js-based test. +PASS idl_test setup +PASS idl_test validation +PASS PressureObserver interface: existence and properties of interface object +PASS PressureObserver interface object length +PASS PressureObserver interface object name +PASS PressureObserver interface: existence and properties of interface prototype object +PASS PressureObserver interface: existence and properties of interface prototype object's "constructor" property +PASS PressureObserver interface: existence and properties of interface prototype object's @@unscopables property +PASS PressureObserver interface: operation observe(PressureSource) +PASS PressureObserver interface: operation unobserve(PressureSource) +PASS PressureObserver interface: operation disconnect() +PASS PressureObserver interface: operation takeRecords() +PASS PressureObserver interface: attribute supportedSources +FAIL PressureObserver interface: operation requestPermission() assert_own_property: interface object missing static operation expected property "requestPermission" missing +PASS PressureObserver must be primary interface of observer +PASS Stringification of observer +PASS PressureObserver interface: observer must inherit property "observe(PressureSource)" with the proper type +PASS PressureObserver interface: calling observe(PressureSource) on observer with too few arguments must throw TypeError +PASS PressureObserver interface: observer must inherit property "unobserve(PressureSource)" with the proper type +PASS PressureObserver interface: calling unobserve(PressureSource) on observer with too few arguments must throw TypeError +PASS PressureObserver interface: observer must inherit property "disconnect()" with the proper type +PASS PressureObserver interface: observer must inherit property "takeRecords()" with the proper type +PASS PressureObserver interface: observer must inherit property "supportedSources" with the proper type +PASS PressureObserver interface: observer must inherit property "requestPermission()" with the proper type +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-mix-computed-expected.txt b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-computed-color-mix-function-expected.txt similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-mix-computed-expected.txt rename to third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-computed-color-mix-function-expected.txt
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 deleted file mode 100644 index da359f0..0000000 --- a/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-contrast-computed-expected.txt +++ /dev/null
@@ -1,25 +0,0 @@ -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 deleted file mode 100644 index bcfcf80..0000000 --- a/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-contrast-valid-expected.txt +++ /dev/null
@@ -1,25 +0,0 @@ -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-invalid-color-mix-function-expected.txt b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-invalid-color-mix-function-expected.txt new file mode 100644 index 0000000..c2f3261 --- /dev/null +++ b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-invalid-color-mix-function-expected.txt
@@ -0,0 +1,132 @@ +This is a testharness.js-based test. +PASS e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) -10%, hsl(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 150%, hsl(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 0%, hsl(30deg 30% 40%) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% 40%) -10%, hsl(30deg 30% 40% 80%))" should not set the property value +PASS e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% 40%) 150%, hsl(30deg 30% 40% 80%))" should not set the property value +PASS e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% 40%) 0%, hsl(30deg 30% 40% 80%) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in hsl hue, hsl(120deg 10% 20%), hsl(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hsl shorter, hsl(120deg 10% 20%), hsl(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hsl foo, hsl(120deg 10% 20%), hsl(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hsl hsl(120deg 10% 20%), hsl(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) hsl(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(hsl(120deg 10% 20%), hsl(30deg 30% 40%), in hsl)" should not set the property value +PASS e.style['color'] = "color-mix(hsl(120deg 10% 20%), hsl(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) -10%, hwb(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) 150%, hwb(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) 0%, hwb(30deg 30% 40%) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% 40%) -10%, hwb(30deg 30% 40% 80%))" should not set the property value +PASS e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% 40%) 150%, hwb(30deg 30% 40% 80%))" should not set the property value +PASS e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% 40%) 0%, hwb(30deg 30% 40% 80%) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in hwb hue, hwb(120deg 10% 20%), hwb(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hwb shorter, hwb(120deg 10% 20%), hwb(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hwb foo, hwb(120deg 10% 20%), hwb(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hwb hwb(120deg 10% 20%), hwb(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) hwb(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(hwb(120deg 10% 20%), hwb(30deg 30% 40%), in hwb)" should not set the property value +PASS e.style['color'] = "color-mix(hwb(120deg 10% 20%), hwb(30deg 30% 40%))" should not set the property value +PASS e.style['color'] = "color-mix(in lch, lch(10% 20 30deg) -10%, lch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in lch, lch(10% 20 30deg) 150%, lch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in lch, lch(10% 20 30deg) 0%, lch(50% 60 70deg) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in lch, lch(10% 20 30deg / .4) -10%, lch(50% 60 70deg / .8))" should not set the property value +PASS e.style['color'] = "color-mix(in lch, lch(10% 20 30deg / .4) 150%, lch(50% 60 70deg / .8))" should not set the property value +PASS e.style['color'] = "color-mix(in lch, lch(10% 20 30deg / .4) 0%, lch(50% 60 70deg / .8) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in lch hue, lch(10% 20 30deg), lch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in lch shorter, lch(10% 20 30deg), lch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in lch foo, lch(10% 20 30deg), lch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in lch lch(10% 20 30deg), lch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in lch, lch(10% 20 30deg) lch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(lch(10% 20 30deg), lch(50% 60 70deg), in lch)" should not set the property value +PASS e.style['color'] = "color-mix(lch(10% 20 30deg), lch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg) -10%, oklch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg) 150%, oklch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg) 0%, oklch(50% 60 70deg) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg / .4) -10%, oklch(50% 60 70deg / .8))" should not set the property value +PASS e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg / .4) 150%, oklch(50% 60 70deg / .8))" should not set the property value +PASS e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg / .4) 0%, oklch(50% 60 70deg / .8) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in oklch hue, oklch(10% 20 30deg), oklch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in oklch shorter, oklch(10% 20 30deg), oklch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in oklch foo, oklch(10% 20 30deg), oklch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in oklch oklch(10% 20 30deg), oklch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg) oklch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(oklch(10% 20 30deg), oklch(50% 60 70deg), in oklch)" should not set the property value +PASS e.style['color'] = "color-mix(oklch(10% 20 30deg), oklch(50% 60 70deg))" should not set the property value +PASS e.style['color'] = "color-mix(in lab, lab(10% 20 30) -10%, lab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(in lab, lab(10% 20 30) 150%, lab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(in lab, lab(10% 20 30) 0%, lab(50% 60 70) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in lab, lab(10% 20 30 / .4) -10%, lab(50% 60 70 / .8))" should not set the property value +PASS e.style['color'] = "color-mix(in lab, lab(10% 20 30 / .4) 150%, lab(50% 60 70 / .8))" should not set the property value +PASS e.style['color'] = "color-mix(in lab, lab(10% 20 30 / .4) 0%, lab(50% 60 70 / .8) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in lab longer hue, lab(10% 20 30), lab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(in lab lab(10% 20 30), lab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(in lab, lab(10% 20 30) lab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(lab(10% 20 30), lab(50% 60 70), in lab)" should not set the property value +PASS e.style['color'] = "color-mix(lab(10% 20 30), lab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(in oklab, oklab(10% 20 30) -10%, oklab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(in oklab, oklab(10% 20 30) 150%, oklab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(in oklab, oklab(10% 20 30) 0%, oklab(50% 60 70) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in oklab, oklab(10% 20 30 / .4) -10%, oklab(50% 60 70 / .8))" should not set the property value +PASS e.style['color'] = "color-mix(in oklab, oklab(10% 20 30 / .4) 150%, oklab(50% 60 70 / .8))" should not set the property value +PASS e.style['color'] = "color-mix(in oklab, oklab(10% 20 30 / .4) 0%, oklab(50% 60 70 / .8) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in oklab longer hue, oklab(10% 20 30), oklab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(in oklab oklab(10% 20 30), oklab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(in oklab, oklab(10% 20 30) oklab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(oklab(10% 20 30), oklab(50% 60 70), in oklab)" should not set the property value +PASS e.style['color'] = "color-mix(oklab(10% 20 30), oklab(50% 60 70))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) -10%, color(srgb .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) 150%, color(srgb .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) 0%, color(srgb .5 .6 .7) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) -10%, color(srgb .5 .6 .7 / .8))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 150%, color(srgb .5 .6 .7 / .8))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 0%, color(srgb .5 .6 .7 / .8) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in srgb longer hue, color(srgb .1 .2 .3), color(srgb .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb color(srgb .1 .2 .3), color(srgb .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) color(srgb .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(color(srgb .1 .2 .3), color(srgb .5 .6 .7), in srgb)" should not set the property value +PASS e.style['color'] = "color-mix(color(srgb .1 .2 .3), color(srgb .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) -10%, color(srgb-linear .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 150%, color(srgb-linear .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 0%, color(srgb-linear .5 .6 .7) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) -10%, color(srgb-linear .5 .6 .7 / .8))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 150%, color(srgb-linear .5 .6 .7 / .8))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 0%, color(srgb-linear .5 .6 .7 / .8) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in srgb-linear longer hue, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb-linear color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) color(srgb-linear .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7), in srgb-linear)" should not set the property value +PASS e.style['color'] = "color-mix(color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) -10%, color(xyz .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) 150%, color(xyz .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) 0%, color(xyz .5 .6 .7) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) -10%, color(xyz .5 .6 .7 / .8))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 150%, color(xyz .5 .6 .7 / .8))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 0%, color(xyz .5 .6 .7 / .8) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in xyz longer hue, color(xyz .1 .2 .3), color(xyz .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz color(xyz .1 .2 .3), color(xyz .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) color(xyz .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(color(xyz .1 .2 .3), color(xyz .5 .6 .7), in xyz)" should not set the property value +PASS e.style['color'] = "color-mix(color(xyz .1 .2 .3), color(xyz .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) -10%, color(xyz-d50 .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 150%, color(xyz-d50 .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 0%, color(xyz-d50 .5 .6 .7) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) -10%, color(xyz-d50 .5 .6 .7 / .8))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 150%, color(xyz-d50 .5 .6 .7 / .8))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 0%, color(xyz-d50 .5 .6 .7 / .8) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d50 longer hue, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d50 color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) color(xyz-d50 .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7), in xyz-d50)" should not set the property value +PASS e.style['color'] = "color-mix(color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) -10%, color(xyz-d65 .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 150%, color(xyz-d65 .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 0%, color(xyz-d65 .5 .6 .7) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) -10%, color(xyz-d65 .5 .6 .7 / .8))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 150%, color(xyz-d65 .5 .6 .7 / .8))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 0%, color(xyz-d65 .5 .6 .7 / .8) 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d65 longer hue, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d65 color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) color(xyz-d65 .5 .6 .7))" should not set the property value +PASS e.style['color'] = "color-mix(color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7), in xyz-d65)" should not set the property value +PASS e.style['color'] = "color-mix(color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))" should not set the property 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 deleted file mode 100644 index 6a4fdac..0000000 --- a/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-mixed-num-pct-expected.txt +++ /dev/null
@@ -1,148 +0,0 @@ -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/external/wpt/css/css-color/parsing/color-mix-valid-expected.txt b/third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-valid-color-mix-function-expected.txt similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-mix-valid-expected.txt rename to third_party/blink/web_tests/virtual/stable/external/wpt/css/css-color/parsing/color-valid-color-mix-function-expected.txt
diff --git a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt index 0030bbc0..18e17bd3 100644 --- a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
@@ -60,6 +60,7 @@ property ariaModal property ariaMultiLine property ariaMultiSelectable + property ariaNotify property ariaOrientation property ariaOwnsElements property ariaPlaceholder @@ -1312,6 +1313,7 @@ property ariaModal property ariaMultiLine property ariaMultiSelectable + property ariaNotify property ariaOrientation property ariaOwnsElements property ariaPlaceholder
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt index e88fb3e..4390ab0 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -1943,6 +1943,7 @@ getter xmlVersion method adoptNode method append + method ariaNotify method captureEvents method caretRangeFromPoint method clear @@ -2316,6 +2317,7 @@ method after method animate method append + method ariaNotify method attachShadow method before method checkVisibility
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec index 8b0842c..5e71cc7 100644 --- a/tools/gritsettings/resource_ids.spec +++ b/tools/gritsettings/resource_ids.spec
@@ -550,6 +550,10 @@ "META": {"sizes": {"includes": [10]}}, "includes": [3020], }, + "<(SHARED_INTERMEDIATE_DIR)/ash/webui/files_internals/ash_files_internals_resources.grd": { + "META": {"sizes": {"includes": [10],}}, + "includes": [3025], + }, "<(SHARED_INTERMEDIATE_DIR)/ash/webui/guest_os_installer/resources/resources.grd": { "META": {"sizes": {"includes": [10]}}, "includes": [3030],
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 8cfbb69..dbb111f6 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -34979,6 +34979,8 @@ <suffix name="PriceDropNTP" label="For PriceDropNTP feature."/> <suffix name="PriceTrackingInSidePanel" label="For PriceTrackingInSidePanelFeature feature."/> + <suffix name="PriceTrackingPageActionIconLabel" + label="For price tracking page action icon label triggering."/> <suffix name="ProfileSwitch" label="In product help for switching profiles using the profile menu."/> <suffix name="PwaInstallAvailableFeature"
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index be14c0c..a5b47c3 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -13210,6 +13210,11 @@ <int value="1" label="Using share group"/> </enum> +<enum name="BooleanShowing"> + <int value="0" label="Not Showing"/> + <int value="1" label="Showing"/> +</enum> + <enum name="BooleanShown"> <obsolete> Removed as of 06/2022
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml index a3d4d8be..421b831 100644 --- a/tools/metrics/histograms/metadata/android/histograms.xml +++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -2330,7 +2330,7 @@ </histogram> <histogram name="Android.Messages.Dismissed{MessageIdentifier}" - enum="MessageDismissReason" expires_after="2022-12-01"> + enum="MessageDismissReason" expires_after="M115"> <owner>lazzzis@chromium.org</owner> <owner>src/components/messages/OWNERS</owner> <summary> @@ -2342,7 +2342,7 @@ </histogram> <histogram name="Android.Messages.Enqueued" enum="MessageIdentifier" - expires_after="2023-04-09"> + expires_after="M115"> <owner>lazzzis@chromium.org</owner> <owner>src/components/messages/OWNERS</owner> <summary> @@ -2354,7 +2354,7 @@ </histogram> <histogram name="Android.Messages.Enqueued.Hidden" enum="MessageIdentifier" - expires_after="2023-03-05"> + expires_after="M115"> <owner>lazzzis@chromium.org</owner> <owner>src/components/messages/OWNERS</owner> <summary> @@ -2367,7 +2367,7 @@ </histogram> <histogram name="Android.Messages.Enqueued.Hiding" enum="MessageIdentifier" - expires_after="2022-12-01"> + expires_after="M115"> <owner>lazzzis@chromium.org</owner> <owner>src/components/messages/OWNERS</owner> <summary> @@ -2380,7 +2380,7 @@ </histogram> <histogram name="Android.Messages.Enqueued.Visible" enum="MessageIdentifier" - expires_after="2023-04-09"> + expires_after="M115"> <owner>lazzzis@chromium.org</owner> <owner>src/components/messages/OWNERS</owner> <summary> @@ -2392,7 +2392,7 @@ </histogram> <histogram name="Android.Messages.TimeToAction.Dismiss{MessageIdentifier}" - units="ms" expires_after="2022-12-01"> + units="ms" expires_after="M115"> <owner>lazzzis@chromium.org</owner> <owner>src/components/messages/OWNERS</owner> <summary> @@ -2407,7 +2407,7 @@ </histogram> <histogram name="Android.Messages.TimeToAction{MessageIdentifier}" units="ms" - expires_after="2022-12-01"> + expires_after="M115"> <owner>lazzzis@chromium.org</owner> <owner>src/components/messages/OWNERS</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/download/histograms.xml b/tools/metrics/histograms/metadata/download/histograms.xml index 7dee014..8d6a4af 100644 --- a/tools/metrics/histograms/metadata/download/histograms.xml +++ b/tools/metrics/histograms/metadata/download/histograms.xml
@@ -1268,6 +1268,30 @@ </summary> </histogram> +<histogram name="Download.Session.IsDownloadBubbleShowingWhenSessionEnds" + enum="BooleanShowing" expires_after="2023-01-12"> + <owner>xinghuilu@chromium.org</owner> + <owner>chrome-counter-abuse-alerts@google.com</owner> + <summary> + Records if the download bubble is showing when session ends. See the + description in Session.TotalDuration for how session ends is defined. This + histogram is added for debugging purpose and will be removed afterwards. + </summary> +</histogram> + +<histogram name="Download.Session.TotalDurationIncludingBubbleTime" units="ms" + expires_after="2023-01-12"> + <owner>xinghuilu@chromium.org</owner> + <owner>chrome-counter-abuse-alerts@google.com</owner> + <summary> + Similar to Session.TotalDuration, but add the time when the download bubble + is showing into the total session duration. In rare cases where the user + leaves Chrome when the bubble is showing, it may include that duration too. + This histogram is added for debugging purpose and will be removed + afterwards. + </summary> +</histogram> + <histogram name="Download.SetAlwaysOpenTo" enum="BooleanEnabled" expires_after="2023-01-07"> <owner>xinghuilu@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml index 0c96a574..32488b7 100644 --- a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml +++ b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
@@ -185,6 +185,8 @@ <variant name="IPH_PriceTrackingInSidePanel" summary="first time user tracks a product to educate them to see the price tracking list in side panel"/> + <variant name="IPH_PriceTrackingPageActionIconLabel" + summary="price tracking page action icon label triggering"/> <variant name="IPH_ProfileSwitch" summary="switching profiles using the profile menu"/> <variant name="IPH_PwaInstallAvailableFeature"
diff --git a/tools/metrics/histograms/metadata/navigation/histograms.xml b/tools/metrics/histograms/metadata/navigation/histograms.xml index cdf51ee..79da6cb 100644 --- a/tools/metrics/histograms/metadata/navigation/histograms.xml +++ b/tools/metrics/histograms/metadata/navigation/histograms.xml
@@ -955,7 +955,7 @@ </histogram> <histogram name="Navigation.MainFrameScheme2" enum="NavigationScheme" - expires_after="2022-11-01"> + expires_after="2023-03-05"> <owner>estark@chromium.org</owner> <owner>elawrence@chromium.org</owner> <owner>trusty-transport@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/sync/histograms.xml b/tools/metrics/histograms/metadata/sync/histograms.xml index 2ed8c4d..e0657b07 100644 --- a/tools/metrics/histograms/metadata/sync/histograms.xml +++ b/tools/metrics/histograms/metadata/sync/histograms.xml
@@ -332,7 +332,7 @@ </histogram> <histogram name="Sync.Crypto.NigoriKeyDerivationDuration.{Method}" units="ms" - expires_after="2022-10-30"> + expires_after="2023-05-01"> <owner>mmoskvitin@google.com</owner> <owner>treib@chromium.org</owner> <component>Services>Sync</component>
diff --git a/ui/base/test/skia_gold_pixel_diff.cc b/ui/base/test/skia_gold_pixel_diff.cc index 4ebbfee..adf3611 100644 --- a/ui/base/test/skia_gold_pixel_diff.cc +++ b/ui/base/test/skia_gold_pixel_diff.cc
@@ -51,6 +51,9 @@ const char* kBuildRevisionKey = "git-revision"; +// A dummy build revision used only under a dry run. +constexpr char kDummyBuildRevision[] = "12345"; + // The switch keys for tryjob. const char* kIssueKey = "gerrit-issue"; const char* kPatchSetKey = "gerrit-patchset"; @@ -214,8 +217,19 @@ void SkiaGoldPixelDiff::Init(const std::string& screenshot_prefix, const std::string& corpus) { auto* cmd_line = base::CommandLine::ForCurrentProcess(); - ASSERT_TRUE(cmd_line->HasSwitch(kBuildRevisionKey)) + if (!BotModeEnabled(base::CommandLine::ForCurrentProcess())) { + cmd_line->AppendSwitch(kDryRun); + } + + ASSERT_TRUE(cmd_line->HasSwitch(kBuildRevisionKey) || + cmd_line->HasSwitch(kDryRun)) << "Missing switch " << kBuildRevisionKey; + + // Use the dummy revision code for dry run. + build_revision_ = cmd_line->HasSwitch(kDryRun) + ? kDummyBuildRevision + : cmd_line->GetSwitchValueASCII(kBuildRevisionKey); + ASSERT_TRUE( cmd_line->HasSwitch(kIssueKey) && cmd_line->HasSwitch(kPatchSetKey) && cmd_line->HasSwitch(kJobIdKey) || @@ -224,7 +238,6 @@ << "Missing switch. If it's running for tryjob, you should pass --" << kIssueKey << " --" << kPatchSetKey << " --" << kJobIdKey << ". Otherwise, do not pass any one of them."; - build_revision_ = cmd_line->GetSwitchValueASCII(kBuildRevisionKey); if (cmd_line->HasSwitch(kIssueKey)) { issue_ = cmd_line->GetSwitchValueASCII(kIssueKey); patchset_ = cmd_line->GetSwitchValueASCII(kPatchSetKey); @@ -251,19 +264,12 @@ const base::FilePath& local_file_path, const std::string& remote_golden_image_name, const SkiaGoldMatchingAlgorithm* algorithm) const { - if (base::CommandLine::ForCurrentProcess()->HasSwitch( - kBypassSkiaGoldFunctionality)) { - LOG(WARNING) << "Bypassing Skia Gold comparison due to " - << "--bypass-skia-gold-functionality being present."; - return true; - } - // Copy the png file to another place for local debugging. - if (base::CommandLine::ForCurrentProcess()->HasSwitch( - kPngFilePathDebugging)) { + base::CommandLine* process_command_line = + base::CommandLine::ForCurrentProcess(); + if (process_command_line->HasSwitch(kPngFilePathDebugging)) { base::FilePath path = - base::CommandLine::ForCurrentProcess()->GetSwitchValuePath( - kPngFilePathDebugging); + process_command_line->GetSwitchValuePath(kPngFilePathDebugging); if (!base::PathExists(path)) { base::CreateDirectory(path); } @@ -279,14 +285,19 @@ base::CopyFile(local_file_path, filepath); } + if (process_command_line->HasSwitch(kBypassSkiaGoldFunctionality)) { + LOG(WARNING) << "Bypassing Skia Gold comparison due to " + << "--bypass-skia-gold-functionality being present."; + return true; + } + base::ScopedAllowBlockingForTesting allow_blocking; base::CommandLine cmd(GetAbsoluteSrcRelativePath(kSkiaGoldCtl)); cmd.AppendSwitchASCII("test-name", remote_golden_image_name); cmd.AppendSwitchASCII("corpus", corpus_); cmd.AppendSwitchPath("png-file", local_file_path); cmd.AppendSwitchPath("work-dir", working_dir_); - - if (!BotModeEnabled(base::CommandLine::ForCurrentProcess())) { + if (process_command_line->HasSwitch(kDryRun)) { cmd.AppendSwitch(kDryRun); }
diff --git a/ui/display/manager/touch_transform_controller_unittest.cc b/ui/display/manager/touch_transform_controller_unittest.cc index 08566027..3efa04c 100644 --- a/ui/display/manager/touch_transform_controller_unittest.cc +++ b/ui/display/manager/touch_transform_controller_unittest.cc
@@ -871,17 +871,33 @@ // [0, ~137] ---> < 0 // [~137, ~1782] ---> [0, 1920) // [~1782, 1920] ---> >= 1920 + x = 136.0; + y = 0.0; + device_manager->ApplyTouchTransformer(kTouchId1, &x, &y); + EXPECT_LT(-1.0f, x); + EXPECT_LT(x, 0.0f); + EXPECT_NEAR(0.0f, y, 0.01f); + x = 137.0; y = 0.0; device_manager->ApplyTouchTransformer(kTouchId1, &x, &y); - EXPECT_NEAR(0, x, 0.5); - EXPECT_NEAR(0, y, 0.5); + EXPECT_LT(0.0f, x); + EXPECT_LT(x, 1.0f); + EXPECT_NEAR(0.0f, y, 0.01f); x = 1782.0; y = 0.0; device_manager->ApplyTouchTransformer(kTouchId1, &x, &y); - EXPECT_NEAR(1920, x, 0.5); - EXPECT_NEAR(0, y, 0.5); + EXPECT_LT(1919.0f, x); + EXPECT_LT(x, 1920.0f); + EXPECT_NEAR(0.0f, y, 0.01f); + + x = 1783.0; + y = 0.0; + device_manager->ApplyTouchTransformer(kTouchId1, &x, &y); + EXPECT_LT(1920.0f, x); + EXPECT_LT(x, 1921.0f); + EXPECT_NEAR(0.0f, y, 0.01f); } } // namespace test
diff --git a/ui/file_manager/file_manager/foreground/elements/files_ripple.html b/ui/file_manager/file_manager/foreground/elements/files_ripple.html index 5b625aa..442f773 100644 --- a/ui/file_manager/file_manager/foreground/elements/files_ripple.html +++ b/ui/file_manager/file_manager/foreground/elements/files_ripple.html
@@ -22,7 +22,6 @@ margin: 0 auto; opacity: 0; width: 50%; - @apply(--files-ripple); } :host([pressed]) .ripple {
diff --git a/ui/gfx/BUILD.gn b/ui/gfx/BUILD.gn index 0ac0e60c4..7b04d32 100644 --- a/ui/gfx/BUILD.gn +++ b/ui/gfx/BUILD.gn
@@ -639,6 +639,8 @@ "animation/keyframe/test/animation_utils.cc", "animation/keyframe/test/animation_utils.h", "animation/test_animation_delegate.h", + "geometry/test/fuzzer_util.cc", + "geometry/test/fuzzer_util.h", "geometry/test/geometry_util.cc", "geometry/test/geometry_util.h", "image/image_unittest_util.cc",
diff --git a/ui/gfx/geometry/matrix44.cc b/ui/gfx/geometry/matrix44.cc index ea28ad0..52329951 100644 --- a/ui/gfx/geometry/matrix44.cc +++ b/ui/gfx/geometry/matrix44.cc
@@ -25,8 +25,7 @@ "Matrix44 must be trivially copyable"); #endif -static inline bool eq4(const SkScalar* SK_RESTRICT a, - const SkScalar* SK_RESTRICT b) { +static inline bool eq4(const double* a, const double* b) { return (a[0] == b[0]) & (a[1] == b[1]) & (a[2] == b[2]) & (a[3] == b[3]); } @@ -39,8 +38,8 @@ return true; } - const SkScalar* SK_RESTRICT a = &fMat[0][0]; - const SkScalar* SK_RESTRICT b = &other.fMat[0][0]; + const double* a = &fMat[0][0]; + const double* b = &other.fMat[0][0]; #if 0 for (int i = 0; i < 16; ++i) { @@ -92,14 +91,14 @@ /////////////////////////////////////////////////////////////////////////////// void Matrix44::getColMajor(float dst[]) const { - const SkScalar* src = &fMat[0][0]; + const double* src = &fMat[0][0]; for (int i = 0; i < 16; ++i) { dst[i] = src[i]; } } void Matrix44::getRowMajor(float dst[]) const { - const SkScalar* src = &fMat[0][0]; + const double* src = &fMat[0][0]; for (int i = 0; i < 4; ++i) { dst[0] = float(src[0]); dst[4] = float(src[1]); @@ -111,7 +110,7 @@ } void Matrix44::setColMajor(const float src[]) { - SkScalar* dst = &fMat[0][0]; + double* dst = &fMat[0][0]; for (int i = 0; i < 16; ++i) { dst[i] = src[i]; } @@ -120,7 +119,7 @@ } void Matrix44::setRowMajor(const float src[]) { - SkScalar* dst = &fMat[0][0]; + double* dst = &fMat[0][0]; for (int i = 0; i < 4; ++i) { dst[0] = src[0]; dst[4] = src[1]; @@ -135,7 +134,7 @@ #if BUILDFLAG(IS_MAC) CATransform3D Matrix44::ToCATransform3D() const { CATransform3D result; - const float* src = &fMat[0][0]; + const double* src = &fMat[0][0]; auto* dst = &result.m11; for (int i = 0; i < 16; ++i) dst[i] = src[i]; @@ -167,7 +166,7 @@ /////////////////////////////////////////////////////////////////////////////// -Matrix44& Matrix44::setTranslate(SkScalar dx, SkScalar dy, SkScalar dz) { +Matrix44& Matrix44::setTranslate(double dx, double dy, double dz) { this->setIdentity(); if (!dx && !dy && !dz) { @@ -181,7 +180,7 @@ return *this; } -Matrix44& Matrix44::preTranslate(SkScalar dx, SkScalar dy, SkScalar dz) { +Matrix44& Matrix44::preTranslate(double dx, double dy, double dz) { if (!dx && !dy && !dz) { return *this; } @@ -194,7 +193,7 @@ return *this; } -Matrix44& Matrix44::postTranslate(SkScalar dx, SkScalar dy, SkScalar dz) { +Matrix44& Matrix44::postTranslate(double dx, double dy, double dz) { if (!dx && !dy && !dz) { return *this; } @@ -216,7 +215,7 @@ /////////////////////////////////////////////////////////////////////////////// -Matrix44& Matrix44::setScale(SkScalar sx, SkScalar sy, SkScalar sz) { +Matrix44& Matrix44::setScale(double sx, double sy, double sz) { this->setIdentity(); if (1 == sx && 1 == sy && 1 == sz) { @@ -230,7 +229,7 @@ return *this; } -Matrix44& Matrix44::preScale(SkScalar sx, SkScalar sy, SkScalar sz) { +Matrix44& Matrix44::preScale(double sx, double sy, double sz) { if (1 == sx && 1 == sy && 1 == sz) { return *this; } @@ -247,7 +246,7 @@ return *this; } -Matrix44& Matrix44::postScale(SkScalar sx, SkScalar sy, SkScalar sz) { +Matrix44& Matrix44::postScale(double sx, double sy, double sz) { if (1 == sx && 1 == sy && 1 == sz) { return *this; } @@ -263,11 +262,11 @@ /////////////////////////////////////////////////////////////////////////////// -void Matrix44::setRotateUnitSinCos(SkScalar x, - SkScalar y, - SkScalar z, - SkScalar sin_angle, - SkScalar cos_angle) { +void Matrix44::setRotateUnitSinCos(double x, + double y, + double z, + double sin_angle, + double cos_angle) { // Use double precision for intermediate results. double c = cos_angle; double s = sin_angle; @@ -282,28 +281,27 @@ double yzC = y * zC; double zxC = z * xC; - fMat[0][0] = SkDoubleToScalar(x * xC + c); - fMat[0][1] = SkDoubleToScalar(xyC + zs); - fMat[0][2] = SkDoubleToScalar(zxC - ys); - fMat[0][3] = SkDoubleToScalar(0); - fMat[1][0] = SkDoubleToScalar(xyC - zs); - fMat[1][1] = SkDoubleToScalar(y * yC + c); - fMat[1][2] = SkDoubleToScalar(yzC + xs); - fMat[1][3] = SkDoubleToScalar(0); - fMat[2][0] = SkDoubleToScalar(zxC + ys); - fMat[2][1] = SkDoubleToScalar(yzC - xs); - fMat[2][2] = SkDoubleToScalar(z * zC + c); - fMat[2][3] = SkDoubleToScalar(0); - fMat[3][0] = SkDoubleToScalar(0); - fMat[3][1] = SkDoubleToScalar(0); - fMat[3][2] = SkDoubleToScalar(0); - fMat[3][3] = SkDoubleToScalar(1); + fMat[0][0] = x * xC + c; + fMat[0][1] = xyC + zs; + fMat[0][2] = zxC - ys; + fMat[0][3] = 0; + fMat[1][0] = xyC - zs; + fMat[1][1] = y * yC + c; + fMat[1][2] = yzC + xs; + fMat[1][3] = 0; + fMat[2][0] = zxC + ys; + fMat[2][1] = yzC - xs; + fMat[2][2] = z * zC + c; + fMat[2][3] = 0; + fMat[3][0] = 0; + fMat[3][1] = 0; + fMat[3][2] = 0; + fMat[3][3] = 1; this->recomputeTypeMask(); } -void Matrix44::setRotateAboutXAxisSinCos(SkScalar sin_angle, - SkScalar cos_angle) { +void Matrix44::setRotateAboutXAxisSinCos(double sin_angle, double cos_angle) { fMat[0][0] = 1; fMat[0][1] = 0; fMat[0][2] = 0; @@ -324,8 +322,7 @@ this->recomputeTypeMask(); } -void Matrix44::setRotateAboutYAxisSinCos(SkScalar sin_angle, - SkScalar cos_angle) { +void Matrix44::setRotateAboutYAxisSinCos(double sin_angle, double cos_angle) { fMat[0][0] = cos_angle; fMat[0][1] = 0; fMat[0][2] = -sin_angle; @@ -346,8 +343,7 @@ this->recomputeTypeMask(); } -void Matrix44::setRotateAboutZAxisSinCos(SkScalar sin_angle, - SkScalar cos_angle) { +void Matrix44::setRotateAboutZAxisSinCos(double sin_angle, double cos_angle) { fMat[0][0] = cos_angle; fMat[0][1] = sin_angle; fMat[0][2] = 0; @@ -388,8 +384,8 @@ } bool useStorage = (this == &a || this == &b); - SkScalar storage[16]; - SkScalar* result = useStorage ? storage : &fMat[0][0]; + double storage[16]; + double* result = useStorage ? storage : &fMat[0][0]; // Both matrices are at most scale+translate if (bits_isonly(a_mask | b_mask, kScale_Mask | kTranslate_Mask)) { @@ -408,9 +404,9 @@ for (int i = 0; i < 4; i++) { double value = 0; for (int k = 0; k < 4; k++) { - value += double(a.fMat[k][i]) * b.fMat[j][k]; + value += a.fMat[k][i] * b.fMat[j][k]; } - *result++ = SkScalar(value); + *result++ = value; } } } @@ -423,10 +419,6 @@ /////////////////////////////////////////////////////////////////////////////// -/** We always perform the calculation in doubles, to avoid prematurely losing - precision along the way. This relies on the compiler automatically - promoting our SkScalar values to double (if needed). - */ double Matrix44::determinant() const { if (this->isIdentity()) { return 1; @@ -472,7 +464,7 @@ /////////////////////////////////////////////////////////////////////////////// static bool is_matrix_finite(const Matrix44& matrix) { - SkScalar accumulator = 0; + double accumulator = 0; for (int row = 0; row < 4; ++row) { for (int col = 0; col < 4; ++col) { accumulator *= matrix.rc(row, col); @@ -508,24 +500,24 @@ double invYScale = 1 / fMat[1][1]; double invZScale = 1 / fMat[2][2]; - inverse->fMat[0][0] = SkDoubleToScalar(invXScale); + inverse->fMat[0][0] = invXScale; inverse->fMat[0][1] = 0; inverse->fMat[0][2] = 0; inverse->fMat[0][3] = 0; inverse->fMat[1][0] = 0; - inverse->fMat[1][1] = SkDoubleToScalar(invYScale); + inverse->fMat[1][1] = invYScale; inverse->fMat[1][2] = 0; inverse->fMat[1][3] = 0; inverse->fMat[2][0] = 0; inverse->fMat[2][1] = 0; - inverse->fMat[2][2] = SkDoubleToScalar(invZScale); + inverse->fMat[2][2] = invZScale; inverse->fMat[2][3] = 0; - inverse->fMat[3][0] = SkDoubleToScalar(-fMat[3][0] * invXScale); - inverse->fMat[3][1] = SkDoubleToScalar(-fMat[3][1] * invYScale); - inverse->fMat[3][2] = SkDoubleToScalar(-fMat[3][2] * invZScale); + inverse->fMat[3][0] = -fMat[3][0] * invXScale; + inverse->fMat[3][1] = -fMat[3][1] * invYScale; + inverse->fMat[3][2] = -fMat[3][2] * invZScale; inverse->fMat[3][3] = 1; inverse->setTypeMask(this->getType()); @@ -598,21 +590,21 @@ b10 *= invdet; b11 *= invdet; - inverse->fMat[0][0] = SkDoubleToScalar(a11 * b11 - a12 * b10); - inverse->fMat[0][1] = SkDoubleToScalar(a02 * b10 - a01 * b11); - inverse->fMat[0][2] = SkDoubleToScalar(b03); + inverse->fMat[0][0] = a11 * b11 - a12 * b10; + inverse->fMat[0][1] = a02 * b10 - a01 * b11; + inverse->fMat[0][2] = b03; inverse->fMat[0][3] = 0; - inverse->fMat[1][0] = SkDoubleToScalar(a12 * b08 - a10 * b11); - inverse->fMat[1][1] = SkDoubleToScalar(a00 * b11 - a02 * b08); - inverse->fMat[1][2] = SkDoubleToScalar(-b01); + inverse->fMat[1][0] = a12 * b08 - a10 * b11; + inverse->fMat[1][1] = a00 * b11 - a02 * b08; + inverse->fMat[1][2] = -b01; inverse->fMat[1][3] = 0; - inverse->fMat[2][0] = SkDoubleToScalar(a10 * b10 - a11 * b08); - inverse->fMat[2][1] = SkDoubleToScalar(a01 * b08 - a00 * b10); - inverse->fMat[2][2] = SkDoubleToScalar(b00); + inverse->fMat[2][0] = a10 * b10 - a11 * b08; + inverse->fMat[2][1] = a01 * b08 - a00 * b10; + inverse->fMat[2][2] = b00; inverse->fMat[2][3] = 0; - inverse->fMat[3][0] = SkDoubleToScalar(a11 * b07 - a10 * b09 - a12 * b06); - inverse->fMat[3][1] = SkDoubleToScalar(a00 * b09 - a01 * b07 + a02 * b06); - inverse->fMat[3][2] = SkDoubleToScalar(a31 * b01 - a30 * b03 - a32 * b00); + inverse->fMat[3][0] = a11 * b07 - a10 * b09 - a12 * b06; + inverse->fMat[3][1] = a00 * b09 - a01 * b07 + a02 * b06; + inverse->fMat[3][2] = a31 * b01 - a30 * b03 - a32 * b00; inverse->fMat[3][3] = 1; inverse->setTypeMask(this->getType()); @@ -663,22 +655,22 @@ b10 *= invdet; b11 *= invdet; - inverse->fMat[0][0] = SkDoubleToScalar(a11 * b11 - a12 * b10 + a13 * b09); - inverse->fMat[0][1] = SkDoubleToScalar(a02 * b10 - a01 * b11 - a03 * b09); - inverse->fMat[0][2] = SkDoubleToScalar(a31 * b05 - a32 * b04 + a33 * b03); - inverse->fMat[0][3] = SkDoubleToScalar(a22 * b04 - a21 * b05 - a23 * b03); - inverse->fMat[1][0] = SkDoubleToScalar(a12 * b08 - a10 * b11 - a13 * b07); - inverse->fMat[1][1] = SkDoubleToScalar(a00 * b11 - a02 * b08 + a03 * b07); - inverse->fMat[1][2] = SkDoubleToScalar(a32 * b02 - a30 * b05 - a33 * b01); - inverse->fMat[1][3] = SkDoubleToScalar(a20 * b05 - a22 * b02 + a23 * b01); - inverse->fMat[2][0] = SkDoubleToScalar(a10 * b10 - a11 * b08 + a13 * b06); - inverse->fMat[2][1] = SkDoubleToScalar(a01 * b08 - a00 * b10 - a03 * b06); - inverse->fMat[2][2] = SkDoubleToScalar(a30 * b04 - a31 * b02 + a33 * b00); - inverse->fMat[2][3] = SkDoubleToScalar(a21 * b02 - a20 * b04 - a23 * b00); - inverse->fMat[3][0] = SkDoubleToScalar(a11 * b07 - a10 * b09 - a12 * b06); - inverse->fMat[3][1] = SkDoubleToScalar(a00 * b09 - a01 * b07 + a02 * b06); - inverse->fMat[3][2] = SkDoubleToScalar(a31 * b01 - a30 * b03 - a32 * b00); - inverse->fMat[3][3] = SkDoubleToScalar(a20 * b03 - a21 * b01 + a22 * b00); + inverse->fMat[0][0] = a11 * b11 - a12 * b10 + a13 * b09; + inverse->fMat[0][1] = a02 * b10 - a01 * b11 - a03 * b09; + inverse->fMat[0][2] = a31 * b05 - a32 * b04 + a33 * b03; + inverse->fMat[0][3] = a22 * b04 - a21 * b05 - a23 * b03; + inverse->fMat[1][0] = a12 * b08 - a10 * b11 - a13 * b07; + inverse->fMat[1][1] = a00 * b11 - a02 * b08 + a03 * b07; + inverse->fMat[1][2] = a32 * b02 - a30 * b05 - a33 * b01; + inverse->fMat[1][3] = a20 * b05 - a22 * b02 + a23 * b01; + inverse->fMat[2][0] = a10 * b10 - a11 * b08 + a13 * b06; + inverse->fMat[2][1] = a01 * b08 - a00 * b10 - a03 * b06; + inverse->fMat[2][2] = a30 * b04 - a31 * b02 + a33 * b00; + inverse->fMat[2][3] = a21 * b02 - a20 * b04 - a23 * b00; + inverse->fMat[3][0] = a11 * b07 - a10 * b09 - a12 * b06; + inverse->fMat[3][1] = a00 * b09 - a01 * b07 + a02 * b06; + inverse->fMat[3][2] = a31 * b01 - a30 * b03 - a32 * b00; + inverse->fMat[3][3] = a20 * b03 - a21 * b01 + a22 * b00; inverse->setTypeMask(this->getType()); if (!is_matrix_finite(*inverse)) { return false; @@ -706,12 +698,12 @@ /////////////////////////////////////////////////////////////////////////////// -void Matrix44::mapScalars(const SkScalar src[4], SkScalar dst[4]) const { - SkScalar storage[4]; - SkScalar* result = (src == dst) ? storage : dst; +void Matrix44::mapScalars(const double src[4], double dst[4]) const { + double storage[4]; + double* result = (src == dst) ? storage : dst; for (int i = 0; i < 4; i++) { - SkScalar value = 0; + double value = 0; for (int j = 0; j < 4; j++) { value += fMat[j][i] * src[j]; }
diff --git a/ui/gfx/geometry/matrix44.h b/ui/gfx/geometry/matrix44.h index a720f3e..a9242d63 100644 --- a/ui/gfx/geometry/matrix44.h +++ b/ui/gfx/geometry/matrix44.h
@@ -31,22 +31,22 @@ fTypeMask(kIdentity_Mask) {} // The parameters are in row-major order. - Matrix44(SkScalar col1row1, - SkScalar col2row1, - SkScalar col3row1, - SkScalar col4row1, - SkScalar col1row2, - SkScalar col2row2, - SkScalar col3row2, - SkScalar col4row2, - SkScalar col1row3, - SkScalar col2row3, - SkScalar col3row3, - SkScalar col4row3, - SkScalar col1row4, - SkScalar col2row4, - SkScalar col3row4, - SkScalar col4row4) + Matrix44(double col1row1, + double col2row1, + double col3row1, + double col4row1, + double col1row2, + double col2row2, + double col3row2, + double col4row2, + double col1row3, + double col2row3, + double col3row3, + double col4row3, + double col1row4, + double col2row4, + double col3row4, + double col4row4) // fMat is indexed by [col][row] (i.e. col-major). : fMat{{col1row1, col1row2, col1row3, col1row4}, {col2row1, col2row2, col2row3, col2row4}, @@ -114,7 +114,7 @@ * (0, 3) translate-x * (3, 0) perspective-x */ - inline SkScalar rc(int row, int col) const { + inline double rc(int row, int col) const { SkASSERT((unsigned)row <= 3); SkASSERT((unsigned)col <= 3); return fMat[col][row]; @@ -126,7 +126,7 @@ * (0, 3) translate-x * (3, 0) perspective-x */ - inline void setRC(int row, int col, SkScalar value) { + inline void setRC(int row, int col, double value) { SkASSERT((unsigned)row <= 3); SkASSERT((unsigned)col <= 3); fMat[col][row] = value; @@ -162,28 +162,28 @@ CATransform3D ToCATransform3D() const; #endif - Matrix44& setTranslate(SkScalar dx, SkScalar dy, SkScalar dz); - Matrix44& preTranslate(SkScalar dx, SkScalar dy, SkScalar dz); - Matrix44& postTranslate(SkScalar dx, SkScalar dy, SkScalar dz); + Matrix44& setTranslate(double dx, double dy, double dz); + Matrix44& preTranslate(double dx, double dy, double dz); + Matrix44& postTranslate(double dx, double dy, double dz); - Matrix44& setScale(SkScalar sx, SkScalar sy, SkScalar sz); - Matrix44& preScale(SkScalar sx, SkScalar sy, SkScalar sz); - Matrix44& postScale(SkScalar sx, SkScalar sy, SkScalar sz); + Matrix44& setScale(double sx, double sy, double sz); + Matrix44& preScale(double sx, double sy, double sz); + Matrix44& postScale(double sx, double sy, double sz); // Sets this matrix to rotate about the specified unit-length axis vector, // by an angle specified by its sin() and cos(). This does not attempt to // verify that axis(x, y, z).length() == 1 or that the sin, cos values are // correct. - void setRotateUnitSinCos(SkScalar x, - SkScalar y, - SkScalar z, - SkScalar sin_angle, - SkScalar cos_angle); + void setRotateUnitSinCos(double x, + double y, + double z, + double sin_angle, + double cos_angle); // Special case for x, y or z axis of the above function. - void setRotateAboutXAxisSinCos(SkScalar sin_angle, SkScalar cos_angle); - void setRotateAboutYAxisSinCos(SkScalar sin_angle, SkScalar cos_angle); - void setRotateAboutZAxisSinCos(SkScalar sin_angle, SkScalar cos_angle); + void setRotateAboutXAxisSinCos(double sin_angle, double cos_angle); + void setRotateAboutYAxisSinCos(double sin_angle, double cos_angle); + void setRotateAboutZAxisSinCos(double sin_angle, double cos_angle); void setConcat(const Matrix44& a, const Matrix44& b); inline void preConcat(const Matrix44& m) { this->setConcat(*this, m); } @@ -205,8 +205,8 @@ /** Apply the matrix to the src vector, returning the new vector in dst. It is legal for src and dst to point to the same memory. */ - void mapScalars(const SkScalar src[4], SkScalar dst[4]) const; - inline void mapScalars(SkScalar vec[4]) const { this->mapScalars(vec, vec); } + void mapScalars(const double src[4], double dst[4]) const; + inline void mapScalars(double vec[4]) const { this->mapScalars(vec, vec); } double determinant() const; @@ -214,22 +214,22 @@ private: /* This is indexed by [col][row]. */ - SkScalar fMat[4][4]; + double fMat[4][4]; TypeMask fTypeMask; static constexpr int kAllPublic_Masks = 0xF; - SkScalar transX() const { return fMat[3][0]; } - SkScalar transY() const { return fMat[3][1]; } - SkScalar transZ() const { return fMat[3][2]; } + double transX() const { return fMat[3][0]; } + double transY() const { return fMat[3][1]; } + double transZ() const { return fMat[3][2]; } - SkScalar scaleX() const { return fMat[0][0]; } - SkScalar scaleY() const { return fMat[1][1]; } - SkScalar scaleZ() const { return fMat[2][2]; } + double scaleX() const { return fMat[0][0]; } + double scaleY() const { return fMat[1][1]; } + double scaleZ() const { return fMat[2][2]; } - SkScalar perspX() const { return fMat[0][3]; } - SkScalar perspY() const { return fMat[1][3]; } - SkScalar perspZ() const { return fMat[2][3]; } + double perspX() const { return fMat[0][3]; } + double perspY() const { return fMat[1][3]; } + double perspZ() const { return fMat[2][3]; } void recomputeTypeMask();
diff --git a/ui/gfx/geometry/test/fuzzer_util.cc b/ui/gfx/geometry/test/fuzzer_util.cc new file mode 100644 index 0000000..9ceaf81f --- /dev/null +++ b/ui/gfx/geometry/test/fuzzer_util.cc
@@ -0,0 +1,26 @@ +// 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 "ui/gfx/geometry/test/fuzzer_util.h" + +#include <fuzzer/FuzzedDataProvider.h> +#include <vector> + +#include "base/check_op.h" +#include "ui/gfx/geometry/transform.h" + +namespace gfx { + +Transform ConsumeTransform(FuzzedDataProvider& fuzz) { + Transform transform; + float matrix_data[16]; + if (fuzz.ConsumeBool() && fuzz.remaining_bytes() >= sizeof(matrix_data)) { + size_t consumed = fuzz.ConsumeData(matrix_data, sizeof(matrix_data)); + CHECK_EQ(consumed, sizeof(matrix_data)); + transform = Transform::ColMajorF(matrix_data); + } + return transform; +} + +} // namespace gfx
diff --git a/ui/gfx/geometry/test/fuzzer_util.h b/ui/gfx/geometry/test/fuzzer_util.h new file mode 100644 index 0000000..6f40b4d --- /dev/null +++ b/ui/gfx/geometry/test/fuzzer_util.h
@@ -0,0 +1,20 @@ +// 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 UI_GFX_GEOMETRY_TEST_FUZZER_UTIL_H_ +#define UI_GFX_GEOMETRY_TEST_FUZZER_UTIL_H_ + +#include "ui/gfx/geometry/transform.h" + +class FuzzedDataProvider; + +namespace gfx { + +class Transform; + +Transform ConsumeTransform(FuzzedDataProvider&); + +} // namespace gfx + +#endif // UI_GFX_GEOMETRY_TEST_FUZZER_UTIL_H_
diff --git a/ui/gfx/geometry/transform.cc b/ui/gfx/geometry/transform.cc index 5ebb4050..9982e10 100644 --- a/ui/gfx/geometry/transform.cc +++ b/ui/gfx/geometry/transform.cc
@@ -11,6 +11,7 @@ #include "ui/gfx/geometry/axis_transform2d.h" #include "ui/gfx/geometry/box_f.h" #include "ui/gfx/geometry/clamp_float_geometry.h" +#include "ui/gfx/geometry/double4.h" #include "ui/gfx/geometry/point3_f.h" #include "ui/gfx/geometry/point_conversions.h" #include "ui/gfx/geometry/quaternion.h" @@ -24,17 +25,17 @@ namespace { -const SkScalar kEpsilon = std::numeric_limits<float>::epsilon(); +const double kEpsilon = std::numeric_limits<float>::epsilon(); -SkScalar TanDegrees(double degrees) { - return SkDoubleToScalar(std::tan(gfx::DegToRad(degrees))); +double TanDegrees(double degrees) { + return std::tan(gfx::DegToRad(degrees)); } -inline bool ApproximatelyZero(SkScalar x, SkScalar tolerance) { +inline bool ApproximatelyZero(double x, double tolerance) { return std::abs(x) <= tolerance; } -inline bool ApproximatelyOne(SkScalar x, SkScalar tolerance) { +inline bool ApproximatelyOne(double x, double tolerance) { return std::abs(x - 1) <= tolerance; } @@ -47,14 +48,13 @@ Transform& Transform::operator=(Transform&&) = default; // clang-format off -Transform::Transform( - SkScalar r0c0, SkScalar r1c0, SkScalar r2c0, SkScalar r3c0, - SkScalar r0c1, SkScalar r1c1, SkScalar r2c1, SkScalar r3c1, - SkScalar r0c2, SkScalar r1c2, SkScalar r2c2, SkScalar r3c2, - SkScalar r0c3, SkScalar r1c3, SkScalar r2c3, SkScalar r3c3) { - if (r1c0 == 0 && r2c0 == 0 && r3c0 == 0 && r0c1 == 0 && r2c1 == 0 && - r3c1 == 0 && r0c2 == 0 && r1c2 == 0 && r2c2 == 1 && r3c2 == 0 && - r2c3 == 0 && r3c3 == 1) { +Transform::Transform(double r0c0, double r1c0, double r2c0, double r3c0, + double r0c1, double r1c1, double r2c1, double r3c1, + double r0c2, double r1c2, double r2c2, double r3c2, + double r0c3, double r1c3, double r2c3, double r3c3) { + if (AllTrue(Double4{r1c0, r2c0, r3c0, r0c1} == Double4{0, 0, 0, 0} & + Double4{r2c1, r3c1, r0c2, r1c2} == Double4{0, 0, 0, 0} & + Double4{r2c2, r3c2, r2c3, r3c3} == Double4{1, 0, 0, 1})) { axis_2d_ = AxisTransform2d::FromScaleAndTranslation( Vector2dF(r0c0, r1c1), Vector2dF(r0c3, r1c3)); } else { @@ -69,19 +69,19 @@ Transform::Transform(const Quaternion& q) : Transform( // Col 0. - SkDoubleToScalar(1.0 - 2.0 * (q.y() * q.y() + q.z() * q.z())), - SkDoubleToScalar(2.0 * (q.x() * q.y() + q.z() * q.w())), - SkDoubleToScalar(2.0 * (q.x() * q.z() - q.y() * q.w())), + 1.0 - 2.0 * (q.y() * q.y() + q.z() * q.z()), + 2.0 * (q.x() * q.y() + q.z() * q.w()), + 2.0 * (q.x() * q.z() - q.y() * q.w()), 0, // Col 1. - SkDoubleToScalar(2.0 * (q.x() * q.y() - q.z() * q.w())), - SkDoubleToScalar(1.0 - 2.0 * (q.x() * q.x() + q.z() * q.z())), - SkDoubleToScalar(2.0 * (q.y() * q.z() + q.x() * q.w())), + 2.0 * (q.x() * q.y() - q.z() * q.w()), + 1.0 - 2.0 * (q.x() * q.x() + q.z() * q.z()), + 2.0 * (q.y() * q.z() + q.x() * q.w()), 0, // Col 2. - SkDoubleToScalar(2.0 * (q.x() * q.z() + q.y() * q.w())), - SkDoubleToScalar(2.0 * (q.y() * q.z() - q.x() * q.w())), - SkDoubleToScalar(1.0 - 2.0 * (q.x() * q.x() + q.y() * q.y())), + 2.0 * (q.x() * q.z() + q.y() * q.w()), + 2.0 * (q.y() * q.z() - q.x() * q.w()), + 1.0 - 2.0 * (q.x() * q.x() + q.y() * q.y()), 0, // Col 3. 0, 0, 0, 1) {} @@ -161,8 +161,7 @@ double sin_angle = std::sin(radians); double cos_angle = std::cos(radians); Transform t(kSkipInitialization); - t.EnsureFullMatrix().setRotateAboutXAxisSinCos(SkDoubleToScalar(sin_angle), - SkDoubleToScalar(cos_angle)); + t.EnsureFullMatrix().setRotateAboutXAxisSinCos(sin_angle, cos_angle); PreConcat(t); } @@ -173,8 +172,7 @@ double sin_angle = std::sin(radians); double cos_angle = std::cos(radians); Transform t(kSkipInitialization); - t.EnsureFullMatrix().setRotateAboutYAxisSinCos(SkDoubleToScalar(sin_angle), - SkDoubleToScalar(cos_angle)); + t.EnsureFullMatrix().setRotateAboutYAxisSinCos(sin_angle, cos_angle); PreConcat(t); } @@ -185,8 +183,7 @@ double sin_angle = std::sin(radians); double cos_angle = std::cos(radians); Transform t(kSkipInitialization); - t.EnsureFullMatrix().setRotateAboutZAxisSinCos(SkDoubleToScalar(sin_angle), - SkDoubleToScalar(cos_angle)); + t.EnsureFullMatrix().setRotateAboutZAxisSinCos(sin_angle, cos_angle); PreConcat(t); } @@ -209,9 +206,7 @@ double sin_angle = std::sin(radians); double cos_angle = std::cos(radians); Transform t(kSkipInitialization); - t.EnsureFullMatrix().setRotateUnitSinCos( - SkDoubleToScalar(x), SkDoubleToScalar(y), SkDoubleToScalar(z), - SkDoubleToScalar(sin_angle), SkDoubleToScalar(cos_angle)); + t.EnsureFullMatrix().setRotateUnitSinCos(x, y, z, sin_angle, cos_angle); PreConcat(t); } @@ -219,28 +214,28 @@ return LIKELY(!matrix_) ? axis_2d_.Determinant() : matrix_->determinant(); } -void Transform::Scale(SkScalar x, SkScalar y) { +void Transform::Scale(double x, double y) { if (LIKELY(!matrix_)) axis_2d_.PreScale(Vector2dF(x, y)); else matrix_->preScale(x, y, 1); } -void Transform::PostScale(SkScalar x, SkScalar y) { +void Transform::PostScale(double x, double y) { if (LIKELY(!matrix_)) axis_2d_.PostScale(Vector2dF(x, y)); else matrix_->postScale(x, y, 1); } -void Transform::Scale3d(SkScalar x, SkScalar y, SkScalar z) { +void Transform::Scale3d(double x, double y, double z) { if (z == 1) Scale(x, y); else EnsureFullMatrix().preScale(x, y, z); } -void Transform::PostScale3d(SkScalar x, SkScalar y, SkScalar z) { +void Transform::PostScale3d(double x, double y, double z) { if (z == 1) PostScale(x, y); else @@ -251,7 +246,7 @@ Translate(offset.x(), offset.y()); } -void Transform::Translate(SkScalar x, SkScalar y) { +void Transform::Translate(double x, double y) { if (LIKELY(!matrix_)) axis_2d_.PreTranslate(Vector2dF(x, y)); else @@ -262,7 +257,7 @@ PostTranslate(offset.x(), offset.y()); } -void Transform::PostTranslate(SkScalar x, SkScalar y) { +void Transform::PostTranslate(double x, double y) { if (LIKELY(!matrix_)) axis_2d_.PostTranslate(Vector2dF(x, y)); else @@ -273,7 +268,7 @@ PostTranslate3d(offset.x(), offset.y(), offset.z()); } -void Transform::PostTranslate3d(SkScalar x, SkScalar y, SkScalar z) { +void Transform::PostTranslate3d(double x, double y, double z) { if (z == 0) PostTranslate(x, y); else @@ -284,7 +279,7 @@ Translate3d(offset.x(), offset.y(), offset.z()); } -void Transform::Translate3d(SkScalar x, SkScalar y, SkScalar z) { +void Transform::Translate3d(double x, double y, double z) { if (z == 0) Translate(x, y); else @@ -307,7 +302,7 @@ } } -void Transform::ApplyPerspectiveDepth(SkScalar depth) { +void Transform::ApplyPerspectiveDepth(double depth) { if (depth == 0) return; @@ -347,7 +342,7 @@ PostTranslate(transform.translation()); } -bool Transform::IsApproximatelyIdentityOrTranslation(SkScalar tolerance) const { +bool Transform::IsApproximatelyIdentityOrTranslation(double tolerance) const { DCHECK_GE(tolerance, 0); if (LIKELY(!matrix_)) { return ApproximatelyOne(axis_2d_.scale().x(), tolerance) && @@ -369,7 +364,7 @@ } bool Transform::IsApproximatelyIdentityOrIntegerTranslation( - SkScalar tolerance) const { + double tolerance) const { if (!IsApproximatelyIdentityOrTranslation(tolerance)) return false; @@ -382,7 +377,7 @@ return true; } - for (float t : {matrix_->rc(0, 3), matrix_->rc(1, 3), matrix_->rc(2, 3)}) { + for (double t : {matrix_->rc(0, 3), matrix_->rc(1, 3), matrix_->rc(2, 3)}) { if (!base::IsValueInRangeForNumericType<int>(t) || std::abs(std::round(t) - t) > tolerance) return false; @@ -404,7 +399,7 @@ return true; } - for (float t : {matrix_->rc(0, 3), matrix_->rc(1, 3), matrix_->rc(2, 3)}) { + for (double t : {matrix_->rc(0, 3), matrix_->rc(1, 3), matrix_->rc(2, 3)}) { if (!base::IsValueInRangeForNumericType<int>(t) || static_cast<int>(t) != t) return false; } @@ -635,7 +630,7 @@ ClampFloatGeometry(vector.y() * axis_2d_.scale().y()), ClampFloatGeometry(vector.z())); } - SkScalar p[4] = {vector.x(), vector.y(), vector.z(), 0}; + double p[4] = {vector.x(), vector.y(), vector.z(), 0}; matrix_->mapScalars(p); return Vector3dF(ClampFloatGeometry(p[0]), ClampFloatGeometry(p[1]), ClampFloatGeometry(p[2])); @@ -648,11 +643,28 @@ vector[3] * axis_2d_.translation().x(); vector[1] = vector[1] * axis_2d_.scale().y() + vector[3] * axis_2d_.translation().y(); + for (int i = 0; i < 4; i++) + vector[i] = ClampFloatGeometry(vector[i]); + } else { + double v[4] = {vector[0], vector[1], vector[2], vector[3]}; + matrix_->mapScalars(v); + for (int i = 0; i < 4; i++) + vector[i] = ClampFloatGeometry(v[i]); + } +} + +void Transform::TransformVector4(double vector[4]) const { + DCHECK(vector); + // For now the only caller doesn't need clamping. + // TODO(crbug.com/1359528): Revisit the clamping requirement. + if (LIKELY(!matrix_)) { + vector[0] = vector[0] * axis_2d_.scale().x() + + vector[3] * axis_2d_.translation().x(); + vector[1] = vector[1] * axis_2d_.scale().y() + + vector[3] * axis_2d_.translation().y(); } else { matrix_->mapScalars(vector); } - for (int i = 0; i < 4; i++) - vector[i] = ClampFloatGeometry(vector[i]); } absl::optional<PointF> Transform::InverseMapPoint(const PointF& point) const { @@ -789,7 +801,7 @@ const Point3F& point) const { DCHECK(matrix_); - SkScalar p[4] = {point.x(), point.y(), point.z(), 1}; + double p[4] = {point.x(), point.y(), point.z(), 1}; xform.mapScalars(p);
diff --git a/ui/gfx/geometry/transform.h b/ui/gfx/geometry/transform.h index 624536f..038f23d 100644 --- a/ui/gfx/geometry/transform.h +++ b/ui/gfx/geometry/transform.h
@@ -44,22 +44,22 @@ Transform& operator=(Transform&&); // Creates a transform from explicit 16 matrix elements in row-major order. - static Transform RowMajor(SkScalar r0c0, - SkScalar r0c1, - SkScalar r0c2, - SkScalar r0c3, - SkScalar r1c0, - SkScalar r1c1, - SkScalar r1c2, - SkScalar r1c3, - SkScalar r2c0, - SkScalar r2c1, - SkScalar r2c2, - SkScalar r2c3, - SkScalar r3c0, - SkScalar r3c1, - SkScalar r3c2, - SkScalar r3c3) { + static Transform RowMajor(double r0c0, + double r0c1, + double r0c2, + double r0c3, + double r1c0, + double r1c1, + double r1c2, + double r1c3, + double r2c0, + double r2c1, + double r2c2, + double r2c3, + double r3c0, + double r3c1, + double r3c2, + double r3c3) { return Transform(r0c0, r1c0, r2c0, r3c0, // col 0 r0c1, r1c1, r2c1, r3c1, // col 1 r0c2, r1c2, r2c2, r3c2, // col 2 @@ -67,22 +67,22 @@ } // Creates a transform from explicit 16 matrix elements in col-major order. - static Transform ColMajor(SkScalar r0c0, - SkScalar r1c0, - SkScalar r2c0, - SkScalar r3c0, - SkScalar r0c1, - SkScalar r1c1, - SkScalar r2c1, - SkScalar r3c1, - SkScalar r0c2, - SkScalar r1c2, - SkScalar r2c2, - SkScalar r3c2, - SkScalar r0c3, - SkScalar r1c3, - SkScalar r2c3, - SkScalar r3c3) { + static Transform ColMajor(double r0c0, + double r1c0, + double r2c0, + double r3c0, + double r0c1, + double r1c1, + double r2c1, + double r3c1, + double r0c2, + double r1c2, + double r2c2, + double r3c2, + double r0c3, + double r1c3, + double r2c3, + double r3c3) { return Transform(r0c0, r1c0, r2c0, r3c0, // col 0 r0c1, r1c1, r2c1, r3c1, // col 1 r0c2, r1c2, r2c2, r3c2, // col 2 @@ -92,12 +92,12 @@ // TODO(crbug.com/1359528): This is temporary for unit tests to create an // arbitrary affine transform with values without specific meanings, before // the order of parameters of Affine() is fixed. - static Transform AffineForTesting(SkScalar v0, - SkScalar v1, - SkScalar v2, - SkScalar v3, - SkScalar v4, - SkScalar v5) { + static Transform AffineForTesting(double v0, + double v1, + double v2, + double v3, + double v4, + double v5) { return Affine(v0, v1, v2, v3, v4, v5); } @@ -105,12 +105,12 @@ explicit Transform(const Quaternion& q); // Creates a transform as a 2d translation. - static Transform MakeTranslation(SkScalar tx, SkScalar ty) { + static Transform MakeTranslation(double tx, double ty) { return Transform(1, 1, tx, ty); } // Creates a transform as a 2d scale. - static Transform MakeScale(SkScalar scale) { return MakeScale(scale, scale); } - static Transform MakeScale(SkScalar sx, SkScalar sy) { + static Transform MakeScale(double scale) { return MakeScale(scale, scale); } + static Transform MakeScale(double sx, double sy) { return Transform(sx, sy, 0, 0); } // Accurately rotate by 90, 180 or 270 degrees about the z axis. @@ -137,7 +137,7 @@ bool operator!=(const Transform& rhs) const { return !(*this == rhs); } // Gets a value at |row|, |col| from the matrix. - float rc(int row, int col) const { + double rc(int row, int col) const { if (LIKELY(!matrix_)) { float m[4][4] = {{axis_2d_.scale().x(), 0, 0, axis_2d_.translation().x()}, {0, axis_2d_.scale().y(), 0, axis_2d_.translation().y()}, @@ -149,7 +149,7 @@ } // Set a value in the matrix at |row|, |col|. - void set_rc(int row, int col, float v) { + void set_rc(int row, int col, double v) { EnsureFullMatrix().setRC(row, col, v); } @@ -181,29 +181,29 @@ // Applies the current transformation on a scaling and assigns the result // to |this|, i.e. this = this * scaling. - void Scale(SkScalar scale) { Scale(scale, scale); } - void Scale(SkScalar x, SkScalar y); - void Scale3d(SkScalar x, SkScalar y, SkScalar z); + void Scale(double scale) { Scale(scale, scale); } + void Scale(double x, double y); + void Scale3d(double x, double y, double z); // Applies a scale to the current transformation and assigns the result to // |this|, i.e. this = scaling * this. - void PostScale(SkScalar scale) { PostScale(scale, scale); } - void PostScale(SkScalar x, SkScalar y); - void PostScale3d(SkScalar x, SkScalar y, SkScalar z); + void PostScale(double scale) { PostScale(scale, scale); } + void PostScale(double x, double y); + void PostScale3d(double x, double y, double z); // Applies the current transformation on a translation and assigns the result // to |this|, i.e. this = this * translation. void Translate(const Vector2dF& offset); - void Translate(SkScalar x, SkScalar y); + void Translate(double x, double y); void Translate3d(const Vector3dF& offset); - void Translate3d(SkScalar x, SkScalar y, SkScalar z); + void Translate3d(double x, double y, double z); // Applies a translation to the current transformation and assigns the result // to |this|, i.e. this = translation * this. void PostTranslate(const Vector2dF& offset); - void PostTranslate(SkScalar x, SkScalar y); + void PostTranslate(double x, double y); void PostTranslate3d(const Vector3dF& offset); - void PostTranslate3d(SkScalar x, SkScalar y, SkScalar z); + void PostTranslate3d(double x, double y, double z); // The following methods have the "Pre" semantics, // i.e. this = this * operation. @@ -227,7 +227,7 @@ // Applies the current transformation on a perspective transform and assigns // the result to |this|. - void ApplyPerspectiveDepth(SkScalar depth); + void ApplyPerspectiveDepth(double depth); // Returns true if this is the identity matrix. // This function modifies a mutable variable in |matrix_|. @@ -250,8 +250,8 @@ // Returns true if the matrix is either identity or pure translation, // allowing for an amount of inaccuracy as specified by the parameter. - bool IsApproximatelyIdentityOrTranslation(SkScalar tolerance) const; - bool IsApproximatelyIdentityOrIntegerTranslation(SkScalar tolerance) const; + bool IsApproximatelyIdentityOrTranslation(double tolerance) const; + bool IsApproximatelyIdentityOrIntegerTranslation(double tolerance) const; // Returns true if the matrix is either a positive scale and/or a translation. bool IsPositiveScaleOrTranslation() const { @@ -361,6 +361,7 @@ // Applies the transformation to the vector. The results are clamped with // ClampFloatGeometry(). void TransformVector4(float vector[4]) const; + void TransformVector4(double vector[4]) const; // Returns the point with reverse transformation applied to `point`, clamped // with ClampFloatGeometry(), or `absl::nullopt` if the transformation cannot @@ -428,23 +429,22 @@ private: // Used internally to construct Transform with parameters in col-major order. - Transform(SkScalar r0c0, - SkScalar r1c0, - SkScalar r2c0, - SkScalar r3c0, - SkScalar r0c1, - SkScalar r1c1, - SkScalar r2c1, - SkScalar r3c1, - SkScalar r0c2, - SkScalar r1c2, - SkScalar r2c2, - SkScalar r3c2, - SkScalar r0c3, - SkScalar r1c3, - SkScalar r2c3, - SkScalar r3c3); - + Transform(double r0c0, + double r1c0, + double r2c0, + double r3c0, + double r0c1, + double r1c1, + double r2c1, + double r3c1, + double r0c2, + double r1c2, + double r2c2, + double r3c2, + double r0c3, + double r1c3, + double r2c3, + double r3c3); Transform(float scale_x, float scale_y, float trans_x, float trans_y); // TODO(crbug.com/1359528): This is temporarily private before the order of @@ -453,12 +453,12 @@ // (r0c0, r1c0, r0c1, r1c1, r0c3, r1c3). // Creates a transform from explicit 2d elements. All other matrix elements // remain the same as the corresponding elements of an identity matrix. - static Transform Affine(SkScalar r0c0, - SkScalar r0c1, - SkScalar r1c0, - SkScalar r1c1, - SkScalar x_translation, - SkScalar y_translation) { + static Transform Affine(double r0c0, + double r0c1, + double r1c0, + double r1c1, + double x_translation, + double y_translation) { return ColMajor(r0c0, r1c0, 0, 0, // col 0 r0c1, r1c1, 0, 0, // col 1 0, 0, 1, 0, // col 2
diff --git a/ui/gfx/geometry/transform_unittest.cc b/ui/gfx/geometry/transform_unittest.cc index db8502b..0059c2d 100644 --- a/ui/gfx/geometry/transform_unittest.cc +++ b/ui/gfx/geometry/transform_unittest.cc
@@ -298,7 +298,7 @@ Point3F p1 = xform.MapPoint(Point3F(value.x1, value.y1, 0)); Point3F p2(value.x2, value.y2, 0); if (value.degrees == value.degrees) { - EXPECT_TRUE(PointsAreNearlyEqual(p1, p2)); + EXPECT_POINT3F_NEAR(p1, p2, 0.0001f); } } }
diff --git a/ui/gfx/geometry/transform_util.cc b/ui/gfx/geometry/transform_util.cc index 9749aa09..374b1e5 100644 --- a/ui/gfx/geometry/transform_util.cc +++ b/ui/gfx/geometry/transform_util.cc
@@ -370,8 +370,8 @@ if (matrix.HasPerspective()) { // rhs is the right hand side of the equation. - SkScalar rhs[4] = {matrix.rc(3, 0), matrix.rc(3, 1), matrix.rc(3, 2), - matrix.rc(3, 3)}; + double rhs[4] = {matrix.rc(3, 0), matrix.rc(3, 1), matrix.rc(3, 2), + matrix.rc(3, 3)}; // Solve the equation by inverting perspectiveMatrix and multiplying // rhs by the inverse.
diff --git a/ui/gfx/image/image_skia_operations.cc b/ui/gfx/image/image_skia_operations.cc index c7bb10d..785649ef 100644 --- a/ui/gfx/image/image_skia_operations.cc +++ b/ui/gfx/image/image_skia_operations.cc
@@ -795,4 +795,21 @@ return gfx::CanvasImageSource::MakeImageSkia<ImageWithRoundRectClipSource>( radius, image); } + +ImageSkia ImageSkiaOperations::CreateCroppedCenteredRoundRectImage( + const Size& size, + int border_radius, + const ImageSkia& image) { + float scale = std::min(static_cast<float>(image.width()) / size.width(), + static_cast<float>(image.height()) / size.height()); + Size scaled_size = {base::ClampFloor(scale * size.width()), + base::ClampFloor(scale * size.height())}; + Rect bounds{{0, 0}, image.size()}; + bounds.ClampToCenteredSize(scaled_size); + auto scaled_and_cropped_image = CreateTiledImage( + image, bounds.x(), bounds.y(), bounds.width(), bounds.height()); + auto resized_image = CreateResizedImage( + scaled_and_cropped_image, skia::ImageOperations::RESIZE_LANCZOS3, size); + return CreateImageWithRoundRectClip(border_radius, resized_image); +} } // namespace gfx
diff --git a/ui/gfx/image/image_skia_operations.h b/ui/gfx/image/image_skia_operations.h index 6f9333a..a74d762 100644 --- a/ui/gfx/image/image_skia_operations.h +++ b/ui/gfx/image/image_skia_operations.h
@@ -123,6 +123,13 @@ static ImageSkia CreateImageWithRoundRectClip(int radius, const ImageSkia& image); + // Returns an image of `size` that contains as much of `image` as possible + // without distorting the `image`. That result is clipped to a roundrect with + // radius `border_radius`. + static ImageSkia CreateCroppedCenteredRoundRectImage(const Size& size, + int border_radius, + const ImageSkia& image); + private: ImageSkiaOperations(); // Class for scoping only. };
diff --git a/ui/latency/latency_info.cc b/ui/latency/latency_info.cc index 60b59a7..dd76d2a 100644 --- a/ui/latency/latency_info.cc +++ b/ui/latency/latency_info.cc
@@ -92,8 +92,8 @@ if (latency_info.size() > kMaxLatencyInfoNumber) { LOG(ERROR) << referring_msg << ", LatencyInfo vector size " << latency_info.size() << " is too big."; - TRACE_EVENT_INSTANT1("input,benchmark", "LatencyInfo::Verify Fails", - TRACE_EVENT_SCOPE_GLOBAL, + TRACE_EVENT_INSTANT1("input,benchmark,latencyInfo", + "LatencyInfo::Verify Fails", TRACE_EVENT_SCOPE_GLOBAL, "size", latency_info.size()); return false; } @@ -108,7 +108,7 @@ continue; TRACE_EVENT( - "input,benchmark", "LatencyInfo.Flow", + "input,benchmark,latencyInfo", "LatencyInfo.Flow", [&latency, &step](perfetto::EventContext ctx) { ChromeLatencyInfo* info = ctx.event()->set_chrome_latency_info(); info->set_step(step); @@ -195,7 +195,7 @@ perfetto::Track::Global(trace_id_), ts); } - TRACE_EVENT("input,benchmark", "LatencyInfo.Flow", + TRACE_EVENT("input,benchmark,latencyInfo", "LatencyInfo.Flow", [this](perfetto::EventContext ctx) { ChromeLatencyInfo* info = ctx.event()->set_chrome_latency_info(); @@ -251,7 +251,7 @@ }); } - TRACE_EVENT("input,benchmark", "LatencyInfo.Flow", + TRACE_EVENT("input,benchmark,latencyInfo", "LatencyInfo.Flow", [this](perfetto::EventContext ctx) { ChromeLatencyInfo* info = ctx.event()->set_chrome_latency_info();
diff --git a/ui/views/bubble/bubble_frame_view.cc b/ui/views/bubble/bubble_frame_view.cc index 106a757..b0fe19b 100644 --- a/ui/views/bubble/bubble_frame_view.cc +++ b/ui/views/bubble/bubble_frame_view.cc
@@ -53,26 +53,6 @@ namespace { -// Returns an image of `size` that contains as much of `image` as possible -// without distorting the `image`. That result is clipped to a roundrect with -// radius `border_radius`. -gfx::ImageSkia CreateMainImage(const gfx::Size& size, - int border_radius, - const gfx::ImageSkia& image) { - float scale = std::min(static_cast<float>(image.width()) / size.width(), - static_cast<float>(image.height()) / size.height()); - gfx::Size scaled_size = {base::ClampFloor(scale * size.width()), - base::ClampFloor(scale * size.height())}; - gfx::Rect bounds{{0, 0}, image.size()}; - bounds.ClampToCenteredSize(scaled_size); - auto scaled_and_cropped_image = gfx::ImageSkiaOperations::CreateTiledImage( - image, bounds.x(), bounds.y(), bounds.width(), bounds.height()); - auto resized_image = gfx::ImageSkiaOperations::CreateResizedImage( - scaled_and_cropped_image, skia::ImageOperations::RESIZE_LANCZOS3, size); - return gfx::ImageSkiaOperations::CreateImageWithRoundRectClip(border_radius, - resized_image); -} - // Get the |vertical| or horizontal amount that |available_bounds| overflows // |window_bounds|. int GetOverflowLength(const gfx::Rect& available_bounds, @@ -408,9 +388,10 @@ const int border_radius = LayoutProvider::Get()->GetCornerRadiusMetric( Emphasis::kHigh, gfx::Size()); main_image_->SetImage( - CreateMainImage(gfx::Size(kMainImageDimension, kMainImageDimension), - border_radius - 2 * kBorderStrokeThickness, - model.GetImage().AsImageSkia())); + gfx::ImageSkiaOperations::CreateCroppedCenteredRoundRectImage( + gfx::Size(kMainImageDimension, kMainImageDimension), + border_radius - 2 * kBorderStrokeThickness, + model.GetImage().AsImageSkia())); main_image_->SetBorder(views::CreateRoundedRectBorder( kBorderStrokeThickness, border_radius, gfx::Insets(kBorderInsets - kBorderStrokeThickness),
diff --git a/ui/views/test/widget_test.cc b/ui/views/test/widget_test.cc index 1674559..f548e5ef 100644 --- a/ui/views/test/widget_test.cc +++ b/ui/views/test/widget_test.cc
@@ -33,6 +33,8 @@ return children; } +} // namespace + View* AnyViewMatchingPredicate(View* view, const ViewPredicate& predicate) { if (predicate.Run(view)) return view; @@ -48,8 +50,6 @@ return nullptr; } -} // namespace - View* AnyViewMatchingPredicate(Widget* widget, const ViewPredicate& predicate) { return AnyViewMatchingPredicate(widget->GetRootView(), predicate); }
diff --git a/ui/views/test/widget_test.h b/ui/views/test/widget_test.h index 71061c3..ee6d544 100644 --- a/ui/views/test/widget_test.h +++ b/ui/views/test/widget_test.h
@@ -54,6 +54,11 @@ // randomly choose a child to return, so make sure your predicate matches // *only* the view you want! using ViewPredicate = base::RepeatingCallback<bool(const View*)>; +View* AnyViewMatchingPredicate(View* root, const ViewPredicate& predicate); +template <typename Pred> +View* AnyViewMatchingPredicate(View* root, Pred predicate) { + return AnyViewMatchingPredicate(root, base::BindLambdaForTesting(predicate)); +} View* AnyViewMatchingPredicate(Widget* widget, const ViewPredicate& predicate); template <typename Pred> View* AnyViewMatchingPredicate(Widget* widget, Pred predicate) {