User agent customization: #222 separate the flag from the site setting
the menu item in the hamburger menu applies to the tab only, whereas the content setting is intended for use in a specific site.
This commit is contained in:
@@ -2,10 +2,10 @@ From: uazo <uazo@users.noreply.github.com>
|
||||
Date: Fri, 9 Apr 2021 20:09:08 +0000
|
||||
Subject: User agent customization
|
||||
|
||||
Add flag to always view the desktop site for all websites
|
||||
Add possibility to define a custom User agent for mobile and desktop mode.
|
||||
Add possibility to reactivate the metatag view for desktop mode, allowing users to choose
|
||||
to use the flag in the hamburger menu to navigate with a custom useragent leaving the standard navigation unchanged.
|
||||
Add possibility to reactivate the metatag view for desktop mode.
|
||||
The menu item in the hamburger menu applies to the tab only,
|
||||
whereas the content setting is intended for use in a specific site.
|
||||
|
||||
Original License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
|
||||
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
|
||||
@@ -16,23 +16,29 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
|
||||
chrome/android/chrome_java_sources.gni | 1 +
|
||||
.../layout/custom_useragent_preferences.xml | 106 ++++++++++
|
||||
.../android/java/res/xml/main_preferences.xml | 5 +
|
||||
.../java/res/xml/useragent_preferences.xml | 31 +++
|
||||
.../java/res/xml/useragent_preferences.xml | 25 +++
|
||||
.../chrome/browser/app/ChromeActivity.java | 2 +-
|
||||
.../init/ChromeBrowserInitializer.java | 3 +
|
||||
.../PrivacyPreferencesManagerImpl.java | 42 ++++
|
||||
.../settings/UserAgentPreferences.java | 188 ++++++++++++++++++
|
||||
.../chromium/chrome/browser/tab/TabImpl.java | 94 ++++++++-
|
||||
.../chromium/chrome/browser/tab/TabUtils.java | 24 ++-
|
||||
.../settings/UserAgentPreferences.java | 183 ++++++++++++++++++
|
||||
.../browser/tab/RequestDesktopUtils.java | 1 +
|
||||
.../chromium/chrome/browser/tab/TabImpl.java | 71 +++++--
|
||||
.../chromium/chrome/browser/tab/TabUtils.java | 17 +-
|
||||
.../browser/android/content/content_utils.cc | 30 +++
|
||||
.../preferences/browser_prefs_android.cc | 7 +
|
||||
.../privacy_preferences_manager_impl.cc | 124 ++++++++++++
|
||||
.../preferences/ChromePreferenceKeys.java | 7 +-
|
||||
...ktop_site_web_contents_observer_android.cc | 11 ++
|
||||
...sktop_site_web_contents_observer_android.h | 2 +
|
||||
.../preferences/ChromePreferenceKeys.java | 2 -
|
||||
.../settings/PrivacyPreferencesManager.java | 8 +
|
||||
.../org/chromium/chrome/browser/tab/Tab.java | 2 +
|
||||
.../browser/tabmodel/TabWindowManager.java | 2 +
|
||||
.../tabmodel/TabWindowManagerImpl.java | 18 ++
|
||||
.../strings/android_chrome_strings.grd | 35 ++++
|
||||
.../strings/android_chrome_strings.grd | 26 +++
|
||||
chrome/common/pref_names.h | 8 +
|
||||
.../widget/RadioButtonWithEditText.java | 11 +
|
||||
...omiteRequestDesktopSiteContentSetting.java | 76 ++++++++
|
||||
.../request_desktop_site.grdp | 18 ++
|
||||
.../widget/RadioButtonWithEditText.java | 11 ++
|
||||
.../embedder_support/user_agent_utils.cc | 3 +-
|
||||
.../navigation_controller_android.cc | 4 +
|
||||
.../navigation_controller_android.h | 1 +
|
||||
@@ -40,10 +46,12 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
|
||||
.../browser/web_contents/web_contents_impl.cc | 6 +-
|
||||
.../framehost/NavigationControllerImpl.java | 3 +-
|
||||
content/renderer/render_thread_impl.cc | 1 -
|
||||
30 files changed, 752 insertions(+), 19 deletions(-)
|
||||
36 files changed, 794 insertions(+), 32 deletions(-)
|
||||
create mode 100644 chrome/android/java/res/layout/custom_useragent_preferences.xml
|
||||
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
|
||||
create mode 100644 components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteRequestDesktopSiteContentSetting.java
|
||||
create mode 100644 components/browser_ui/strings/bromite_content_settings/request_desktop_site.grdp
|
||||
|
||||
diff --git a/base/base_switches.cc b/base/base_switches.cc
|
||||
--- a/base/base_switches.cc
|
||||
@@ -220,7 +228,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,31 @@
|
||||
@@ -0,0 +1,25 @@
|
||||
+<?xml version="1.0" encoding="utf-8"?>
|
||||
+<!--
|
||||
+ This file is part of Bromite.
|
||||
@@ -245,13 +253,19 @@ new file mode 100644
|
||||
+ xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
+ xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
+
|
||||
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
|
||||
+ android:key="desktop_mode_switch"
|
||||
+ android:title="@string/option_desktop_flag"
|
||||
+ android:summaryOn="@string/option_desktop_flag_on"
|
||||
+ android:summaryOff="@string/option_desktop_flag_off" />
|
||||
+
|
||||
+</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
|
||||
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
|
||||
@@ -2741,7 +2741,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
|
||||
TabUtils.switchUserAgent(
|
||||
currentTab,
|
||||
usingDesktopUserAgent,
|
||||
- /* forcedByUser= */ false,
|
||||
+ /* forcedByUser= */ true,
|
||||
UseDesktopUserAgentCaller.ON_MENU_OR_KEYBOARD_ACTION);
|
||||
// TODO(crbug.com/1456560): Remove this IPH when the usage is low.
|
||||
RequestDesktopUtils.maybeShowUserEducationPromptForAppMenuSelection(
|
||||
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
|
||||
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
|
||||
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
|
||||
@@ -339,7 +353,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,188 @@
|
||||
@@ -0,0 +1,183 @@
|
||||
+/*
|
||||
+ This file is part of Bromite.
|
||||
+
|
||||
@@ -381,22 +395,23 @@ new file mode 100644
|
||||
+import org.chromium.components.browser_ui.widget.RadioButtonWithDescription;
|
||||
+import org.chromium.components.browser_ui.widget.RadioButtonWithEditText;
|
||||
+import org.chromium.components.browser_ui.settings.SettingsUtils;
|
||||
+
|
||||
+import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
|
||||
+import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
|
||||
+
|
||||
+import org.chromium.components.content_settings.ContentSettingsType;
|
||||
+import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge;
|
||||
+import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton;
|
||||
+import org.chromium.chrome.browser.tabmodel.TabWindowManager;
|
||||
+import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl;
|
||||
+import org.chromium.chrome.browser.profiles.Profile;
|
||||
+import org.chromium.chrome.browser.settings.ProfileDependentSetting;
|
||||
+import org.chromium.chrome.R;
|
||||
+
|
||||
+/**
|
||||
+ * Fragment that allows the user to configure User Agent related preferences.
|
||||
+ */
|
||||
+public class UserAgentPreferences
|
||||
+ extends PreferenceFragmentCompat implements RadioGroup.OnCheckedChangeListener {
|
||||
+ extends PreferenceFragmentCompat
|
||||
+ implements RadioGroup.OnCheckedChangeListener,
|
||||
+ ProfileDependentSetting {
|
||||
+
|
||||
+ private static final String PREF_STICK_DESKTOP_MODE_SWITCH = "desktop_mode_switch";
|
||||
+ private RadioButtonWithDescription useDefaultAgentSwitch;
|
||||
+ private RadioButtonWithEditText useCustomAgentSwitch;
|
||||
+ private RadioButtonWithDescription useDefaultAgentSwitchDesktopMode;
|
||||
@@ -404,23 +419,17 @@ new file mode 100644
|
||||
+ private RadioGroup mRadioGroup;
|
||||
+ private RadioGroup mRadioGroupDesktopMode;
|
||||
+ private CheckBox mDesktopModeViewportmeta;
|
||||
+ private Profile mProfile;
|
||||
+
|
||||
+ @Override
|
||||
+ public void setProfile(Profile profile) {
|
||||
+ mProfile = profile;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
|
||||
+ getActivity().setTitle(R.string.useragent_settings_title);
|
||||
+ SettingsUtils.addPreferencesFromResource(this, R.xml.useragent_preferences);
|
||||
+
|
||||
+ ChromeSwitchPreference alwaysDesktopModeSwitch =
|
||||
+ (ChromeSwitchPreference) findPreference(PREF_STICK_DESKTOP_MODE_SWITCH);
|
||||
+ boolean enabled = ChromeSharedPreferences.getInstance().readBoolean(
|
||||
+ ChromePreferenceKeys.USERAGENT_STICKY_DESKTOP_MODE, false);
|
||||
+ alwaysDesktopModeSwitch.setChecked(enabled);
|
||||
+ alwaysDesktopModeSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
+ ChromeSharedPreferences.getInstance().writeBoolean(
|
||||
+ ChromePreferenceKeys.USERAGENT_STICKY_DESKTOP_MODE, (boolean) newValue);
|
||||
+ UpdateAllTabs();
|
||||
+ return true;
|
||||
+ });
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
@@ -500,8 +509,8 @@ new file mode 100644
|
||||
+ }
|
||||
+
|
||||
+ private void UpdateAllTabs() {
|
||||
+ final boolean alwaysDesktopModeEnabled = ChromeSharedPreferences.getInstance().readBoolean(
|
||||
+ ChromePreferenceKeys.USERAGENT_ALWAYS_DESKTOP_MODE, false);
|
||||
+ final boolean alwaysDesktopModeEnabled = WebsitePreferenceBridge.isCategoryEnabled(
|
||||
+ mProfile, ContentSettingsType.REQUEST_DESKTOP_SITE);
|
||||
+ TabWindowManagerSingleton.getInstance().SetOverrideUserAgentForAllTabs(alwaysDesktopModeEnabled);
|
||||
+ }
|
||||
+
|
||||
@@ -528,99 +537,79 @@ new file mode 100644
|
||||
+ UpdateAllTabs();
|
||||
+ }
|
||||
+}
|
||||
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java
|
||||
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java
|
||||
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java
|
||||
@@ -139,6 +139,7 @@ public class RequestDesktopUtils {
|
||||
*/
|
||||
public static void setRequestDesktopSiteContentSettingsForUrl(
|
||||
Profile profile, GURL url, boolean useDesktopUserAgent) {
|
||||
+ if ((true)) return;
|
||||
boolean isIncognito =
|
||||
Profile.getBrowserProfileTypeFromProfile(profile) == BrowserProfileType.INCOGNITO;
|
||||
String domainWildcardPattern =
|
||||
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
|
||||
@@ -93,6 +93,11 @@ import org.chromium.chrome.browser.preferences.Pref;
|
||||
@@ -63,6 +63,9 @@ import org.chromium.components.autofill.AutofillFeatures;
|
||||
import org.chromium.components.autofill.AutofillProvider;
|
||||
import org.chromium.components.autofill.AutofillSelectionActionMenuDelegate;
|
||||
import org.chromium.components.autofill.AutofillSelectionMenuItemHelper;
|
||||
+import org.chromium.components.content_settings.ContentSettingValues;
|
||||
+import org.chromium.components.content_settings.ContentSettingsType;
|
||||
+import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge;
|
||||
import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils;
|
||||
import org.chromium.components.embedder_support.util.UrlConstants;
|
||||
import org.chromium.components.embedder_support.view.ContentView;
|
||||
@@ -93,6 +96,9 @@ import org.chromium.chrome.browser.preferences.Pref;
|
||||
import org.chromium.chrome.browser.profiles.ProfileManager;
|
||||
import org.chromium.components.user_prefs.UserPrefs;
|
||||
|
||||
+import org.chromium.content_public.browser.NavigationController;
|
||||
+import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
|
||||
+import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
|
||||
+import org.chromium.components.embedder_support.util.UrlUtilities;
|
||||
+
|
||||
/**
|
||||
* Implementation of the interface {@link Tab}. Contains and manages a {@link ContentView}. This
|
||||
* class is not intended to be extended.
|
||||
@@ -627,6 +632,32 @@ class TabImpl implements Tab {
|
||||
params.setOverrideUserAgent(calculateUserAgentOverrideOption(null));
|
||||
@@ -678,11 +684,6 @@ class TabImpl implements Tab {
|
||||
return true;
|
||||
}
|
||||
|
||||
- // If desktop mode window setting is enabled, move switchUserAgentIfNeeded() from
|
||||
- // loadIfNeeded() to restoreIfNeeded(); to avoid reload without explicit user intent.
|
||||
- if (!ContentFeatureMap.isEnabled(ContentFeatureList.REQUEST_DESKTOP_SITE_WINDOW_SETTING)) {
|
||||
- switchUserAgentIfNeeded(UseDesktopUserAgentCaller.LOAD_IF_NEEDED + caller);
|
||||
- }
|
||||
restoreIfNeeded(caller);
|
||||
return true;
|
||||
}
|
||||
@@ -1745,13 +1746,6 @@ class TabImpl implements Tab {
|
||||
}
|
||||
|
||||
+ final boolean stickyDesktopModeEnabled = ChromeSharedPreferences.getInstance().readBoolean(
|
||||
+ ChromePreferenceKeys.USERAGENT_STICKY_DESKTOP_MODE, false);
|
||||
+ if (stickyDesktopModeEnabled) {
|
||||
+ boolean alwaysDesktopModeEnabled = ChromeSharedPreferences.getInstance().readBoolean(
|
||||
+ ChromePreferenceKeys.USERAGENT_ALWAYS_DESKTOP_MODE, false);
|
||||
+
|
||||
+ if (UrlUtilities.isInternalScheme(UrlFormatter.fixupUrl(params.getUrl()))) {
|
||||
+ alwaysDesktopModeEnabled = false;
|
||||
+ }
|
||||
+
|
||||
+ WebContents webContents = this.getWebContents();
|
||||
+ if (webContents != null) {
|
||||
+ NavigationController navigationController = webContents.getNavigationController();
|
||||
+ boolean currentUseDesktopUserAgent = navigationController.getUseDesktopUserAgent();
|
||||
+ if (currentUseDesktopUserAgent != alwaysDesktopModeEnabled)
|
||||
+ navigationController.setUseDesktopUserAgent(alwaysDesktopModeEnabled, false,
|
||||
+ UseDesktopUserAgentCaller.OTHER);
|
||||
+ }
|
||||
+
|
||||
+ if (alwaysDesktopModeEnabled) {
|
||||
+ params.setOverrideUserAgent((int)UserAgentOverrideOption.TRUE);
|
||||
+ } else {
|
||||
+ params.setOverrideUserAgent((int)UserAgentOverrideOption.FALSE);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
LoadUrlResult result = loadUrlInternal(params, fixedUrl);
|
||||
|
||||
for (TabObserver observer : mObservers) {
|
||||
@@ -1581,9 +1612,17 @@ class TabImpl implements Tab {
|
||||
|
||||
mWebContents.setImportance(mImportance);
|
||||
|
||||
- ContentUtils.setUserAgentOverride(
|
||||
+ if (ChromeSharedPreferences.getInstance().readBoolean(
|
||||
+ ChromePreferenceKeys.USERAGENT_STICKY_DESKTOP_MODE, false) &&
|
||||
+ ChromeSharedPreferences.getInstance().readBoolean(
|
||||
+ ChromePreferenceKeys.USERAGENT_ALWAYS_DESKTOP_MODE, false)) {
|
||||
+ ContentUtils.setUserAgentOverride(
|
||||
+ mWebContents, true);
|
||||
+ } else {
|
||||
+ ContentUtils.setUserAgentOverride(
|
||||
mWebContents,
|
||||
calculateUserAgentOverrideOption(null) == UserAgentOverrideOption.TRUE);
|
||||
+ }
|
||||
|
||||
mContentView.addOnAttachStateChangeListener(mAttachStateChangeListener);
|
||||
updateInteractableState();
|
||||
@@ -1756,6 +1795,10 @@ class TabImpl implements Tab {
|
||||
if (mWebContents != null) {
|
||||
- // If desktop mode window setting is enabled, move switchUserAgentIfNeeded() from
|
||||
- // loadIfNeeded() to restoreIfNeeded(); to avoid reload without explicit user
|
||||
- // intent.
|
||||
- if (ContentFeatureMap.isEnabled(
|
||||
- ContentFeatureList.REQUEST_DESKTOP_SITE_WINDOW_SETTING)) {
|
||||
- switchUserAgentIfNeeded(UseDesktopUserAgentCaller.LOAD_IF_NEEDED + caller);
|
||||
- }
|
||||
mWebContents.getNavigationController().loadIfNecessary();
|
||||
}
|
||||
mIsBeingRestored = true;
|
||||
for (TabObserver observer : mObservers) observer.onRestoreStarted(this);
|
||||
+ if(overrideUserAgentWhenUnFrozen != UserAgentOverrideOption.INHERIT) {
|
||||
+ SetOverrideUserAgent(overrideUserAgentWhenUnFrozen == (int)UserAgentOverrideOption.TRUE ? true : false,
|
||||
+ /*forcedByUser*/ true);
|
||||
+ }
|
||||
} finally {
|
||||
TraceEvent.end("Tab.restoreIfNeeded");
|
||||
@@ -2061,6 +2055,11 @@ class TabImpl implements Tab {
|
||||
url = webContents.getVisibleUrl();
|
||||
}
|
||||
@@ -2051,6 +2094,13 @@ class TabImpl implements Tab {
|
||||
}
|
||||
|
||||
private @UserAgentOverrideOption int calculateUserAgentOverrideOption(@Nullable GURL url) {
|
||||
+ if (ChromeSharedPreferences.getInstance().readBoolean(
|
||||
+ ChromePreferenceKeys.USERAGENT_STICKY_DESKTOP_MODE, false) &&
|
||||
+ ChromeSharedPreferences.getInstance().readBoolean(
|
||||
+ ChromePreferenceKeys.USERAGENT_ALWAYS_DESKTOP_MODE, false)) {
|
||||
+ return UserAgentOverrideOption.INHERIT;
|
||||
+ }
|
||||
+ if (tabUserAgent == TabUserAgent.MOBILE)
|
||||
+ return UserAgentOverrideOption.FALSE;
|
||||
+ else if (tabUserAgent == TabUserAgent.DESKTOP)
|
||||
+ return UserAgentOverrideOption.TRUE;
|
||||
+
|
||||
WebContents webContents = getWebContents();
|
||||
boolean currentRequestDesktopSite = TabUtils.isUsingDesktopUserAgent(webContents);
|
||||
@TabUserAgent int tabUserAgent = TabUtils.getTabUserAgent(this);
|
||||
@@ -2132,6 +2182,48 @@ class TabImpl implements Tab {
|
||||
// Do not override UA if there is a tab level setting.
|
||||
if (tabUserAgent != TabUserAgent.DEFAULT) {
|
||||
recordHistogramUseDesktopUserAgent(currentRequestDesktopSite);
|
||||
@@ -2132,6 +2131,54 @@ class TabImpl implements Tab {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -628,10 +617,9 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
|
||||
+
|
||||
+ public void SetOverrideUserAgent(boolean usingDesktopUserAgent, boolean forcedByUser) {
|
||||
+ WebContents webContents = this.getWebContents();
|
||||
+ overrideUserAgentWhenUnFrozen = UserAgentOverrideOption.INHERIT;
|
||||
+
|
||||
+ GURL url = this.getUrl();
|
||||
+ if (usingDesktopUserAgent) {
|
||||
+ GURL url = this.getUrl();
|
||||
+ if (webContents == null && this.getPendingLoadParams() != null) {
|
||||
+ url = UrlFormatter.fixupUrl(this.getPendingLoadParams().getUrl());
|
||||
+ }
|
||||
@@ -641,7 +629,18 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
|
||||
+
|
||||
+ if (forcedByUser) {
|
||||
+ @TabUserAgent
|
||||
+ int tabUserAgent = usingDesktopUserAgent ? TabUserAgent.DESKTOP : TabUserAgent.MOBILE;
|
||||
+ int tabUserAgent = TabUserAgent.DEFAULT;
|
||||
+ @ContentSettingValues
|
||||
+ int contentSetting = WebsitePreferenceBridge.getContentSetting(
|
||||
+ mProfile, ContentSettingsType.REQUEST_DESKTOP_SITE, url, url);
|
||||
+ if (!usingDesktopUserAgent
|
||||
+ && contentSetting != ContentSettingValues.BLOCK) {
|
||||
+ tabUserAgent = TabUserAgent.MOBILE;
|
||||
+ } else if (usingDesktopUserAgent
|
||||
+ && contentSetting != ContentSettingValues.ALLOW) {
|
||||
+ tabUserAgent = TabUserAgent.DESKTOP;
|
||||
+ }
|
||||
+
|
||||
+ setUserAgent(tabUserAgent);
|
||||
+ }
|
||||
+
|
||||
@@ -660,10 +659,6 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
|
||||
+ this.getPendingLoadParams().setOverrideUserAgent((int)UserAgentOverrideOption.FALSE);
|
||||
+ }
|
||||
+ }
|
||||
+ else {
|
||||
+ overrideUserAgentWhenUnFrozen = usingDesktopUserAgent ? UserAgentOverrideOption.TRUE :
|
||||
+ UserAgentOverrideOption.FALSE;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
@NativeMethods
|
||||
@@ -683,7 +678,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.ja
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
||||
@@ -124,17 +128,15 @@ public class TabUtils {
|
||||
@@ -124,18 +128,7 @@ public class TabUtils {
|
||||
// TODO(crbug.com/1413060): Remove param forcedByUser from TabUtils#switchUserAgent.
|
||||
public static void switchUserAgent(
|
||||
Tab tab, boolean switchToDesktop, boolean forcedByUser, int caller) {
|
||||
@@ -698,18 +693,11 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.ja
|
||||
- tabUserAgent = TabUserAgent.DEFAULT;
|
||||
- }
|
||||
- tab.setUserAgent(tabUserAgent);
|
||||
+ ChromeSharedPreferences.getInstance().writeBoolean(
|
||||
+ ChromePreferenceKeys.USERAGENT_ALWAYS_DESKTOP_MODE, switchToDesktop);
|
||||
+
|
||||
+ final boolean stickyDesktopModeEnabled = ChromeSharedPreferences.getInstance().readBoolean(
|
||||
+ ChromePreferenceKeys.USERAGENT_STICKY_DESKTOP_MODE, false);
|
||||
+ if (stickyDesktopModeEnabled) {
|
||||
+ TabWindowManagerSingleton.getInstance().SetOverrideUserAgentForAllTabs(switchToDesktop);
|
||||
+ } else {
|
||||
+ tab.SetOverrideUserAgent(switchToDesktop, forcedByUser);
|
||||
}
|
||||
- }
|
||||
+ tab.SetOverrideUserAgent(switchToDesktop, forcedByUser);
|
||||
}
|
||||
|
||||
/**
|
||||
diff --git a/chrome/browser/android/content/content_utils.cc b/chrome/browser/android/content/content_utils.cc
|
||||
--- a/chrome/browser/android/content/content_utils.cc
|
||||
+++ b/chrome/browser/android/content/content_utils.cc
|
||||
@@ -919,27 +907,69 @@ diff --git a/chrome/browser/android/preferences/privacy_preferences_manager_impl
|
||||
+ enabled);
|
||||
+ UpdateOverrideUserAgent();
|
||||
+}
|
||||
diff --git a/chrome/browser/content_settings/request_desktop_site_web_contents_observer_android.cc b/chrome/browser/content_settings/request_desktop_site_web_contents_observer_android.cc
|
||||
--- a/chrome/browser/content_settings/request_desktop_site_web_contents_observer_android.cc
|
||||
+++ b/chrome/browser/content_settings/request_desktop_site_web_contents_observer_android.cc
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "base/command_line.h"
|
||||
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
|
||||
#include "chrome/browser/profiles/profile.h"
|
||||
+#include "chrome/browser/ui/android/tab_model/tab_model.h"
|
||||
#include "chrome/common/chrome_switches.h"
|
||||
#include "components/content_settings/core/common/content_settings_utils.h"
|
||||
#include "components/content_settings/core/common/pref_names.h"
|
||||
@@ -36,6 +37,7 @@ RequestDesktopSiteWebContentsObserverAndroid::
|
||||
if (base::FeatureList::IsEnabled(
|
||||
features::kRequestDesktopSiteWindowSetting)) {
|
||||
pref_service_ = profile->GetPrefs();
|
||||
+ tab_android_ = TabAndroid::FromWebContents(contents);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,6 +53,15 @@ void RequestDesktopSiteWebContentsObserverAndroid::DidStartNavigation(
|
||||
return;
|
||||
}
|
||||
|
||||
+ // Stop UA override if there is a tab level setting.
|
||||
+ TabModel::TabUserAgent tabSetting =
|
||||
+ tab_android_
|
||||
+ ? static_cast<TabModel::TabUserAgent>(tab_android_->GetUserAgent())
|
||||
+ : TabModel::TabUserAgent::DEFAULT;
|
||||
+ if (tabSetting != TabModel::TabUserAgent::DEFAULT) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
const GURL& url = navigation_handle->GetParentFrameOrOuterDocument()
|
||||
? navigation_handle->GetParentFrameOrOuterDocument()
|
||||
->GetOutermostMainFrame()
|
||||
diff --git a/chrome/browser/content_settings/request_desktop_site_web_contents_observer_android.h b/chrome/browser/content_settings/request_desktop_site_web_contents_observer_android.h
|
||||
--- a/chrome/browser/content_settings/request_desktop_site_web_contents_observer_android.h
|
||||
+++ b/chrome/browser/content_settings/request_desktop_site_web_contents_observer_android.h
|
||||
@@ -5,6 +5,7 @@
|
||||
#ifndef CHROME_BROWSER_CONTENT_SETTINGS_REQUEST_DESKTOP_SITE_WEB_CONTENTS_OBSERVER_ANDROID_H_
|
||||
#define CHROME_BROWSER_CONTENT_SETTINGS_REQUEST_DESKTOP_SITE_WEB_CONTENTS_OBSERVER_ANDROID_H_
|
||||
|
||||
+#include "chrome/browser/android/tab_android.h"
|
||||
#include "components/content_settings/core/browser/host_content_settings_map.h"
|
||||
#include "content/public/browser/web_contents_observer.h"
|
||||
#include "content/public/browser/web_contents_user_data.h"
|
||||
@@ -37,6 +38,7 @@ class RequestDesktopSiteWebContentsObserverAndroid
|
||||
|
||||
scoped_refptr<HostContentSettingsMap> host_content_settings_map_;
|
||||
raw_ptr<PrefService> pref_service_ = nullptr;
|
||||
+ raw_ptr<TabAndroid> tab_android_ = nullptr;
|
||||
|
||||
WEB_CONTENTS_USER_DATA_KEY_DECL();
|
||||
};
|
||||
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
|
||||
@@ -888,6 +888,9 @@ public final class ChromePreferenceKeys {
|
||||
public static final String BLUETOOTH_NOTIFICATION_IDS = "Chrome.Bluetooth.NotificationIds";
|
||||
public static final String USB_NOTIFICATION_IDS = "Chrome.USB.NotificationIds";
|
||||
|
||||
+ public static final String USERAGENT_STICKY_DESKTOP_MODE = "Chrome.UserAgent.StickyDesktopMode";
|
||||
+ public static final String USERAGENT_ALWAYS_DESKTOP_MODE = "Chrome.UserAgent.AlwaysDesktopMode";
|
||||
+
|
||||
/**
|
||||
* These values are currently used as SharedPreferences keys, along with the keys in
|
||||
* {@link LegacyChromePreferenceKeys#getKeysInUse()}. Add new SharedPreferences keys
|
||||
@@ -1019,8 +1022,8 @@ public final class ChromePreferenceKeys {
|
||||
@@ -1019,8 +1019,6 @@ public final class ChromePreferenceKeys {
|
||||
SIGNIN_PROMO_NTP_LAST_SHOWN_TIME,
|
||||
SYNC_PROMO_TOTAL_SHOW_COUNT,
|
||||
SEARCH_RESUMPTION_MODULE_COLLAPSE_ON_NTP,
|
||||
- SWAA_TIMESTAMP,
|
||||
- SWAA_STATUS,
|
||||
+ USERAGENT_STICKY_DESKTOP_MODE,
|
||||
+ USERAGENT_ALWAYS_DESKTOP_MODE,
|
||||
TABBED_ACTIVITY_LAST_VISIBLE_TIME_MS,
|
||||
TAB_DECLUTTER_ARCHIVE_ENABLED,
|
||||
TAB_DECLUTTER_ARCHIVE_TIME_DELTA_HOURS,
|
||||
@@ -1003,7 +1033,7 @@ diff --git a/chrome/browser/tabmodel/internal/android/java/src/org/chromium/chro
|
||||
+
|
||||
+ for (int tabIdex = 0; tabIdex < model.getCount(); tabIdex++) {
|
||||
+ Tab theTab = model.getTabAt(tabIdex);
|
||||
+ theTab.SetOverrideUserAgent(usingDesktopUserAgent, /*forcedByUser*/ true);
|
||||
+ theTab.SetOverrideUserAgent(usingDesktopUserAgent, /*forcedByUser*/ false);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
@@ -1016,7 +1046,7 @@ diff --git a/chrome/browser/tabmodel/internal/android/java/src/org/chromium/chro
|
||||
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
|
||||
@@ -239,6 +239,41 @@ CHAR_LIMIT guidelines:
|
||||
@@ -239,6 +239,32 @@ CHAR_LIMIT guidelines:
|
||||
Visit help page
|
||||
</message>
|
||||
|
||||
@@ -1027,15 +1057,6 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro
|
||||
+ <message name="IDS_USERAGENT_SETTINGS_TITLE" desc="Title of the User Agent screen. [CHAR-LIMIT=32]">
|
||||
+ Customize User Agent
|
||||
+ </message>
|
||||
+ <message name="IDS_OPTION_DESKTOP_FLAG" desc="The label of the option that allows users to sticky desktop mode view flag under hambuger menu.">
|
||||
+ Current behaviour for desktop mode toggle in hamburger menu
|
||||
+ </message>
|
||||
+ <message name="IDS_OPTION_DESKTOP_FLAG_ON" desc="The label of the option that allows users to sticky desktop mode view flag under hambuger menu. [CHAR-LIMIT=32]">
|
||||
+ Applies to all tabs (sticky mode)
|
||||
+ </message>
|
||||
+ <message name="IDS_OPTION_DESKTOP_FLAG_OFF" desc="The label of the option that revert the hambuger menu flag to actual behaviour. [CHAR-LIMIT=32]">
|
||||
+ Applies to website
|
||||
+ </message>
|
||||
+ <message name="IDS_CUSTOM_UA_FLAG_ON" desc="The label of the option that allows users to define custom user agent.">
|
||||
+ Use custom user agent
|
||||
+ </message>
|
||||
@@ -1076,6 +1097,110 @@ diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
|
||||
// Boolean indicating whether to show a promo for the quiet notification
|
||||
// permission UI.
|
||||
inline constexpr char kQuietNotificationPermissionShouldShowPromo[] =
|
||||
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteRequestDesktopSiteContentSetting.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteRequestDesktopSiteContentSetting.java
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteRequestDesktopSiteContentSetting.java
|
||||
@@ -0,0 +1,76 @@
|
||||
+/*
|
||||
+ This file is part of Bromite.
|
||||
+
|
||||
+ Bromite is free software: you can redistribute it and/or modify
|
||||
+ it under the terms of the GNU General Public License as published by
|
||||
+ the Free Software Foundation, either version 3 of the License, or
|
||||
+ (at your option) any later version.
|
||||
+
|
||||
+ Bromite is distributed in the hope that it will be useful,
|
||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ GNU General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU General Public License
|
||||
+ along with Bromite. If not, see <https://www.gnu.org/licenses/>.
|
||||
+*/
|
||||
+
|
||||
+package org.chromium.components.browser_ui.site_settings.impl;
|
||||
+
|
||||
+import org.chromium.components.browser_ui.site_settings.R;
|
||||
+
|
||||
+import org.chromium.components.browser_ui.site_settings.BromiteCustomContentSetting;
|
||||
+import org.chromium.components.browser_ui.site_settings.ContentSettingsResources;
|
||||
+import org.chromium.components.browser_ui.site_settings.SiteSettingsCategory;
|
||||
+import org.chromium.components.content_settings.ContentSettingValues;
|
||||
+import org.chromium.components.content_settings.ContentSettingsType;
|
||||
+import org.chromium.content_public.browser.BrowserContextHandle;
|
||||
+
|
||||
+import androidx.annotation.Nullable;
|
||||
+import androidx.preference.Preference;
|
||||
+import androidx.preference.PreferenceScreen;
|
||||
+
|
||||
+import java.util.ArrayList;
|
||||
+
|
||||
+public class BromiteRequestDesktopSiteContentSetting extends BromiteCustomContentSetting {
|
||||
+ public BromiteRequestDesktopSiteContentSetting() {
|
||||
+ super(/*contentSettingsType*/ ContentSettingsType.REQUEST_DESKTOP_SITE,
|
||||
+ /*defaultEnabledValue*/ ContentSettingValues.ALLOW,
|
||||
+ /*defaultDisabledValue*/ ContentSettingValues.BLOCK,
|
||||
+ /*allowException*/ true,
|
||||
+ /*preferenceKey*/ "request_desktop_site",
|
||||
+ /*profilePrefKey*/ "request_desktop_site_permission_list");
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public ContentSettingsResources.ResourceItem getResourceItem() {
|
||||
+ return null;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public int getCategorySummary(@Nullable @ContentSettingValues int value) {
|
||||
+ switch (value) {
|
||||
+ case ContentSettingValues.ALLOW:
|
||||
+ return R.string.website_settings_category_request_desktop_site_enabled;
|
||||
+ case ContentSettingValues.BLOCK:
|
||||
+ return R.string.website_settings_category_request_desktop_site_disabled;
|
||||
+ default:
|
||||
+ return 0;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public int getCategoryDescription() {
|
||||
+ return R.string.settings_site_settings_request_desktop_site_description;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public int getAddExceptionDialogMessage() {
|
||||
+ return R.string.website_settings_category_request_desktop_site_enabled;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public @Nullable Boolean considerException(SiteSettingsCategory category, @ContentSettingValues int value) {
|
||||
+ return value != ContentSettingValues.ALLOW;
|
||||
+ }
|
||||
+}
|
||||
diff --git a/components/browser_ui/strings/bromite_content_settings/request_desktop_site.grdp b/components/browser_ui/strings/bromite_content_settings/request_desktop_site.grdp
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/components/browser_ui/strings/bromite_content_settings/request_desktop_site.grdp
|
||||
@@ -0,0 +1,18 @@
|
||||
+<?xml version="1.0" encoding="utf-8"?>
|
||||
+<grit-part>
|
||||
+ <message name="IDS_SITE_SETTINGS_TYPE_REQUEST_DESKTOP_SITE" desc="The label used for request desktop site site settings controls." formatter_data="android_java">
|
||||
+ Request desktop site
|
||||
+ </message>
|
||||
+
|
||||
+ <message name="IDS_SETTINGS_SITE_SETTINGS_REQUEST_DESKTOP_SITE_DESCRIPTION" desc="" formatter_data="android_java">
|
||||
+ Request desktop site
|
||||
+ </message>
|
||||
+
|
||||
+ <message name="IDS_WEBSITE_SETTINGS_CATEGORY_REQUEST_DESKTOP_SITE_ENABLED" desc="" formatter_data="android_java">
|
||||
+ Request desktop site
|
||||
+ </message>
|
||||
+
|
||||
+ <message name="IDS_WEBSITE_SETTINGS_CATEGORY_REQUEST_DESKTOP_SITE_DISABLED" desc="" formatter_data="android_java">
|
||||
+ Request mobile site
|
||||
+ </message>
|
||||
+</grit-part>
|
||||
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithEditText.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithEditText.java
|
||||
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithEditText.java
|
||||
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithEditText.java
|
||||
|
||||
Reference in New Issue
Block a user