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:
Carmelo Messina
2024-05-25 13:06:29 +02:00
parent f0a26f7549
commit 82789a4bd0
+280 -155
View File
@@ -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