Apply override for forced-colors media query
DevTools exposes `Emulation.setEmulatedMedia` which allows to emulate media features. This patch adds support for forced-colors. Bug: 1216780 Change-Id: If07cc0a35cfc86da386f9fd41b4a7a492f7bf02c Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2941047 Reviewed-by: Pavel Feldman <pfeldman@chromium.org> Reviewed-by: Andrey Kosyakov <caseq@chromium.org> Commit-Queue: Pavel Feldman <pfeldman@chromium.org> Cr-Commit-Position: refs/heads/master@{#890407}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
e6a9c4ef3c
commit
23bdf7529f
1
AUTHORS
1
AUTHORS
@ -715,6 +715,7 @@ Matthias Reitinger <reimarvin@gmail.com>
|
||||
Matthieu Rigolot <matthieu.rigolot@gmail.com>
|
||||
Matthieu Vlad Hauglustaine <matt.hauglustaine@gmail.com>
|
||||
Max Perepelitsyn <pph34r@gmail.com>
|
||||
Max Schmitt <max@schmitt.mx>
|
||||
Max Vujovic <mvujovic@adobe.com>
|
||||
Mayank Gupta <mayank.g1@samsung.com>
|
||||
Mayur Kankanwadi <mayurk.vk@samsung.com>
|
||||
|
@ -28,6 +28,20 @@
|
||||
|
||||
namespace blink {
|
||||
|
||||
namespace {
|
||||
static ForcedColors CSSValueIDToForcedColors(CSSValueID id) {
|
||||
switch (id) {
|
||||
case CSSValueID::kActive:
|
||||
return ForcedColors::kActive;
|
||||
case CSSValueID::kNone:
|
||||
return ForcedColors::kNone;
|
||||
default:
|
||||
NOTREACHED();
|
||||
return ForcedColors::kNone;
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
|
||||
mojom::blink::PreferredColorScheme CSSValueIDToPreferredColorScheme(
|
||||
CSSValueID id) {
|
||||
switch (id) {
|
||||
@ -241,7 +255,14 @@ bool MediaValues::CalculatePrefersReducedData(LocalFrame* frame) {
|
||||
!frame->GetSettings()->GetDataSaverHoldbackWebApi());
|
||||
}
|
||||
|
||||
ForcedColors MediaValues::CalculateForcedColors() {
|
||||
ForcedColors MediaValues::CalculateForcedColors(LocalFrame* frame) {
|
||||
DCHECK(frame);
|
||||
DCHECK(frame->GetSettings());
|
||||
if (const auto* overrides = frame->GetPage()->GetMediaFeatureOverrides()) {
|
||||
MediaQueryExpValue value = overrides->GetOverride("forced-colors");
|
||||
if (value.IsValid())
|
||||
return CSSValueIDToForcedColors(value.id);
|
||||
}
|
||||
if (Platform::Current() && Platform::Current()->ThemeEngine())
|
||||
return Platform::Current()->ThemeEngine()->GetForcedColors();
|
||||
else
|
||||
|
@ -120,7 +120,7 @@ class CORE_EXPORT MediaValues : public GarbageCollected<MediaValues> {
|
||||
LocalFrame*);
|
||||
static bool CalculatePrefersReducedMotion(LocalFrame*);
|
||||
static bool CalculatePrefersReducedData(LocalFrame*);
|
||||
static ForcedColors CalculateForcedColors();
|
||||
static ForcedColors CalculateForcedColors(LocalFrame*);
|
||||
static NavigationControls CalculateNavigationControls(LocalFrame*);
|
||||
static ScreenSpanning CalculateScreenSpanning(LocalFrame*);
|
||||
static DevicePosture CalculateDevicePosture(LocalFrame*);
|
||||
|
@ -83,7 +83,7 @@ MediaValuesCached::MediaValuesCachedData::MediaValuesCachedData(
|
||||
preferred_contrast = MediaValues::CalculatePreferredContrast(frame);
|
||||
prefers_reduced_motion = MediaValues::CalculatePrefersReducedMotion(frame);
|
||||
prefers_reduced_data = MediaValues::CalculatePrefersReducedData(frame);
|
||||
forced_colors = MediaValues::CalculateForcedColors();
|
||||
forced_colors = MediaValues::CalculateForcedColors(frame);
|
||||
navigation_controls = MediaValues::CalculateNavigationControls(frame);
|
||||
screen_spanning = MediaValues::CalculateScreenSpanning(frame);
|
||||
device_posture = MediaValues::CalculateDevicePosture(frame);
|
||||
|
@ -158,7 +158,7 @@ bool MediaValuesDynamic::PrefersReducedData() const {
|
||||
}
|
||||
|
||||
ForcedColors MediaValuesDynamic::GetForcedColors() const {
|
||||
return CalculateForcedColors();
|
||||
return CalculateForcedColors(frame_);
|
||||
}
|
||||
|
||||
NavigationControls MediaValuesDynamic::GetNavigationControls() const {
|
||||
|
@ -1840,6 +1840,48 @@ TEST_F(StyleEngineTest, MediaQueriesChangeForcedColorsAndPreferredColorScheme) {
|
||||
GetCSSPropertyColor()));
|
||||
}
|
||||
|
||||
TEST_F(StyleEngineTest, MediaQueriesForcedColorsOverride) {
|
||||
GetDocument().body()->setInnerHTML(R"HTML(
|
||||
<style>
|
||||
body {
|
||||
forced-color-adjust: none;
|
||||
}
|
||||
@media (forced-colors: none) {
|
||||
body { color: red }
|
||||
}
|
||||
@media (forced-colors: active) {
|
||||
body { color: green }
|
||||
}
|
||||
</style>
|
||||
<body></body>
|
||||
)HTML");
|
||||
|
||||
UpdateAllLifecyclePhases();
|
||||
EXPECT_EQ(MakeRGB(255, 0, 0),
|
||||
GetDocument().body()->GetComputedStyle()->VisitedDependentColor(
|
||||
GetCSSPropertyColor()));
|
||||
|
||||
ColorSchemeHelper color_scheme_helper(GetDocument());
|
||||
GetDocument().GetPage()->SetMediaFeatureOverride("forced-colors", "active");
|
||||
|
||||
UpdateAllLifecyclePhases();
|
||||
EXPECT_EQ(MakeRGB(0, 128, 0),
|
||||
GetDocument().body()->GetComputedStyle()->VisitedDependentColor(
|
||||
GetCSSPropertyColor()));
|
||||
|
||||
GetDocument().GetPage()->SetMediaFeatureOverride("forced-colors", "none");
|
||||
UpdateAllLifecyclePhases();
|
||||
EXPECT_EQ(MakeRGB(255, 0, 0),
|
||||
GetDocument().body()->GetComputedStyle()->VisitedDependentColor(
|
||||
GetCSSPropertyColor()));
|
||||
|
||||
GetDocument().GetPage()->ClearMediaFeatureOverrides();
|
||||
UpdateAllLifecyclePhases();
|
||||
EXPECT_EQ(MakeRGB(255, 0, 0),
|
||||
GetDocument().body()->GetComputedStyle()->VisitedDependentColor(
|
||||
GetCSSPropertyColor()));
|
||||
}
|
||||
|
||||
TEST_F(StyleEngineTest, MediaQueriesColorSchemeOverride) {
|
||||
ColorSchemeHelper color_scheme_helper(GetDocument());
|
||||
color_scheme_helper.SetPreferredColorScheme(
|
||||
|
8
third_party/blink/web_tests/inspector-protocol/emulation/set-css-media-feature-override-expected.txt
vendored
8
third_party/blink/web_tests/inspector-protocol/emulation/set-css-media-feature-override-expected.txt
vendored
@ -25,6 +25,14 @@ matchMedia("(color-gamut: rec2020)").matches: true
|
||||
matchMedia("(color-gamut: rec2020)").matches applied: 7px x 7px
|
||||
matchMedia("(color-gamut: __invalid__)").matches: false
|
||||
matchMedia("(color-gamut: __invalid__)").matches applied: 3px x 2px
|
||||
matchMedia("(forced-colors: __invalid__)").matches: false
|
||||
matchMedia("(forced-colors: __invalid__)").matches applied: 3px x 2px
|
||||
matchMedia("(forced-colors: active)").matches: true
|
||||
matchMedia("(forced-colors: active)").matches applied: 3px x 2px
|
||||
matchMedia("(forced-colors: none)").matches: true
|
||||
matchMedia("(forced-colors: none)").matches applied: 3px x 2px
|
||||
matchMedia("(forced-colors: __invalid__)").matches: false
|
||||
matchMedia("(forced-colors: __invalid__)").matches applied: 3px x 2px
|
||||
matchMedia("(prefers-color-scheme: dark) and (prefers-reduced-motion: reduce)").matches: true
|
||||
matchMedia("(prefers-color-scheme: dark) and (prefers-reduced-motion: reduce)").matches applied: 999px x 999px
|
||||
matchMedia("(prefers-color-scheme: __invalid__)").matches: false
|
||||
|
7
third_party/blink/web_tests/inspector-protocol/emulation/set-css-media-feature-override.js
vendored
7
third_party/blink/web_tests/inspector-protocol/emulation/set-css-media-feature-override.js
vendored
@ -56,6 +56,13 @@
|
||||
await setEmulatedMediaFeature('color-gamut', 'rec2020');
|
||||
await setEmulatedMediaFeature('color-gamut', '__invalid__');
|
||||
|
||||
// Test `forced-colors`.
|
||||
// https://drafts.csswg.org/mediaqueries-5/#forced-colors
|
||||
await setEmulatedMediaFeature('forced-colors', '__invalid__');
|
||||
await setEmulatedMediaFeature('forced-colors', 'active');
|
||||
await setEmulatedMediaFeature('forced-colors', 'none');
|
||||
await setEmulatedMediaFeature('forced-colors', '__invalid__');
|
||||
|
||||
// Test combinations.
|
||||
await setEmulatedMediaFeatures({
|
||||
features: [
|
||||
|
Reference in New Issue
Block a user