Commit 51c2af63 authored by Philip Rogers's avatar Philip Rogers Committed by Commit Bot

Add metrics for measuring dark mode usage

This patch adds three UseCounters for measuring dark mode usage:
1. kForcedDarkMode which is set for pages loaded with forced dark mode.
2. kPreferredColorSchemeDark which is set when prefers-color-scheme
 media queries will match dark.
3. kPreferredColorSchemeDarkSetting which is set when the preferred
 color scheme dark setting is set (i.e., the system is in dark mode).
 This can differ from #2 in cases where the system is in dark mode and
 forced dark mode is enabled, resulting in prefers-color-scheme being
 "light" in some cases.

Bug: 1131028
Change-Id: I85bc9db6ef30ce0dfc4f78c0c51d039bb04a100d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2423168Reviewed-by: default avatarStephen Chenney <schenney@chromium.org>
Commit-Queue: Philip Rogers <pdr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#809477}
parent 853f628c
......@@ -2905,8 +2905,10 @@ enum WebFeature {
kIdentifiabilityStudyReserved3575 = 3575,
kIdentifiabilityStudyReserved3576 = 3576,
kIdentifiabilityStudyReserved3577 = 3577,
kCascadedCSSZoomNotEqualToOne = 3578,
kForcedDarkMode = 3579,
kPreferredColorSchemeDark = 3580,
kPreferredColorSchemeDarkSetting = 3581,
// Add new features immediately above this line. Don't change assigned
// numbers of any item, and don't reuse removed slots.
......
......@@ -129,6 +129,7 @@ StyleEngine::StyleEngine(Document& document)
if (auto* settings = GetDocument().GetSettings()) {
if (!settings->GetForceDarkModeEnabled())
preferred_color_scheme_ = settings->GetPreferredColorScheme();
UpdateColorSchemeMetrics();
}
if (Platform::Current() && Platform::Current()->ThemeEngine())
forced_colors_ = Platform::Current()->ThemeEngine()->GetForcedColors();
......@@ -2179,6 +2180,26 @@ void StyleEngine::UpdateColorScheme() {
color_scheme_changed = true;
}
UpdateColorSchemeBackground(color_scheme_changed);
UpdateColorSchemeMetrics();
}
void StyleEngine::UpdateColorSchemeMetrics() {
auto* settings = GetDocument().GetSettings();
if (settings->GetForceDarkModeEnabled())
UseCounter::Count(GetDocument(), WebFeature::kForcedDarkMode);
// True if the preferred color scheme will match dark.
if (preferred_color_scheme_ == PreferredColorScheme::kDark)
UseCounter::Count(GetDocument(), WebFeature::kPreferredColorSchemeDark);
// This is equal to kPreferredColorSchemeDark in most cases, but can differ
// with forced dark mode. With the system in dark mode and forced dark mode
// enabled, the preferred color scheme can be light while the setting is dark.
if (settings->GetPreferredColorScheme() == PreferredColorScheme::kDark) {
UseCounter::Count(GetDocument(),
WebFeature::kPreferredColorSchemeDarkSetting);
}
}
void StyleEngine::ColorSchemeChanged() {
......
......@@ -517,6 +517,8 @@ class CORE_EXPORT StyleEngine final : public GarbageCollected<StyleEngine>,
bool SupportsDarkColorScheme();
void UpdateForcedBackgroundColor();
void UpdateColorSchemeMetrics();
void ViewportDefiningElementDidChange();
void PropagateWritingModeAndDirectionToHTMLRoot();
......
......@@ -1743,6 +1743,42 @@ TEST_F(StyleEngineTest, MediaQueriesColorSchemeOverride) {
GetCSSPropertyColor()));
}
TEST_F(StyleEngineTest, PreferredColorSchemeMetric) {
ColorSchemeHelper color_scheme_helper(GetDocument());
color_scheme_helper.SetPreferredColorScheme(PreferredColorScheme::kLight);
EXPECT_FALSE(IsUseCounted(WebFeature::kPreferredColorSchemeDark));
color_scheme_helper.SetPreferredColorScheme(PreferredColorScheme::kDark);
EXPECT_TRUE(IsUseCounted(WebFeature::kPreferredColorSchemeDark));
}
// The preferred color scheme setting can differ from the preferred color
// scheme when forced dark mode is enabled. This is so that forced dark mode
// does not invert pages that support dark mode.
TEST_F(StyleEngineTest, PreferredColorSchemeSettingMetric) {
ColorSchemeHelper color_scheme_helper(GetDocument());
color_scheme_helper.SetPreferredColorScheme(PreferredColorScheme::kLight);
GetDocument().GetSettings()->SetForceDarkModeEnabled(false);
EXPECT_FALSE(IsUseCounted(WebFeature::kPreferredColorSchemeDark));
EXPECT_FALSE(IsUseCounted(WebFeature::kPreferredColorSchemeDarkSetting));
color_scheme_helper.SetPreferredColorScheme(PreferredColorScheme::kDark);
// Clear the UseCounters before they are updated by the
// |SetForceDarkModeEnabled| call, below.
ClearUseCounter(WebFeature::kPreferredColorSchemeDark);
ClearUseCounter(WebFeature::kPreferredColorSchemeDarkSetting);
GetDocument().GetSettings()->SetForceDarkModeEnabled(true);
EXPECT_FALSE(IsUseCounted(WebFeature::kPreferredColorSchemeDark));
EXPECT_TRUE(IsUseCounted(WebFeature::kPreferredColorSchemeDarkSetting));
}
TEST_F(StyleEngineTest, ForcedDarkModeMetric) {
GetDocument().GetSettings()->SetForceDarkModeEnabled(false);
EXPECT_FALSE(IsUseCounted(WebFeature::kForcedDarkMode));
GetDocument().GetSettings()->SetForceDarkModeEnabled(true);
EXPECT_TRUE(IsUseCounted(WebFeature::kForcedDarkMode));
}
TEST_F(StyleEngineTest, MediaQueriesReducedMotionOverride) {
EXPECT_FALSE(GetDocument().GetSettings()->GetPrefersReducedMotion());
......
......@@ -29342,6 +29342,9 @@ Called by update_use_counter_feature_enum.py.-->
<int value="3576" label="IdentifiabilityStudyReserved3576"/>
<int value="3577" label="IdentifiabilityStudyReserved3577"/>
<int value="3578" label="CascadedCSSZoomNotEqualToOne"/>
<int value="3579" label="ForcedDarkMode"/>
<int value="3580" label="PreferredColorSchemeDark"/>
<int value="3581" label="PreferredColorSchemeDarkSetting"/>
</enum>
<enum name="FeaturePolicyAllowlistType">
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