diff --git a/dom/base/nsGkAtomList.h b/dom/base/nsGkAtomList.h index 08f5c4fc1d..f56efc34d4 100644 --- a/dom/base/nsGkAtomList.h +++ b/dom/base/nsGkAtomList.h @@ -2240,6 +2240,7 @@ GK_ATOM(scrollbar_end_backward, "scrollbar-end-backward") GK_ATOM(scrollbar_end_forward, "scrollbar-end-forward") GK_ATOM(scrollbar_thumb_proportional, "scrollbar-thumb-proportional") GK_ATOM(overlay_scrollbars, "overlay-scrollbars") +GK_ATOM(prefers_color_scheme, "prefers-color-scheme") GK_ATOM(windows_accent_color_applies, "windows-accent-color-applies") GK_ATOM(windows_accent_color_is_dark, "windows-accent-color-is-dark") GK_ATOM(windows_default_theme, "windows-default-theme") diff --git a/layout/style/nsCSSKeywordList.h b/layout/style/nsCSSKeywordList.h index 689ff47eb6..be1691e629 100644 --- a/layout/style/nsCSSKeywordList.h +++ b/layout/style/nsCSSKeywordList.h @@ -224,6 +224,7 @@ CSS_KEY(crosshair, crosshair) CSS_KEY(currentcolor, currentcolor) CSS_KEY(cursive, cursive) CSS_KEY(cyclic, cyclic) +CSS_KEY(dark, dark) CSS_KEY(darken, darken) CSS_KEY(dashed, dashed) CSS_KEY(dense, dense) @@ -364,6 +365,7 @@ CSS_KEY(last baseline, last_baseline) // only used for DevTools auto-completion CSS_KEY(layout, layout) CSS_KEY(left, left) CSS_KEY(legacy, legacy) +CSS_KEY(light, light) CSS_KEY(lighten, lighten) CSS_KEY(lighter, lighter) CSS_KEY(line-through, line_through) diff --git a/layout/style/nsMediaFeatures.cpp b/layout/style/nsMediaFeatures.cpp index 0c166ac21d..74f5c962c6 100644 --- a/layout/style/nsMediaFeatures.cpp +++ b/layout/style/nsMediaFeatures.cpp @@ -20,6 +20,7 @@ #include "nsIDocument.h" #include "nsIWidget.h" #include "nsContentUtils.h" +#include "mozilla/Preferences.h" #include "mozilla/StyleSheet.h" #include "mozilla/StyleSheetInlines.h" @@ -45,6 +46,12 @@ static const nsCSSProps::KTableEntry kDisplayModeKeywords[] = { { eCSSKeyword_UNKNOWN, -1 } }; +static const nsCSSProps::KTableEntry kPrefersColorSchemeKeywords[] = { + { eCSSKeyword_light, NS_STYLE_PREFERS_COLOR_SCHEME_LIGHT }, + { eCSSKeyword_dark, NS_STYLE_PREFERS_COLOR_SCHEME_DARK }, + { eCSSKeyword_UNKNOWN, -1 }, +}; + #ifdef XP_WIN struct WindowsThemeName { LookAndFeel::WindowsTheme id; @@ -457,6 +464,25 @@ GetOperatingSystemVersion(nsPresContext* aPresContext, const nsMediaFeature* aFe return NS_OK; } +static nsresult +GetPrefersColorScheme(nsPresContext* aPresContext, const nsMediaFeature* aFeature, + nsCSSValue& aResult) +{ + switch(Preferences::GetInt("browser.display.prefers_color_scheme", 1)) { + case 1: + aResult.SetIntValue(NS_STYLE_PREFERS_COLOR_SCHEME_LIGHT, + eCSSUnit_Enumerated); + break; + case 2: + aResult.SetIntValue(NS_STYLE_PREFERS_COLOR_SCHEME_DARK, + eCSSUnit_Enumerated); + break; + default: + aResult.Reset(); + } + return NS_OK; +} + static nsresult GetIsGlyph(nsPresContext* aPresContext, const nsMediaFeature* aFeature, nsCSSValue& aResult) @@ -556,6 +582,14 @@ nsMediaFeatures::features[] = { { nullptr }, GetMonochrome }, + { + &nsGkAtoms::prefers_color_scheme, + nsMediaFeature::eMinMaxNotAllowed, + nsMediaFeature::eEnumerated, + nsMediaFeature::eNoRequirements, + { kPrefersColorSchemeKeywords }, + GetPrefersColorScheme + }, { &nsGkAtoms::resolution, nsMediaFeature::eMinMaxAllowed, diff --git a/layout/style/nsStyleConsts.h b/layout/style/nsStyleConsts.h index 308a66647b..60377928b0 100644 --- a/layout/style/nsStyleConsts.h +++ b/layout/style/nsStyleConsts.h @@ -1306,6 +1306,10 @@ enum class StyleDisplay : uint8_t { #define NS_STYLE_DISPLAY_MODE_STANDALONE 2 #define NS_STYLE_DISPLAY_MODE_FULLSCREEN 3 +// prefers-color-scheme +#define NS_STYLE_PREFERS_COLOR_SCHEME_LIGHT 0 +#define NS_STYLE_PREFERS_COLOR_SCHEME_DARK 1 + } // namespace mozilla #endif /* nsStyleConsts_h___ */ diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index ba0351ede4..5e202cdc82 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -266,6 +266,10 @@ pref("browser.display.use_document_fonts", 1); // 0 = never, 1 = quick, 2 = al // 1 = always // 2 = never pref("browser.display.document_color_use", 0); +// 0 = feature disabled +// 1 = default: light theme preferred +// 2 = dark theme preferred +pref("browser.display.prefers_color_scheme", 1); pref("browser.display.use_system_colors", false); pref("browser.display.foreground_color", "#000000"); pref("browser.display.background_color", "#FFFFFF");