From f2c0c3f8fbf3c2013e0243d99bcd633ea51c759d Mon Sep 17 00:00:00 2001 From: Marshall Greenblatt Date: Tue, 15 Sep 2020 12:34:22 -0400 Subject: [PATCH] Add support for prefers-color-scheme media queries (fixes issue #2824) --- .../alloy/alloy_content_browser_client.cc | 7 ++++ .../alloy/alloy_content_browser_client.h | 3 ++ libcef/browser/prefs/renderer_prefs.cc | 41 +++++++++++++++++++ libcef/browser/prefs/renderer_prefs.h | 3 ++ 4 files changed, 54 insertions(+) diff --git a/libcef/browser/alloy/alloy_content_browser_client.cc b/libcef/browser/alloy/alloy_content_browser_client.cc index abc5da433..9054fa01e 100644 --- a/libcef/browser/alloy/alloy_content_browser_client.cc +++ b/libcef/browser/alloy/alloy_content_browser_client.cc @@ -1044,6 +1044,13 @@ void AlloyContentBrowserClient::OverrideWebkitPrefs( } } +bool AlloyContentBrowserClient::OverrideWebPreferencesAfterNavigation( + content::WebContents* web_contents, + content::WebPreferences* prefs) { + return renderer_prefs::PopulateWebPreferencesAfterNavigation(web_contents, + *prefs); +} + void AlloyContentBrowserClient::BrowserURLHandlerCreated( content::BrowserURLHandler* handler) { scheme::BrowserURLHandlerCreated(handler); diff --git a/libcef/browser/alloy/alloy_content_browser_client.h b/libcef/browser/alloy/alloy_content_browser_client.h index a88ce4778..5493da1a9 100644 --- a/libcef/browser/alloy/alloy_content_browser_client.h +++ b/libcef/browser/alloy/alloy_content_browser_client.h @@ -103,6 +103,9 @@ class AlloyContentBrowserClient : public content::ContentBrowserClient { bool* no_javascript_access) override; void OverrideWebkitPrefs(content::RenderViewHost* rvh, content::WebPreferences* prefs) override; + bool OverrideWebPreferencesAfterNavigation( + content::WebContents* web_contents, + content::WebPreferences* prefs) override; void BrowserURLHandlerCreated(content::BrowserURLHandler* handler) override; std::string GetDefaultDownloadName() override; void DidCreatePpapiPlugin(content::BrowserPpapiHost* browser_host) override; diff --git a/libcef/browser/prefs/renderer_prefs.cc b/libcef/browser/prefs/renderer_prefs.cc index 8af14b802..6e3175761 100644 --- a/libcef/browser/prefs/renderer_prefs.cc +++ b/libcef/browser/prefs/renderer_prefs.cc @@ -21,6 +21,7 @@ #include "chrome/browser/font_family_cache.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/prefs/prefs_tab_helper.h" +#include "chrome/common/chrome_features.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" #include "components/pref_registry/pref_registry_syncable.h" @@ -31,12 +32,14 @@ #include "content/public/browser/render_view_host.h" #include "content/public/browser/site_instance.h" #include "content/public/browser/web_contents.h" +#include "content/public/common/url_constants.h" #include "content/public/common/web_preferences.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/view_type_utils.h" #include "extensions/common/constants.h" #include "media/media_buildflags.h" #include "third_party/blink/public/common/peerconnection/webrtc_ip_handling_policy.h" +#include "ui/native_theme/native_theme.h" namespace renderer_prefs { @@ -273,6 +276,25 @@ void SetBool(CommandLinePrefStore* prefs, const std::string& key, bool value) { WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); } +// From chrome/browser/chrome_content_browser_client.cc +bool UpdatePreferredColorSchemesBasedOnURLIfNeeded( + content::WebPreferences* web_prefs, + const GURL& url) { + // Force a light preferred color scheme on certain URLs if kWebUIDarkMode is + // disabled; some of the UI is not yet correctly themed. + if (base::FeatureList::IsEnabled(features::kWebUIDarkMode)) + return false; + bool force_light = url.SchemeIs(content::kChromeUIScheme); + if (!force_light && extensions::ExtensionsEnabled()) { + force_light = url.SchemeIs(extensions::kExtensionScheme) && + url.host_piece() == extension_misc::kPdfExtensionId; + } + auto old_preferred_color_scheme = web_prefs->preferred_color_scheme; + if (force_light) + web_prefs->preferred_color_scheme = blink::PreferredColorScheme::kLight; + return old_preferred_color_scheme != web_prefs->preferred_color_scheme; +} + } // namespace void SetCommandLinePrefDefaults(CommandLinePrefStore* prefs) { @@ -340,6 +362,19 @@ void PopulateWebPreferences(content::RenderViewHost* rvh, SetChromePrefs(profile, web); } + auto* native_theme = ui::NativeTheme::GetInstanceForWeb(); + switch (native_theme->GetPreferredColorScheme()) { + case ui::NativeTheme::PreferredColorScheme::kDark: + web.preferred_color_scheme = blink::PreferredColorScheme::kDark; + break; + case ui::NativeTheme::PreferredColorScheme::kLight: + web.preferred_color_scheme = blink::PreferredColorScheme::kLight; + break; + } + + UpdatePreferredColorSchemesBasedOnURLIfNeeded( + &web, rvh->GetSiteInstance()->GetSiteURL()); + // Set preferences based on the extension. SetExtensionPrefs(rvh, web); @@ -359,4 +394,10 @@ void PopulateWebPreferences(content::RenderViewHost* rvh, } } +bool PopulateWebPreferencesAfterNavigation(content::WebContents* web_contents, + content::WebPreferences& web) { + return UpdatePreferredColorSchemesBasedOnURLIfNeeded( + &web, web_contents->GetLastCommittedURL()); +} + } // namespace renderer_prefs diff --git a/libcef/browser/prefs/renderer_prefs.h b/libcef/browser/prefs/renderer_prefs.h index 3fd4b1b02..50fe0ebc2 100644 --- a/libcef/browser/prefs/renderer_prefs.h +++ b/libcef/browser/prefs/renderer_prefs.h @@ -12,6 +12,7 @@ class CommandLinePrefStore; namespace content { class RenderViewHost; +class WebContents; struct WebPreferences; } // namespace content @@ -34,6 +35,8 @@ void SetCommandLinePrefDefaults(CommandLinePrefStore* prefs); // PrefService and CefBrowserSettings. void PopulateWebPreferences(content::RenderViewHost* rvh, content::WebPreferences& web); +bool PopulateWebPreferencesAfterNavigation(content::WebContents* web_contents, + content::WebPreferences& web); } // namespace renderer_prefs