add a option to exclude internal schemes

This commit is contained in:
Carmelo Messina
2020-11-06 17:10:22 +01:00
parent b2a36c11b8
commit bbd0f8c531
@@ -6,20 +6,20 @@ Subject: Add flag to always view the desktop site for all websites
chrome/android/chrome_java_resources.gni | 1 +
chrome/android/chrome_java_sources.gni | 1 +
.../android/java/res/xml/main_preferences.xml | 5 ++
.../java/res/xml/useragent_preferences.xml | 30 ++++++++++
.../chrome/browser/app/ChromeActivity.java | 17 +++++-
.../settings/UserAgentPreferences.java | 59 +++++++++++++++++++
.../chromium/chrome/browser/tab/TabImpl.java | 51 +++++++++++++++-
.../browser/tabmodel/TabWindowManager.java | 20 +++++++
.../java/res/xml/useragent_preferences.xml | 35 +++++++++
.../chrome/browser/app/ChromeActivity.java | 17 ++++-
.../settings/UserAgentPreferences.java | 76 +++++++++++++++++++
.../chromium/chrome/browser/tab/TabImpl.java | 72 +++++++++++++++++-
.../browser/tabmodel/TabWindowManager.java | 20 +++++
chrome/browser/android/tab_android.cc | 5 +-
chrome/browser/android/tab_android.h | 3 +-
.../preferences/ChromePreferenceKeys.java | 7 ++-
.../preferences/ChromePreferenceKeys.java | 9 ++-
.../org/chromium/chrome/browser/tab/Tab.java | 2 +
.../strings/android_chrome_strings.grd | 14 +++++
.../strings/android_chrome_strings.grd | 17 +++++
.../navigation_controller_android.cc | 6 +-
.../navigation_controller_android.h | 3 +-
.../framehost/NavigationControllerImpl.java | 6 +-
16 files changed, 218 insertions(+), 12 deletions(-)
16 files changed, 266 insertions(+), 12 deletions(-)
create mode 100644 chrome/android/java/res/xml/useragent_preferences.xml
create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/settings/UserAgentPreferences.java
@@ -62,7 +62,7 @@ diff --git a/chrome/android/java/res/xml/useragent_preferences.xml b/chrome/andr
new file mode 100644
--- /dev/null
+++ b/chrome/android/java/res/xml/useragent_preferences.xml
@@ -0,0 +1,30 @@
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ This file is part of Bromite.
@@ -92,6 +92,11 @@ new file mode 100644
+ android:summaryOn="@string/option_desktop_flag_on"
+ android:summaryOff="@string/option_desktop_flag_off" />
+
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
+ android:key="exclude_internal_scheme"
+ android:summaryOn="@string/option_exclude_internal_scheme"
+ android:summaryOff="@string/option_exclude_internal_scheme" />
+
+</PreferenceScreen>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
@@ -133,7 +138,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/UserAg
new file mode 100644
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/UserAgentPreferences.java
@@ -0,0 +1,59 @@
@@ -0,0 +1,76 @@
+/*
+ This file is part of Bromite.
+
@@ -169,34 +174,51 @@ new file mode 100644
+ */
+public class UserAgentPreferences extends PreferenceFragmentCompat {
+ private static final String PREF_STICK_DESKTOP_MODE_SWITCH = "desktop_mode_switch";
+ private static final String PREF_ADM_EXCLUDE_INTERNAL_SCHEME_SWITCH = "exclude_internal_scheme";
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ getActivity().setTitle(R.string.useragent_settings_title);
+ SettingsUtils.addPreferencesFromResource(this, R.xml.useragent_preferences);
+
+ ChromeSwitchPreference alwaysADMExcludeInternalSchemeSwitch =
+ (ChromeSwitchPreference) findPreference(PREF_ADM_EXCLUDE_INTERNAL_SCHEME_SWITCH);
+ boolean enabled = SharedPreferencesManager.getInstance().readBoolean(
+ ChromePreferenceKeys.USERAGENT_ADM_EXCLUDE_INTERNAL_SCHEME, false);
+ alwaysADMExcludeInternalSchemeSwitch.setChecked(enabled);
+ alwaysADMExcludeInternalSchemeSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
+ SharedPreferencesManager.getInstance().writeBoolean(
+ ChromePreferenceKeys.USERAGENT_ADM_EXCLUDE_INTERNAL_SCHEME, (boolean) newValue);
+
+ UpdateAllTabs();
+ return true;
+ });
+
+ ChromeSwitchPreference alwaysDesktopModeSwitch =
+ (ChromeSwitchPreference) findPreference(PREF_STICK_DESKTOP_MODE_SWITCH);
+ if (alwaysDesktopModeSwitch != null) {
+ boolean enabled = SharedPreferencesManager.getInstance().readBoolean(
+ ChromePreferenceKeys.USERAGENT_STICKY_DESKTOP_MODE, false);
+ alwaysDesktopModeSwitch.setChecked(enabled);
+ alwaysDesktopModeSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
+ SharedPreferencesManager.getInstance().writeBoolean(
+ ChromePreferenceKeys.USERAGENT_STICKY_DESKTOP_MODE, (boolean) newValue);
+ enabled = SharedPreferencesManager.getInstance().readBoolean(
+ ChromePreferenceKeys.USERAGENT_STICKY_DESKTOP_MODE, false);
+ alwaysDesktopModeSwitch.setChecked(enabled);
+ alwaysDesktopModeSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
+ SharedPreferencesManager.getInstance().writeBoolean(
+ ChromePreferenceKeys.USERAGENT_STICKY_DESKTOP_MODE, (boolean) newValue);
+ alwaysADMExcludeInternalSchemeSwitch.setEnabled((boolean) newValue);
+
+ final boolean alwaysDesktopModeEnabled = SharedPreferencesManager.getInstance().readBoolean(
+ ChromePreferenceKeys.USERAGENT_ALWAYS_DESKTOP_MODE, false);
+ TabWindowManager.getInstance().SetOverrideUserAgentForAllTabs(alwaysDesktopModeEnabled);
+ return true;
+ });
+ }
+ UpdateAllTabs();
+ return true;
+ });
+ }
+
+ private void UpdateAllTabs() {
+ final boolean alwaysDesktopModeEnabled = SharedPreferencesManager.getInstance().readBoolean(
+ ChromePreferenceKeys.USERAGENT_ALWAYS_DESKTOP_MODE, false);
+ TabWindowManager.getInstance().SetOverrideUserAgentForAllTabs(alwaysDesktopModeEnabled);
+ }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
@@ -57,6 +57,10 @@ import org.chromium.ui.base.WindowAndroid;
@@ -57,6 +57,12 @@ import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.util.ColorUtils;
import org.chromium.url.GURL;
import org.chromium.url.Origin;
@@ -204,10 +226,12 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
+import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
+import org.chromium.content_public.browser.navigation_controller.UserAgentOverrideOption;
+import org.chromium.content_public.browser.NavigationController;
+import org.chromium.components.embedder_support.util.UrlUtilities;
+import org.chromium.components.url_formatter.UrlFormatter;
/**
* Implementation of the interface {@link Tab}. Contains and manages a {@link ContentView}.
@@ -446,6 +450,18 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
@@ -446,6 +452,23 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
throw new RuntimeException("Tab.loadUrl called when no native side exists");
}
@@ -216,7 +240,12 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
+ if (stickyDesktopModeEnabled) {
+ final boolean alwaysDesktopModeEnabled = SharedPreferencesManager.getInstance().readBoolean(
+ ChromePreferenceKeys.USERAGENT_ALWAYS_DESKTOP_MODE, false);
+ if (alwaysDesktopModeEnabled) {
+ boolean isInternalScheme = false;
+ final boolean alwaysADMExcludeInternalScheme = SharedPreferencesManager.getInstance().readBoolean(
+ ChromePreferenceKeys.USERAGENT_ADM_EXCLUDE_INTERNAL_SCHEME, false);
+ if(alwaysADMExcludeInternalScheme)
+ isInternalScheme = UrlUtilities.isInternalScheme(UrlFormatter.fixupUrl(params.getUrl()));
+ if (alwaysDesktopModeEnabled && isInternalScheme == false) {
+ params.setOverrideUserAgent((int)UserAgentOverrideOption.TRUE);
+ } else {
+ params.setOverrideUserAgent((int)UserAgentOverrideOption.FALSE);
@@ -226,7 +255,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
// We load the URL from the tab rather than directly from the ContentView so the tab has
// a chance of using a prerenderer page is any.
int loadType = TabImplJni.get().loadUrl(mNativeTabAndroid, TabImpl.this,
@@ -458,7 +474,8 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
@@ -458,7 +481,8 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
params.getReferrer() != null ? params.getReferrer().getPolicy() : 0,
params.getIsRendererInitiated(), params.getShouldReplaceCurrentEntry(),
params.getHasUserGesture(), params.getShouldClearHistoryList(),
@@ -236,7 +265,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
for (TabObserver observer : mObservers) {
observer.onLoadUrl(this, params, loadType);
@@ -1380,6 +1397,10 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
@@ -1380,6 +1404,10 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
if (mWebContents != null) mWebContents.getNavigationController().loadIfNecessary();
mIsBeingRestored = true;
for (TabObserver observer : mObservers) observer.onRestoreStarted(this);
@@ -247,16 +276,30 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
} finally {
TraceEvent.end("Tab.restoreIfNeeded");
}
@@ -1497,6 +1518,31 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
@@ -1497,6 +1525,45 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
}
}
+ int overrideUserAgentWhenUnFrozen = (int)UserAgentOverrideOption.INHERIT;
+
+ public void SetOverrideUserAgent(boolean usingDesktopUserAgent) {
+ WebContents webContents = this.getWebContents();
+ overrideUserAgentWhenUnFrozen = UserAgentOverrideOption.INHERIT;
+
+ WebContents webContents = this.getWebContents();
+ if (usingDesktopUserAgent) {
+ final boolean alwaysADMExcludeInternalScheme = SharedPreferencesManager.getInstance().readBoolean(
+ ChromePreferenceKeys.USERAGENT_ADM_EXCLUDE_INTERNAL_SCHEME, false);
+
+ if(alwaysADMExcludeInternalScheme) {
+ GURL url = this.getUrl();
+ if (webContents == null && this.getPendingLoadParams() != null) {
+ url = UrlFormatter.fixupUrl(this.getPendingLoadParams().getUrl());
+ }
+ if (UrlUtilities.isInternalScheme(url) == true)
+ usingDesktopUserAgent = false;
+ }
+ }
+
+ if (webContents != null) {
+ NavigationController navigationController = webContents.getNavigationController();
+ navigationController.setUseDesktopUserAgent(
@@ -279,7 +322,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
@NativeMethods
interface Natives {
void init(TabImpl caller);
@@ -1517,7 +1563,8 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
@@ -1517,7 +1584,8 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
String referrerUrl, int referrerPolicy, boolean isRendererInitiated,
boolean shoulReplaceCurrentEntry, boolean hasUserGesture,
boolean shouldClearHistoryList, long inputStartTimestamp,
@@ -355,24 +398,26 @@ diff --git a/chrome/browser/android/tab_android.h b/chrome/browser/android/tab_a
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
@@ -778,6 +778,9 @@ public final class ChromePreferenceKeys {
@@ -778,6 +778,10 @@ public final class ChromePreferenceKeys {
public static final KeyPrefix KEY_ZERO_SUGGEST_HEADER_GROUP_COLLAPSED_BY_DEFAULT_PREFIX =
new KeyPrefix("zero_suggest_header_group_collapsed_by_default*");
+ public static final String USERAGENT_STICKY_DESKTOP_MODE = "Chrome.UserAgent.StickyDesktopMode";
+ public static final String USERAGENT_ALWAYS_DESKTOP_MODE = "Chrome.UserAgent.AlwaysDesktopMode";
+ public static final String USERAGENT_ADM_EXCLUDE_INTERNAL_SCHEME = "Chrome.UserAgent.ADMExcludeInternalScheme";
+
/**
* These values are currently used as SharedPreferences keys, along with the keys in
* {@link GrandfatheredChromePreferenceKeys#getKeysInUse()}. Add new SharedPreferences keys
@@ -820,7 +823,9 @@ public final class ChromePreferenceKeys {
@@ -820,7 +824,10 @@ public final class ChromePreferenceKeys {
PROMO_TIMES_SEEN.pattern(),
SETTINGS_SAFETY_CHECK_LAST_RUN_TIMESTAMP,
SETTINGS_SAFETY_CHECK_RUN_COUNTER,
- TWA_DISCLOSURE_SEEN_PACKAGES
+ TWA_DISCLOSURE_SEEN_PACKAGES,
+ USERAGENT_STICKY_DESKTOP_MODE,
+ USERAGENT_ALWAYS_DESKTOP_MODE
+ USERAGENT_ALWAYS_DESKTOP_MODE,
+ USERAGENT_ADM_EXCLUDE_INTERNAL_SCHEME
);
// clang-format on
}
@@ -389,7 +434,7 @@ diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/Tab.jav
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -228,6 +228,20 @@ CHAR-LIMIT guidelines:
@@ -228,6 +228,23 @@ CHAR-LIMIT guidelines:
Visit help page
</message>
@@ -406,6 +451,9 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro
+ <message name="IDS_OPTION_DESKTOP_FLAG_OFF" desc="The label of the option that revert the hambuger menu flag to actual behaviour.">
+ Desktop mode toggle in hamburger menu applies to current tab only
+ </message>
+ <message name="IDS_OPTION_EXCLUDE_INTERNAL_SCHEME" desc="The label of the option that exclude internal scheme for desktop mode.">
+ Exclude internal scheme
+ </message>
+
<!-- Notification channels -->
<message name="IDS_NOTIFICATION_CATEGORY_GROUP_GENERAL" desc='Subheading for "General" section of a list of notification categories. [CHAR-LIMIT=32]'>