0

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:
Max Schmitt
2021-06-08 20:00:20 +00:00
committed by Chromium LUCI CQ
parent e6a9c4ef3c
commit 23bdf7529f
8 changed files with 83 additions and 4 deletions

@ -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(

@ -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

@ -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: [