Commit d61601a8 authored by Anna Malova's avatar Anna Malova Committed by Commit Bot

[aw-dark] Add API that allows an app to specify how dark mode should be respected.

 - Media query only
 - Force dark unless page supports dark mode via meta tag and media query
 - Always force dark (disable media query).

Bug: 1001516
Change-Id: Ida620311e8b4811f6fddffbeaf9d7f40b427493e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1798349Reviewed-by: default avatarTobias Sargeant <tobiasjs@chromium.org>
Commit-Queue: Anna Malova <amalova@chromium.org>
Cr-Commit-Position: refs/heads/master@{#695633}
parent 7b97a593
...@@ -496,30 +496,53 @@ void AwSettings::PopulateWebPreferencesLocked(JNIEnv* env, ...@@ -496,30 +496,53 @@ void AwSettings::PopulateWebPreferencesLocked(JNIEnv* env,
web_prefs->scroll_top_left_interop_enabled = web_prefs->scroll_top_left_interop_enabled =
Java_AwSettings_getScrollTopLeftInteropEnabledLocked(env, obj); Java_AwSettings_getScrollTopLeftInteropEnabledLocked(env, obj);
bool is_dark_mode;
switch (Java_AwSettings_getForceDarkModeLocked(env, obj)) { switch (Java_AwSettings_getForceDarkModeLocked(env, obj)) {
case ForceDarkMode::FORCE_DARK_OFF: case ForceDarkMode::FORCE_DARK_OFF:
web_prefs->force_dark_mode_enabled = false; is_dark_mode = false;
break; break;
case ForceDarkMode::FORCE_DARK_ON: case ForceDarkMode::FORCE_DARK_ON:
web_prefs->force_dark_mode_enabled = true; is_dark_mode = true;
break; break;
case ForceDarkMode::FORCE_DARK_AUTO: { case ForceDarkMode::FORCE_DARK_AUTO: {
AwContents* contents = AwContents::FromWebContents(web_contents()); AwContents* contents = AwContents::FromWebContents(web_contents());
web_prefs->force_dark_mode_enabled = is_dark_mode = contents && contents->GetViewTreeForceDarkState();
contents && contents->GetViewTreeForceDarkState();
break; break;
} }
} }
// Blink's behavior is that if the preferred color scheme matches the
// supported color scheme, then force dark will be disabled, otherwise
// the preferred color scheme will be reset to no preference. Therefore
// when enabling force dark, we also set the preferred color scheme to
// dark so that dark themed content will be preferred over force darkening.
web_prefs->preferred_color_scheme = web_prefs->preferred_color_scheme =
web_prefs->force_dark_mode_enabled is_dark_mode ? blink::PreferredColorScheme::kDark
? blink::PreferredColorScheme::kDark : blink::PreferredColorScheme::kNoPreference;
: blink::PreferredColorScheme::kNoPreference; if (is_dark_mode) {
switch (Java_AwSettings_getDarkModePreferencesLocked(env, obj)) {
case DarkModePreferences::FORCE_DARK_ONLY: {
web_prefs->preferred_color_scheme =
blink::PreferredColorScheme::kNoPreference;
web_prefs->force_dark_mode_enabled = true;
break;
}
case DarkModePreferences::MEDIA_QUERY_ONLY: {
web_prefs->preferred_color_scheme = blink::PreferredColorScheme::kDark;
web_prefs->force_dark_mode_enabled = false;
break;
}
// Blink's behavior is that if the preferred color scheme matches the
// supported color scheme, then force dark will be disabled, otherwise
// the preferred color scheme will be reset to no preference. Therefore
// when enabling force dark, we also set the preferred color scheme to
// dark so that dark themed content will be preferred over force
// darkening.
case DarkModePreferences::PREFER_MEDIA_QUERY_OVER_FORCE_DARK: {
web_prefs->preferred_color_scheme = blink::PreferredColorScheme::kDark;
web_prefs->force_dark_mode_enabled = true;
break;
}
}
} else {
web_prefs->preferred_color_scheme =
blink::PreferredColorScheme::kNoPreference;
web_prefs->force_dark_mode_enabled = false;
}
} }
bool AwSettings::GetAllowFileAccess() { bool AwSettings::GetAllowFileAccess() {
......
...@@ -28,6 +28,13 @@ class AwSettings : public content::WebContentsObserver { ...@@ -28,6 +28,13 @@ class AwSettings : public content::WebContentsObserver {
FORCE_DARK_ON = 2, FORCE_DARK_ON = 2,
}; };
// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.android_webview.settings
enum DarkModePreferences {
FORCE_DARK_ONLY = 0,
MEDIA_QUERY_ONLY = 1,
PREFER_MEDIA_QUERY_OVER_FORCE_DARK = 2,
};
static AwSettings* FromWebContents(content::WebContents* web_contents); static AwSettings* FromWebContents(content::WebContents* web_contents);
static bool GetAllowSniffingFileUrls(); static bool GetAllowSniffingFileUrls();
......
...@@ -16,6 +16,7 @@ import android.support.annotation.IntDef; ...@@ -16,6 +16,7 @@ import android.support.annotation.IntDef;
import android.util.Log; import android.util.Log;
import android.webkit.WebSettings; import android.webkit.WebSettings;
import org.chromium.android_webview.settings.DarkModePreferences;
import org.chromium.android_webview.settings.ForceDarkMode; import org.chromium.android_webview.settings.ForceDarkMode;
import org.chromium.base.ContextUtils; import org.chromium.base.ContextUtils;
import org.chromium.base.ThreadUtils; import org.chromium.base.ThreadUtils;
...@@ -62,6 +63,15 @@ public class AwSettings { ...@@ -62,6 +63,15 @@ public class AwSettings {
@ForceDarkMode @ForceDarkMode
private int mForceDarkMode = ForceDarkMode.FORCE_DARK_AUTO; private int mForceDarkMode = ForceDarkMode.FORCE_DARK_AUTO;
public static final int FORCE_DARK_ONLY = DarkModePreferences.FORCE_DARK_ONLY;
public static final int MEDIA_QUERY_ONLY = DarkModePreferences.MEDIA_QUERY_ONLY;
// This option requires RuntimeEnabledFeatures::MetaColorSchemeEnabled()
public static final int PREFER_MEDIA_QUERY_OVER_FORCE_DARK =
DarkModePreferences.PREFER_MEDIA_QUERY_OVER_FORCE_DARK;
@DarkModePreferences
private int mDarkModePreferences = DarkModePreferences.PREFER_MEDIA_QUERY_OVER_FORCE_DARK;
// This class must be created on the UI thread. Afterwards, it can be // This class must be created on the UI thread. Afterwards, it can be
// used from any thread. Internally, the class uses a message queue // used from any thread. Internally, the class uses a message queue
// to call native code on the UI thread only. // to call native code on the UI thread only.
...@@ -1712,6 +1722,29 @@ public class AwSettings { ...@@ -1712,6 +1722,29 @@ public class AwSettings {
} }
} }
@DarkModePreferences
public int getDarkModePreferences() {
synchronized (mAwSettingsLock) {
return getDarkModePreferencesLocked();
}
}
@CalledByNative
@DarkModePreferences
public int getDarkModePreferencesLocked() {
assert Thread.holdsLock(mAwSettingsLock);
return mDarkModePreferences;
}
public void setDarkModePreferences(@DarkModePreferences int darkModePreferences) {
synchronized (mAwSettingsLock) {
if (mDarkModePreferences != darkModePreferences) {
mDarkModePreferences = darkModePreferences;
mEventHandler.updateWebkitPreferencesLocked();
}
}
}
@CalledByNative @CalledByNative
private boolean getAllowRunningInsecureContentLocked() { private boolean getAllowRunningInsecureContentLocked() {
assert Thread.holdsLock(mAwSettingsLock); assert Thread.holdsLock(mAwSettingsLock);
......
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