Commit 6239e9de authored by Alison Maher's avatar Alison Maher Committed by Commit Bot

Implement prefers-contrast media query

This change adds support for the prefers-contrast media query and adds
PreferredContrast to settings. The logic for updating PreferredContrast
from its default state based on the OS will be implemented in a
follow-up change.

Spec:
https://drafts.csswg.org/mediaqueries-5/#prefers-contrast

Intent to prototype:
https://groups.google.com/a/chromium.org/g/blink-dev/c/I0e2_nAwW7E

Bug: 1107431
Change-Id: Ie09df9069c979caf944d8af1d5f6bde80f40e8ea
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2410646
Commit-Queue: Alison Maher <almaher@microsoft.com>
Reviewed-by: default avatarRune Lillesveen <futhark@chromium.org>
Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Cr-Commit-Position: refs/heads/master@{#818576}
parent 2d15f3f1
......@@ -42,6 +42,7 @@ mojom("mojom_platform") {
"crash/crash_memory_metrics_reporter.mojom",
"credentialmanager/credential_manager.mojom",
"css/preferred_color_scheme.mojom",
"css/preferred_contrast.mojom",
"devtools/console_message.mojom",
"devtools/devtools_agent.mojom",
"devtools/devtools_frontend.mojom",
......
// Copyright 2020 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.
module blink.mojom;
// Spec: https://drafts.csswg.org/mediaqueries-5/#prefers-contrast
enum PreferredContrast {
kMore,
kLess,
kNoPreference,
};
\ No newline at end of file
......@@ -35,6 +35,7 @@
#include "third_party/blink/public/common/css/navigation_controls.h"
#include "third_party/blink/public/common/web_preferences/web_preferences.h"
#include "third_party/blink/public/mojom/css/preferred_contrast.mojom-forward.h"
#include "third_party/blink/public/mojom/v8_cache_options.mojom-forward.h"
#include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom-forward.h"
#include "third_party/blink/public/platform/web_common.h"
......@@ -275,6 +276,7 @@ class WebSettings {
virtual void SetLazyImageFirstKFullyLoad4G(int) = 0;
virtual void SetForceDarkModeEnabled(bool) = 0;
virtual void SetPreferredColorScheme(blink::mojom::PreferredColorScheme) = 0;
virtual void SetPreferredContrast(mojom::PreferredContrast) = 0;
virtual void SetNavigationControls(NavigationControls) = 0;
virtual void SetAriaModalPrunesAXTree(bool) = 0;
virtual void SetUseAXMenuList(bool) = 0;
......
......@@ -925,6 +925,9 @@
"jis-b5"
"jis-b4"
"hidden-matchable"
"more"
"less"
"forced"
# at-rules
"@charset"
......
......@@ -1441,5 +1441,11 @@
// always
// both
"force",
// (prefers-contrast:) media feature
// no-preference
"more",
"less",
"forced",
],
}
......@@ -53,6 +53,7 @@
"origin-trial-test",
"pointer",
"prefers-color-scheme",
"prefers-contrast",
"prefers-reduced-motion",
"prefers-reduced-data",
"resolution",
......
......@@ -32,7 +32,6 @@
#include "third_party/blink/public/common/css/forced_colors.h"
#include "third_party/blink/public/common/css/navigation_controls.h"
#include "third_party/blink/public/common/css/screen_spanning.h"
#include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink-forward.h"
#include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h"
#include "third_party/blink/renderer/core/css/css_primitive_value.h"
#include "third_party/blink/renderer/core/css/css_resolution_units.h"
......@@ -865,6 +864,37 @@ static bool PrefersColorSchemeMediaFeatureEval(
value.id == CSSValueID::kLight);
}
static bool PrefersContrastMediaFeatureEval(const MediaQueryExpValue& value,
MediaFeaturePrefix,
const MediaValues& media_values) {
auto preferred_contrast = media_values.GetPreferredContrast();
ForcedColors forced_colors = media_values.GetForcedColors();
if (!value.IsValid()) {
return forced_colors != ForcedColors::kNone ||
preferred_contrast != mojom::blink::PreferredContrast::kNoPreference;
}
if (!value.is_id)
return false;
switch (value.id) {
case CSSValueID::kForced:
return forced_colors == ForcedColors::kActive;
case CSSValueID::kMore:
return preferred_contrast == mojom::blink::PreferredContrast::kMore;
case CSSValueID::kLess:
return preferred_contrast == mojom::blink::PreferredContrast::kLess;
case CSSValueID::kNoPreference:
return forced_colors != ForcedColors::kActive &&
preferred_contrast ==
mojom::blink::PreferredContrast::kNoPreference;
default:
NOTREACHED();
return false;
}
}
static bool ForcedColorsMediaFeatureEval(const MediaQueryExpValue& value,
MediaFeaturePrefix,
const MediaValues& media_values) {
......
......@@ -187,6 +187,60 @@ MediaQueryEvaluatorTestCase g_forcedcolors_none_cases[] = {
{nullptr, 0} // Do not remove the terminator line.
};
MediaQueryEvaluatorTestCase g_preferscontrast_nopreference_cases[] = {
{"(prefers-contrast)", 0},
{"(prefers-contrast: more)", 0},
{"(prefers-contrast: less)", 0},
{"(prefers-contrast: forced)", 0},
{"(prefers-contrast: no-preference)", 1},
{nullptr, 0} // Do not remove the terminator line.
};
MediaQueryEvaluatorTestCase g_preferscontrast_more_cases[] = {
{"(prefers-contrast)", 1},
{"(prefers-contrast: more)", 1},
{"(prefers-contrast: less)", 0},
{"(prefers-contrast: forced)", 0},
{"(prefers-contrast: no-preference)", 0},
{nullptr, 0} // Do not remove the terminator line.
};
MediaQueryEvaluatorTestCase g_preferscontrast_less_cases[] = {
{"(prefers-contrast)", 1},
{"(prefers-contrast: more)", 0},
{"(prefers-contrast: less)", 1},
{"(prefers-contrast: forced)", 0},
{"(prefers-contrast: no-preference)", 0},
{nullptr, 0} // Do not remove the terminator line.
};
MediaQueryEvaluatorTestCase g_preferscontrast_forced_cases[] = {
{"(prefers-contrast)", 1},
{"(prefers-contrast: more)", 0},
{"(prefers-contrast: less)", 0},
{"(prefers-contrast: forced)", 1},
{"(prefers-contrast: no-preference)", 0},
{nullptr, 0} // Do not remove the terminator line.
};
MediaQueryEvaluatorTestCase g_preferscontrast_forced_more_cases[] = {
{"(prefers-contrast)", 1},
{"(prefers-contrast: more)", 1},
{"(prefers-contrast: less)", 0},
{"(prefers-contrast: forced)", 1},
{"(prefers-contrast: no-preference)", 0},
{nullptr, 0} // Do not remove the terminator line.
};
MediaQueryEvaluatorTestCase g_preferscontrast_forced_less_cases[] = {
{"(prefers-contrast)", 1},
{"(prefers-contrast: more)", 0},
{"(prefers-contrast: less)", 1},
{"(prefers-contrast: forced)", 1},
{"(prefers-contrast: no-preference)", 0},
{nullptr, 0} // Do not remove the terminator line.
};
MediaQueryEvaluatorTestCase g_navigationcontrols_back_button_cases[] = {
{"(navigation-controls: back-button)", 1},
{"(navigation-controls: none)", 0},
......@@ -398,6 +452,61 @@ TEST(MediaQueryEvaluatorTest, CachedForcedColors) {
}
}
TEST(MediaQueryEvaluatorTest, CachedPrefersContrast) {
ScopedForcedColorsForTest forced_scoped_feature(true);
ScopedPrefersContrastForTest contrast_scoped_feature(true);
MediaValuesCached::MediaValuesCachedData data;
data.forced_colors = ForcedColors::kNone;
data.preferred_contrast = mojom::blink::PreferredContrast::kNoPreference;
MediaValues* media_values = MakeGarbageCollected<MediaValuesCached>(data);
// Prefers-contrast - no-preference.
MediaQueryEvaluator media_query_evaluator(*media_values);
TestMQEvaluator(g_preferscontrast_nopreference_cases, media_query_evaluator);
// Prefers-contrast - more.
{
data.preferred_contrast = mojom::blink::PreferredContrast::kMore;
MediaValues* media_values = MakeGarbageCollected<MediaValuesCached>(data);
MediaQueryEvaluator media_query_evaluator(*media_values);
TestMQEvaluator(g_preferscontrast_more_cases, media_query_evaluator);
}
// Prefers-contrast - less.
{
data.preferred_contrast = mojom::blink::PreferredContrast::kLess;
MediaValues* media_values = MakeGarbageCollected<MediaValuesCached>(data);
MediaQueryEvaluator media_query_evaluator(*media_values);
TestMQEvaluator(g_preferscontrast_less_cases, media_query_evaluator);
}
// Prefers-contrast - forced.
{
data.preferred_contrast = mojom::blink::PreferredContrast::kNoPreference;
data.forced_colors = ForcedColors::kActive;
MediaValues* media_values = MakeGarbageCollected<MediaValuesCached>(data);
MediaQueryEvaluator media_query_evaluator(*media_values);
TestMQEvaluator(g_preferscontrast_forced_cases, media_query_evaluator);
}
// Prefers-contrast - forced and more.
{
data.preferred_contrast = mojom::blink::PreferredContrast::kMore;
MediaValues* media_values = MakeGarbageCollected<MediaValuesCached>(data);
MediaQueryEvaluator media_query_evaluator(*media_values);
TestMQEvaluator(g_preferscontrast_forced_more_cases, media_query_evaluator);
}
// Prefers-contrast - forced and less.
{
data.preferred_contrast = mojom::blink::PreferredContrast::kLess;
MediaValues* media_values = MakeGarbageCollected<MediaValuesCached>(data);
MediaQueryEvaluator media_query_evaluator(*media_values);
TestMQEvaluator(g_preferscontrast_forced_less_cases, media_query_evaluator);
}
}
TEST(MediaQueryEvaluatorTest, CachedScreenSpanning) {
ScopedCSSFoldablesForTest scoped_feature(true);
......
......@@ -79,6 +79,13 @@ static inline bool FeatureWithValidIdent(const String& media_feature,
if (media_feature == media_feature_names::kPrefersColorSchemeMediaFeature)
return ident == CSSValueID::kDark || ident == CSSValueID::kLight;
if (RuntimeEnabledFeatures::PrefersContrastEnabled()) {
if (media_feature == media_feature_names::kPrefersContrastMediaFeature) {
return ident == CSSValueID::kNoPreference || ident == CSSValueID::kMore ||
ident == CSSValueID::kLess || ident == CSSValueID::kForced;
}
}
if (media_feature == media_feature_names::kPrefersReducedMotionMediaFeature)
return ident == CSSValueID::kNoPreference || ident == CSSValueID::kReduce;
......@@ -219,6 +226,8 @@ static inline bool FeatureWithoutValue(
media_feature == media_feature_names::kImmersiveMediaFeature ||
media_feature ==
media_feature_names::kPrefersColorSchemeMediaFeature ||
(media_feature == media_feature_names::kPrefersContrastMediaFeature &&
RuntimeEnabledFeatures::PrefersContrastEnabled()) ||
media_feature ==
media_feature_names::kPrefersReducedMotionMediaFeature ||
(media_feature ==
......
......@@ -6,7 +6,6 @@
#include "third_party/blink/public/common/css/screen_spanning.h"
#include "third_party/blink/public/common/widget/screen_info.h"
#include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/public/platform/web_theme_engine.h"
#include "third_party/blink/renderer/core/css/css_resolution_units.h"
......@@ -196,6 +195,13 @@ mojom::blink::PreferredColorScheme MediaValues::CalculatePreferredColorScheme(
return frame->GetDocument()->GetStyleEngine().GetPreferredColorScheme();
}
mojom::blink::PreferredContrast MediaValues::CalculatePreferredContrast(
LocalFrame* frame) {
DCHECK(frame);
DCHECK(frame->GetSettings());
return frame->GetSettings()->GetPreferredContrast();
}
bool MediaValues::CalculatePrefersReducedMotion(LocalFrame* frame) {
DCHECK(frame);
DCHECK(frame->GetSettings());
......
......@@ -6,6 +6,7 @@
#define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_MEDIA_VALUES_H_
#include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink-forward.h"
#include "third_party/blink/public/mojom/css/preferred_contrast.mojom-blink-forward.h"
#include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/css/css_primitive_value.h"
......@@ -19,7 +20,6 @@ class CSSPrimitiveValue;
class LocalFrame;
enum class CSSValueID;
enum class ColorSpaceGamut;
enum class PreferredColorScheme;
enum class ForcedColors;
enum class NavigationControls;
enum class ScreenSpanning;
......@@ -85,6 +85,7 @@ class CORE_EXPORT MediaValues : public GarbageCollected<MediaValues> {
virtual ColorSpaceGamut ColorGamut() const = 0;
virtual mojom::blink::PreferredColorScheme GetPreferredColorScheme()
const = 0;
virtual mojom::blink::PreferredContrast GetPreferredContrast() const = 0;
virtual bool PrefersReducedMotion() const = 0;
virtual bool PrefersReducedData() const = 0;
virtual ForcedColors GetForcedColors() const = 0;
......@@ -112,6 +113,8 @@ class CORE_EXPORT MediaValues : public GarbageCollected<MediaValues> {
static ColorSpaceGamut CalculateColorGamut(LocalFrame*);
static mojom::blink::PreferredColorScheme CalculatePreferredColorScheme(
LocalFrame*);
static mojom::blink::PreferredContrast CalculatePreferredContrast(
LocalFrame*);
static bool CalculatePrefersReducedMotion(LocalFrame*);
static bool CalculatePrefersReducedData(LocalFrame*);
static ForcedColors CalculateForcedColors();
......
......@@ -8,6 +8,7 @@
#include "third_party/blink/public/common/css/navigation_controls.h"
#include "third_party/blink/public/common/css/screen_spanning.h"
#include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink.h"
#include "third_party/blink/public/mojom/css/preferred_contrast.mojom-blink.h"
#include "third_party/blink/renderer/core/css/css_primitive_value.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
......@@ -35,6 +36,7 @@ MediaValuesCached::MediaValuesCachedData::MediaValuesCachedData()
display_mode(blink::mojom::DisplayMode::kBrowser),
color_gamut(ColorSpaceGamut::kUnknown),
preferred_color_scheme(mojom::blink::PreferredColorScheme::kLight),
preferred_contrast(mojom::blink::PreferredContrast::kNoPreference),
prefers_reduced_motion(false),
forced_colors(ForcedColors::kNone),
navigation_controls(NavigationControls::kNone),
......@@ -77,6 +79,7 @@ MediaValuesCached::MediaValuesCachedData::MediaValuesCachedData(
media_type = MediaValues::CalculateMediaType(frame);
color_gamut = MediaValues::CalculateColorGamut(frame);
preferred_color_scheme = MediaValues::CalculatePreferredColorScheme(frame);
preferred_contrast = MediaValues::CalculatePreferredContrast(frame);
prefers_reduced_motion = MediaValues::CalculatePrefersReducedMotion(frame);
prefers_reduced_data = MediaValues::CalculatePrefersReducedData(frame);
forced_colors = MediaValues::CalculateForcedColors();
......@@ -197,6 +200,11 @@ mojom::blink::PreferredColorScheme MediaValuesCached::GetPreferredColorScheme()
return data_.preferred_color_scheme;
}
mojom::blink::PreferredContrast MediaValuesCached::GetPreferredContrast()
const {
return data_.preferred_contrast;
}
bool MediaValuesCached::PrefersReducedMotion() const {
return data_.prefers_reduced_motion;
}
......
......@@ -5,7 +5,6 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_MEDIA_VALUES_CACHED_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_MEDIA_VALUES_CACHED_H_
#include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink-forward.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/css/media_values.h"
#include "third_party/blink/renderer/platform/wtf/cross_thread_copier.h"
......@@ -37,6 +36,7 @@ class CORE_EXPORT MediaValuesCached final : public MediaValues {
blink::mojom::DisplayMode display_mode;
ColorSpaceGamut color_gamut;
mojom::blink::PreferredColorScheme preferred_color_scheme;
mojom::blink::PreferredContrast preferred_contrast;
bool prefers_reduced_motion;
bool prefers_reduced_data = false;
ForcedColors forced_colors;
......@@ -67,6 +67,7 @@ class CORE_EXPORT MediaValuesCached final : public MediaValues {
data.display_mode = display_mode;
data.color_gamut = color_gamut;
data.preferred_color_scheme = preferred_color_scheme;
data.preferred_contrast = preferred_contrast;
data.prefers_reduced_motion = prefers_reduced_motion;
data.prefers_reduced_data = prefers_reduced_data;
data.forced_colors = forced_colors;
......@@ -108,6 +109,7 @@ class CORE_EXPORT MediaValuesCached final : public MediaValues {
blink::mojom::DisplayMode DisplayMode() const override;
ColorSpaceGamut ColorGamut() const override;
mojom::blink::PreferredColorScheme GetPreferredColorScheme() const override;
mojom::blink::PreferredContrast GetPreferredContrast() const override;
bool PrefersReducedMotion() const override;
bool PrefersReducedData() const override;
ForcedColors GetForcedColors() const override;
......
......@@ -6,7 +6,6 @@
#include "third_party/blink/public/common/css/forced_colors.h"
#include "third_party/blink/public/common/css/navigation_controls.h"
#include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink-forward.h"
#include "third_party/blink/renderer/core/css/css_primitive_value.h"
#include "third_party/blink/renderer/core/css/css_resolution_units.h"
#include "third_party/blink/renderer/core/css/css_to_length_conversion_data.h"
......@@ -145,6 +144,11 @@ mojom::blink::PreferredColorScheme MediaValuesDynamic::GetPreferredColorScheme()
return CalculatePreferredColorScheme(frame_);
}
mojom::blink::PreferredContrast MediaValuesDynamic::GetPreferredContrast()
const {
return CalculatePreferredContrast(frame_);
}
bool MediaValuesDynamic::PrefersReducedMotion() const {
return CalculatePrefersReducedMotion(frame_);
}
......
......@@ -48,6 +48,7 @@ class CORE_EXPORT MediaValuesDynamic : public MediaValues {
blink::mojom::DisplayMode DisplayMode() const override;
ColorSpaceGamut ColorGamut() const override;
mojom::blink::PreferredColorScheme GetPreferredColorScheme() const override;
mojom::blink::PreferredContrast GetPreferredContrast() const override;
bool PrefersReducedMotion() const override;
bool PrefersReducedData() const override;
ForcedColors GetForcedColors() const override;
......
......@@ -9,7 +9,6 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/css/forced_colors.h"
#include "third_party/blink/public/common/css/navigation_controls.h"
#include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink-forward.h"
#include "third_party/blink/public/platform/web_theme_engine.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_shadow_root_init.h"
......@@ -1544,6 +1543,125 @@ TEST_F(StyleEngineTest, MediaQueriesChangeColorSchemeForcedDarkMode) {
GetCSSPropertyColor()));
}
TEST_F(StyleEngineTest, MediaQueriesChangePrefersContrast) {
ScopedForcedColorsForTest forced_scoped_feature(true);
ScopedPrefersContrastForTest contrast_scoped_feature(true);
ColorSchemeHelper color_scheme_helper(GetDocument());
color_scheme_helper.SetPreferredContrast(
mojom::blink::PreferredContrast::kNoPreference);
color_scheme_helper.SetForcedColors(GetDocument(), ForcedColors::kNone);
GetDocument().body()->setInnerHTML(R"HTML(
<style>
body { color: red; forced-color-adjust: none; }
@media (prefers-contrast: no-preference) {
body { color: green }
}
@media (prefers-contrast) {
body { color: blue }
}
</style>
<body></body>
)HTML");
UpdateAllLifecyclePhases();
EXPECT_EQ(MakeRGB(0, 128, 0),
GetDocument().body()->GetComputedStyle()->VisitedDependentColor(
GetCSSPropertyColor()));
color_scheme_helper.SetPreferredContrast(
mojom::blink::PreferredContrast::kMore);
UpdateAllLifecyclePhases();
EXPECT_EQ(MakeRGB(0, 0, 255),
GetDocument().body()->GetComputedStyle()->VisitedDependentColor(
GetCSSPropertyColor()));
color_scheme_helper.SetPreferredContrast(
mojom::blink::PreferredContrast::kLess);
UpdateAllLifecyclePhases();
EXPECT_EQ(MakeRGB(0, 0, 255),
GetDocument().body()->GetComputedStyle()->VisitedDependentColor(
GetCSSPropertyColor()));
color_scheme_helper.SetForcedColors(GetDocument(), ForcedColors::kActive);
UpdateAllLifecyclePhases();
EXPECT_EQ(MakeRGB(0, 0, 255),
GetDocument().body()->GetComputedStyle()->VisitedDependentColor(
GetCSSPropertyColor()));
}
TEST_F(StyleEngineTest, MediaQueriesChangeSpecificPrefersContrast) {
ScopedForcedColorsForTest forced_scoped_feature(true);
ScopedPrefersContrastForTest contrast_scoped_feature(true);
ColorSchemeHelper color_scheme_helper(GetDocument());
color_scheme_helper.SetPreferredContrast(
mojom::blink::PreferredContrast::kNoPreference);
color_scheme_helper.SetForcedColors(GetDocument(), ForcedColors::kNone);
GetDocument().body()->setInnerHTML(R"HTML(
<style>
body { color: red; forced-color-adjust: none; }
@media (prefers-contrast: more) {
body { color: blue }
}
@media (prefers-contrast: less) {
body { color: orange }
}
@media (prefers-contrast: forced) {
body { color: yellow }
}
@media (prefers-contrast: forced) and (prefers-contrast: more) {
body { color: green }
}
@media (prefers-contrast: forced) and (prefers-contrast: less) {
body { color: purple }
}
</style>
<body></body>
)HTML");
UpdateAllLifecyclePhases();
EXPECT_EQ(MakeRGB(255, 0, 0),
GetDocument().body()->GetComputedStyle()->VisitedDependentColor(
GetCSSPropertyColor()));
color_scheme_helper.SetPreferredContrast(
mojom::blink::PreferredContrast::kMore);
UpdateAllLifecyclePhases();
EXPECT_EQ(MakeRGB(0, 0, 255),
GetDocument().body()->GetComputedStyle()->VisitedDependentColor(
GetCSSPropertyColor()));
color_scheme_helper.SetPreferredContrast(
mojom::blink::PreferredContrast::kLess);
UpdateAllLifecyclePhases();
EXPECT_EQ(MakeRGB(255, 165, 0),
GetDocument().body()->GetComputedStyle()->VisitedDependentColor(
GetCSSPropertyColor()));
color_scheme_helper.SetForcedColors(GetDocument(), ForcedColors::kActive);
UpdateAllLifecyclePhases();
EXPECT_EQ(MakeRGB(128, 0, 128),
GetDocument().body()->GetComputedStyle()->VisitedDependentColor(
GetCSSPropertyColor()));
color_scheme_helper.SetPreferredContrast(
mojom::blink::PreferredContrast::kMore);
UpdateAllLifecyclePhases();
EXPECT_EQ(MakeRGB(0, 128, 0),
GetDocument().body()->GetComputedStyle()->VisitedDependentColor(
GetCSSPropertyColor()));
color_scheme_helper.SetPreferredContrast(
mojom::blink::PreferredContrast::kNoPreference);
UpdateAllLifecyclePhases();
EXPECT_EQ(MakeRGB(255, 255, 0),
GetDocument().body()->GetComputedStyle()->VisitedDependentColor(
GetCSSPropertyColor()));
}
TEST_F(StyleEngineTest, MediaQueriesChangePrefersReducedMotion) {
GetDocument().body()->setInnerHTML(R"HTML(
<style>
......
......@@ -775,6 +775,11 @@ void WebSettingsImpl::SetPreferredColorScheme(
settings_->SetPreferredColorScheme(color_scheme);
}
void WebSettingsImpl::SetPreferredContrast(
mojom::blink::PreferredContrast contrast) {
settings_->SetPreferredContrast(contrast);
}
void WebSettingsImpl::SetNavigationControls(
NavigationControls navigation_controls) {
settings_->SetNavigationControls(navigation_controls);
......
......@@ -31,6 +31,7 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EXPORTED_WEB_SETTINGS_IMPL_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_EXPORTED_WEB_SETTINGS_IMPL_H_
#include "third_party/blink/public/mojom/css/preferred_contrast.mojom-blink.h"
#include "third_party/blink/public/mojom/v8_cache_options.mojom-blink.h"
#include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom-blink.h"
#include "third_party/blink/public/web/web_settings.h"
......@@ -223,6 +224,7 @@ class CORE_EXPORT WebSettingsImpl final : public WebSettings {
void SetForceDarkModeEnabled(bool) override;
void SetPreferredColorScheme(mojom::blink::PreferredColorScheme) override;
void SetPreferredContrast(mojom::blink::PreferredContrast) override;
void SetNavigationControls(NavigationControls) override;
void SetAriaModalPrunesAXTree(bool) override;
......
......@@ -32,7 +32,7 @@
#include "base/macros.h"
#include "third_party/blink/public/common/css/navigation_controls.h"
#include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink-forward.h"
#include "third_party/blink/public/mojom/css/preferred_contrast.mojom-blink.h"
#include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h"
#include "third_party/blink/public/mojom/v8_cache_options.mojom-blink.h"
#include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom-blink.h"
......
......@@ -1011,6 +1011,15 @@
type: "mojom::blink::PreferredColorScheme",
},
// Preferred contrast from the OS/application passed to the renderer for
// evaluating the prefers-contrast media query.
{
name: "preferredContrast",
initial: "mojom::blink::PreferredContrast::kNoPreference",
invalidate: "MediaQuery",
type: "mojom::blink::PreferredContrast",
},
// Preferred motion-reduction setting from the OS/application passed to the
// renderer for evaluating the prefers-reduced-motion media query.
{
......
......@@ -4,7 +4,6 @@
#include "third_party/blink/renderer/core/testing/color_scheme_helper.h"
#include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/public/platform/web_theme_engine.h"
#include "third_party/blink/renderer/core/dom/document.h"
......@@ -18,6 +17,7 @@ ColorSchemeHelper::ColorSchemeHelper(Document& document)
DCHECK(Platform::Current() && Platform::Current()->ThemeEngine());
web_theme_engine_ = Platform::Current()->ThemeEngine();
default_preferred_color_scheme_ = settings_.GetPreferredColorScheme();
default_preferred_contrast_ = settings_.GetPreferredContrast();
default_forced_colors_ = web_theme_engine_->GetForcedColors();
}
......@@ -26,12 +26,15 @@ ColorSchemeHelper::ColorSchemeHelper(Page& page)
DCHECK(Platform::Current() && Platform::Current()->ThemeEngine());
web_theme_engine_ = Platform::Current()->ThemeEngine();
default_preferred_color_scheme_ = settings_.GetPreferredColorScheme();
default_preferred_contrast_ = settings_.GetPreferredContrast();
default_forced_colors_ = web_theme_engine_->GetForcedColors();
}
ColorSchemeHelper::~ColorSchemeHelper() {
// Reset preferred color scheme and forced colors to their original values.
// Reset preferred color scheme, preferred contrast and forced colors to their
// original values.
settings_.SetPreferredColorScheme(default_preferred_color_scheme_);
settings_.SetPreferredContrast(default_preferred_contrast_);
web_theme_engine_->SetForcedColors(default_forced_colors_);
}
......@@ -40,6 +43,11 @@ void ColorSchemeHelper::SetPreferredColorScheme(
settings_.SetPreferredColorScheme(preferred_color_scheme);
}
void ColorSchemeHelper::SetPreferredContrast(
const mojom::blink::PreferredContrast preferred_contrast) {
settings_.SetPreferredContrast(preferred_contrast);
}
void ColorSchemeHelper::SetForcedColors(Document& document,
const ForcedColors forced_colors) {
web_theme_engine_->SetForcedColors(forced_colors);
......
......@@ -7,6 +7,7 @@
#include "third_party/blink/public/common/css/forced_colors.h"
#include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-shared.h"
#include "third_party/blink/public/mojom/css/preferred_contrast.mojom-shared.h"
namespace blink {
......@@ -15,9 +16,10 @@ class Page;
class Settings;
class WebThemeEngine;
// ColorSchemeHelper is used to update the values of PreferredColorScheme and
// ForcedColors for testing. ColorSchemeHelper will reset PreferredColorScheme
// and ForcedColors back to their default values upon deconstruction.
// ColorSchemeHelper is used to update the values of PreferredColorScheme,
// PreferredContrast and ForcedColors for testing. ColorSchemeHelper will reset
// PreferredColorScheme, PreferredContrast and ForcedColors back to their
// default values upon deconstruction.
class ColorSchemeHelper {
public:
ColorSchemeHelper(Document& document);
......@@ -26,6 +28,7 @@ class ColorSchemeHelper {
void SetPreferredColorScheme(
const mojom::PreferredColorScheme preferred_color_scheme);
void SetPreferredContrast(const mojom::PreferredContrast preferred_contrast);
void SetForcedColors(Document& document, const ForcedColors forced_colors);
void SetForcedColors(Page& page, const ForcedColors forced_colors);
......@@ -34,6 +37,8 @@ class ColorSchemeHelper {
Settings& settings_;
mojom::PreferredColorScheme default_preferred_color_scheme_ =
mojom::PreferredColorScheme::kLight;
mojom::PreferredContrast default_preferred_contrast_ =
mojom::PreferredContrast::kNoPreference;
ForcedColors default_forced_colors_ = ForcedColors::kNone;
};
......
......@@ -1535,6 +1535,10 @@
name: "PreferNonCompositedScrolling",
settable_from_internals: true,
},
{
name: "PrefersContrast",
depends_on: ["ForcedColors"],
},
{
name: 'PrefersReducedData',
status: 'experimental',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment