Browse Source

updated patch for v90

Carmelo Messina 4 years ago
parent
commit
1aef9679ae
2 changed files with 122 additions and 210 deletions
  1. 1 0
      build/bromite_patches_list.txt
  2. 121 210
      build/patches/User-agent-customization.patch

+ 1 - 0
build/bromite_patches_list.txt

@@ -145,4 +145,5 @@ Add-option-to-force-tablet-UI.patch
 Make-all-favicon-requests-on-demand.patch
 Add-Alt-D-hotkey-to-focus-address-bar.patch
 Remove-offline-measurement-background-task.patch
+User-agent-customization.patch
 Automated-domain-substitution.patch

+ 121 - 210
build/patches/User-agent-customization.patch

@@ -1,5 +1,5 @@
 From: uazo <uazo@users.noreply.github.com>
-Date: Mon, 26 Oct 2020 16:50:15 +0000
+Date: Fri, 9 Apr 2021 20:09:08 +0000
 Subject: User agent customization
 
 Add flag to always view the desktop site for all websites
@@ -11,36 +11,34 @@ to use the flag in the hamburger menu to navigate with a custom useragent leavin
  base/base_switches.h                          |   2 +
  chrome/android/chrome_java_resources.gni      |   2 +
  chrome/android/chrome_java_sources.gni        |   1 +
- .../layout/custom_useragent_preferences.xml   | 108 ++++++++++
+ .../layout/custom_useragent_preferences.xml   | 106 ++++++++++
  .../android/java/res/xml/main_preferences.xml |   5 +
  .../java/res/xml/useragent_preferences.xml    |  31 +++
- .../chrome/browser/app/ChromeActivity.java    |  21 +-
  .../init/ChromeBrowserInitializer.java        |   3 +
  .../PrivacyPreferencesManagerImpl.java        |  42 ++++
- .../settings/UserAgentPreferences.java        | 185 ++++++++++++++++++
- .../chromium/chrome/browser/tab/TabImpl.java  |  83 +++++++-
+ .../settings/UserAgentPreferences.java        | 188 ++++++++++++++++++
+ .../chromium/chrome/browser/tab/TabImpl.java  |  71 +++++++
+ .../chromium/chrome/browser/tab/TabUtils.java |  18 +-
  .../browser/android/content/content_utils.cc  |  28 +++
  .../preferences/browser_prefs_android.cc      |   7 +
- .../privacy_preferences_manager_impl.cc       | 114 +++++++++++
- chrome/browser/android/tab_android.cc         |   5 +-
- chrome/browser/android/tab_android.h          |   3 +-
- .../browser/chrome_content_browser_client.cc  |   8 +
+ .../privacy_preferences_manager_impl.cc       | 118 +++++++++++
  .../preferences/ChromePreferenceKeys.java     |   7 +-
  .../settings/PrivacyPreferencesManager.java   |   8 +
  .../org/chromium/chrome/browser/tab/Tab.java  |   2 +
- .../browser/tabmodel/TabWindowManager.java    |   8 +
+ .../browser/tabmodel/TabWindowManager.java    |   3 +
  .../tabmodel/TabWindowManagerImpl.java        |  18 ++
  .../strings/android_chrome_strings.grd        |  35 ++++
  chrome/common/pref_names.cc                   |  13 ++
  chrome/common/pref_names.h                    |   8 +
- .../widget/RadioButtonWithEditText.java       |  11 ++
+ .../widget/RadioButtonWithEditText.java       |  11 +
+ .../embedder_support/user_agent_utils.cc      |   7 +
  .../navigation_controller_android.cc          |   6 +-
  .../navigation_controller_android.h           |   3 +-
  .../renderer_host/render_process_host_impl.cc |   1 +
- .../browser/web_contents/web_contents_impl.cc |   4 +-
+ .../browser/web_contents/web_contents_impl.cc |   6 +
  .../framehost/NavigationControllerImpl.java   |   6 +-
  content/renderer/render_thread_impl.cc        |   1 -
- 33 files changed, 767 insertions(+), 14 deletions(-)
+ 31 files changed, 749 insertions(+), 10 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
@@ -48,8 +46,8 @@ to use the flag in the hamburger menu to navigate with a custom useragent leavin
 diff --git a/base/base_switches.cc b/base/base_switches.cc
 --- a/base/base_switches.cc
 +++ b/base/base_switches.cc
-@@ -164,6 +164,8 @@ const char kForceFieldTrialParams[] = "force-fieldtrial-params";
- const char kEnableThreadInstructionCount[] = "enable-thread-instruction-count";
+@@ -169,6 +169,8 @@ const char kEnableThreadInstructionCount[] = "enable-thread-instruction-count";
+ extern const char kEnableCrashpad[] = "enable-crashpad";
  #endif
  
 +const char kDesktopModeViewportMetaEnabled[] = "dm-viewport-meta-enabled";
@@ -60,7 +58,7 @@ diff --git a/base/base_switches.cc b/base/base_switches.cc
 diff --git a/base/base_switches.h b/base/base_switches.h
 --- a/base/base_switches.h
 +++ b/base/base_switches.h
-@@ -66,6 +66,8 @@ extern const char kEnableThreadInstructionCount[];
+@@ -70,6 +70,8 @@ extern const char kEnableCrashpad[];
  extern const char kSchedulerBoostUrgent[];
  #endif
  
@@ -72,7 +70,7 @@ diff --git a/base/base_switches.h b/base/base_switches.h
 diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni
 --- a/chrome/android/chrome_java_resources.gni
 +++ b/chrome/android/chrome_java_resources.gni
-@@ -998,4 +998,6 @@ chrome_java_resources = [
+@@ -946,4 +946,6 @@ chrome_java_resources = [
    "java/res/xml/sync_and_services_preferences.xml",
    "java/res/xml/theme_preferences.xml",
    "java/res/xml/tracing_preferences.xml",
@@ -82,7 +80,7 @@ diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_ja
 diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
 --- a/chrome/android/chrome_java_sources.gni
 +++ b/chrome/android/chrome_java_sources.gni
-@@ -1155,6 +1155,7 @@ chrome_java_sources = [
+@@ -1145,6 +1145,7 @@ chrome_java_sources = [
    "java/src/org/chromium/chrome/browser/payments/ui/DimmingDialog.java",
    "java/src/org/chromium/chrome/browser/payments/ui/LineItem.java",
    "java/src/org/chromium/chrome/browser/payments/ui/PaymentAppComparator.java",
@@ -94,7 +92,7 @@ diff --git a/chrome/android/java/res/layout/custom_useragent_preferences.xml b/c
 new file mode 100644
 --- /dev/null
 +++ b/chrome/android/java/res/layout/custom_useragent_preferences.xml
-@@ -0,0 +1,108 @@
+@@ -0,0 +1,106 @@
 +<?xml version="1.0" encoding="utf-8"?>
 +<!--
 +    This file is part of Bromite.
@@ -118,8 +116,6 @@ new file mode 100644
 +<ScrollView
 +    xmlns:android="http://schemas.android.com/apk/res/android"
 +    xmlns:app="http://schemas.android.com/apk/res-auto"
-+    android:layout_weight="0"
-+    android:gravity="top"
 +    android:layout_width="match_parent"
 +    android:layout_height="wrap_content">
 +
@@ -254,65 +250,18 @@ new file mode 100644
 +        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
-@@ -72,6 +72,7 @@ import org.chromium.chrome.browser.app.flags.ChromeCachedFlags;
- import org.chromium.chrome.browser.app.tab_activity_glue.ReparentingDelegateFactory;
- import org.chromium.chrome.browser.app.tab_activity_glue.TabReparentingController;
- import org.chromium.chrome.browser.app.tabmodel.AsyncTabParamsManagerSingleton;
-+import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton;
- import org.chromium.chrome.browser.bookmarks.BookmarkBridge;
- import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem;
- import org.chromium.chrome.browser.bookmarks.BookmarkModel;
-@@ -209,6 +210,13 @@ import org.chromium.ui.widget.Toast;
- import org.chromium.url.GURL;
- import org.chromium.url.Origin;
- import org.chromium.webapk.lib.client.WebApkNavigationClient;
-+import org.chromium.chrome.browser.tabmodel.TabWindowManager;
-+import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
-+import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
-+
-+import org.chromium.chrome.browser.tabmodel.TabWindowManager;
-+import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
-+import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
- 
- import org.chromium.url.GURL;
- 
-@@ -2102,11 +2110,18 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
-         } else if (id == R.id.view_source_id) {
-             currentTab.getWebContents().getNavigationController().loadUrl(new LoadUrlParams("view-source:"+currentTab.getUrlString()));
-         } else if (id == R.id.request_desktop_site_id || id == R.id.request_desktop_site_check_id) {
--            final boolean reloadOnChange = !currentTab.isNativePage();
-             final boolean usingDesktopUserAgent =
-                     currentTab.getWebContents().getNavigationController().getUseDesktopUserAgent();
--            currentTab.getWebContents().getNavigationController().setUseDesktopUserAgent(
--                    !usingDesktopUserAgent, reloadOnChange);
-+            SharedPreferencesManager.getInstance().writeBoolean(
-+                ChromePreferenceKeys.USERAGENT_ALWAYS_DESKTOP_MODE, !usingDesktopUserAgent);
-+
-+            final boolean stickyDesktopModeEnabled = SharedPreferencesManager.getInstance().readBoolean(
-+                    ChromePreferenceKeys.USERAGENT_STICKY_DESKTOP_MODE, false);
-+            if (stickyDesktopModeEnabled) {
-+                TabWindowManagerSingleton.getInstance().SetOverrideUserAgentForAllTabs(!usingDesktopUserAgent);
-+            } else {
-+                currentTab.SetOverrideUserAgent(!usingDesktopUserAgent);
-+            }
-             RecordUserAction.record("MobileMenuRequestDesktopSite");
-         } else if (id == R.id.reader_mode_prefs_id) {
-             DomDistillerUIUtils.openSettings(currentTab.getWebContents());
 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
-@@ -47,6 +47,7 @@ import org.chromium.content_public.browser.SpeechRecognition;
+@@ -44,6 +44,7 @@ import org.chromium.content_public.browser.DeviceUtils;
+ import org.chromium.content_public.browser.SpeechRecognition;
  import org.chromium.content_public.browser.UiThreadTaskTraits;
  import org.chromium.net.NetworkChangeNotifier;
- import org.chromium.ui.resources.ResourceExtractor;
 +import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl;
  
  import java.io.File;
  import java.util.ArrayList;
-@@ -322,11 +323,13 @@ public class ChromeBrowserInitializer {
+@@ -305,11 +306,13 @@ public class ChromeBrowserInitializer {
  
                          @Override
                          public void onSuccess() {
@@ -388,7 +337,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,185 @@
+@@ -0,0 +1,188 @@
 +/*
 +    This file is part of Bromite.
 +
@@ -476,6 +425,9 @@ new file mode 100644
 +    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
 +            @Nullable Bundle savedInstanceState) {
 +        LinearLayout viewGroup = (LinearLayout) super.onCreateView(inflater, container, savedInstanceState);
++        LinearLayout.LayoutParams params =
++            new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
++        viewGroup.setLayoutParams(params);
 +        ScrollView view = (ScrollView) inflater.inflate(R.layout.custom_useragent_preferences, viewGroup, false);
 +        viewGroup.addView(view);
 +
@@ -577,28 +529,21 @@ new file mode 100644
 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
-@@ -61,6 +61,18 @@ import org.chromium.ui.base.WindowAndroid;
+@@ -64,6 +64,11 @@ import org.chromium.ui.base.WindowAndroid;
  import org.chromium.ui.util.ColorUtils;
  import org.chromium.url.GURL;
  import org.chromium.url.Origin;
 +import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 +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;
-+import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
-+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}.
-@@ -481,6 +493,31 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
-                 throw new RuntimeException("Tab.loadUrl called when no native side exists");
-             }
+@@ -492,6 +497,31 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
+             // Request desktop sites for large screen tablets.
+             params.setOverrideUserAgent(calculateUserAgentOverrideOption());
  
 +            final boolean stickyDesktopModeEnabled = SharedPreferencesManager.getInstance().readBoolean(
 +                ChromePreferenceKeys.USERAGENT_STICKY_DESKTOP_MODE, false);
@@ -628,34 +573,24 @@ 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, params.getUrl(),
-@@ -493,7 +530,8 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
-                     params.getReferrer() != null ? params.getReferrer().getPolicy() : 0,
-                     params.getIsRendererInitiated(), params.getShouldReplaceCurrentEntry(),
-                     params.getHasUserGesture(), params.getShouldClearHistoryList(),
--                    params.getInputStartTimestamp(), params.getIntentReceivedTimestamp());
-+                    params.getInputStartTimestamp(), params.getIntentReceivedTimestamp(),
-+                    params.getUserAgentOverrideOption());
- 
-             for (TabObserver observer : mObservers) {
-                 observer.onLoadUrl(this, params, loadType);
-@@ -1477,6 +1515,10 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
+@@ -1507,6 +1537,10 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
              if (mWebContents != null) mWebContents.getNavigationController().loadIfNecessary();
              mIsBeingRestored = true;
              for (TabObserver observer : mObservers) observer.onRestoreStarted(this);
-+
 +            if(overrideUserAgentWhenUnFrozen != UserAgentOverrideOption.INHERIT) {
-+                SetOverrideUserAgent(overrideUserAgentWhenUnFrozen == (int)UserAgentOverrideOption.TRUE ? true : false);
++                SetOverrideUserAgent(overrideUserAgentWhenUnFrozen == (int)UserAgentOverrideOption.TRUE ? true : false,
++                    /*forcedByUser*/ true);
 +            }
          } finally {
              TraceEvent.end("Tab.restoreIfNeeded");
          }
-@@ -1596,6 +1638,42 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
-         }
+@@ -1674,6 +1708,43 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
+                 /* forcedByUser */ false);
      }
  
 +    int overrideUserAgentWhenUnFrozen = (int)UserAgentOverrideOption.INHERIT;
 +
-+    public void SetOverrideUserAgent(boolean usingDesktopUserAgent) {
++    public void SetOverrideUserAgent(boolean usingDesktopUserAgent, boolean forcedByUser) {
 +        WebContents webContents = this.getWebContents();
 +        overrideUserAgentWhenUnFrozen = UserAgentOverrideOption.INHERIT;
 +
@@ -669,11 +604,12 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
 +        }
 +
 +        if (webContents != null) {
-+            ContentUtils.setUserAgentOverride(webContents);
++            ContentUtils.setUserAgentOverride(webContents, /*forcedByUser*/ true);
 +
 +            NavigationController navigationController = webContents.getNavigationController();
 +            navigationController.setUseDesktopUserAgent(
 +                usingDesktopUserAgent, !this.isNativePage());
++            if (forcedByUser) this.setUserForcedUserAgent();
 +        }
 +        else if (this.getPendingLoadParams() != null) {
 +            if (usingDesktopUserAgent) {
@@ -692,22 +628,47 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
      @NativeMethods
      interface Natives {
          TabImpl fromWebContents(WebContents webContents);
-@@ -1615,7 +1693,8 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
-                 ResourceRequestBody postData, int transition, String referrerUrl,
-                 int referrerPolicy, boolean isRendererInitiated, boolean shoulReplaceCurrentEntry,
-                 boolean hasUserGesture, boolean shouldClearHistoryList, long inputStartTimestamp,
--                long intentReceivedTimestamp);
-+                long intentReceivedTimestamp,
-+                int userAgentOverrideOption);
-         void setActiveNavigationEntryTitleForUrl(long nativeTabAndroid, String url, String title);
-         void loadOriginalImage(long nativeTabAndroid);
-         void setAddApi2TransitionToFutureNavigations(long nativeTabAndroid, boolean shouldAdd);
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java
+@@ -20,6 +20,10 @@ import org.chromium.content_public.browser.WebContents;
+ import org.chromium.ui.base.WindowAndroid;
+ import org.chromium.ui.display.DisplayAndroidManager;
+ 
++import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton;
++import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
++import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
++
+ /**
+  * Collection of utility methods that operates on Tab.
+  */
+@@ -82,10 +86,16 @@ public class TabUtils {
+      * @param forcedByUser Whether this was triggered by users action.
+      */
+     public static void switchUserAgent(Tab tab, boolean switchToDesktop, boolean forcedByUser) {
+-        final boolean reloadOnChange = !tab.isNativePage();
+-        tab.getWebContents().getNavigationController().setUseDesktopUserAgent(
+-                switchToDesktop, reloadOnChange);
+-        if (forcedByUser) ((TabImpl) tab).setUserForcedUserAgent();
++        SharedPreferencesManager.getInstance().writeBoolean(
++            ChromePreferenceKeys.USERAGENT_ALWAYS_DESKTOP_MODE, switchToDesktop);
++
++        final boolean stickyDesktopModeEnabled = SharedPreferencesManager.getInstance().readBoolean(
++                ChromePreferenceKeys.USERAGENT_STICKY_DESKTOP_MODE, false);
++        if (stickyDesktopModeEnabled) {
++            TabWindowManagerSingleton.getInstance().SetOverrideUserAgentForAllTabs(switchToDesktop);
++        } else {
++            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
 @@ -8,6 +8,20 @@
- #include "components/embedder_support/android/util/user_agent_utils.h"
  #include "components/version_info/version_info.h"
+ #include "content/public/browser/web_contents.h"
  
 +#include "base/android/jni_android.h"
 +#include "base/android/scoped_java_ref.h"
@@ -725,11 +686,11 @@ diff --git a/chrome/browser/android/content/content_utils.cc b/chrome/browser/an
 +
  static base::android::ScopedJavaLocalRef<jstring>
  JNI_ContentUtils_GetBrowserUserAgent(JNIEnv* env) {
-   return base::android::ConvertUTF8ToJavaString(env, GetUserAgent());
-@@ -16,6 +30,20 @@ JNI_ContentUtils_GetBrowserUserAgent(JNIEnv* env) {
- static void JNI_ContentUtils_SetUserAgentOverride(
+   return base::android::ConvertUTF8ToJavaString(
+@@ -18,6 +32,20 @@ static void JNI_ContentUtils_SetUserAgentOverride(
      JNIEnv* env,
-     const base::android::JavaParamRef<jobject>& jweb_contents) {
+     const base::android::JavaParamRef<jobject>& jweb_contents,
+     jboolean j_override_in_new_tabs) {
 +  bool enabled =
 +    g_browser_process->local_state()->GetBoolean(prefs::kOverrideUserAgentDesktopModeEnabled);
 +
@@ -746,7 +707,7 @@ diff --git a/chrome/browser/android/content/content_utils.cc b/chrome/browser/an
 +
    content::WebContents* web_contents =
        content::WebContents::FromJavaWebContents(jweb_contents);
-   embedder_support::SetDesktopUserAgentOverride(web_contents,
+   embedder_support::SetDesktopUserAgentOverride(
 diff --git a/chrome/browser/android/preferences/browser_prefs_android.cc b/chrome/browser/android/preferences/browser_prefs_android.cc
 --- a/chrome/browser/android/preferences/browser_prefs_android.cc
 +++ b/chrome/browser/android/preferences/browser_prefs_android.cc
@@ -772,7 +733,7 @@ diff --git a/chrome/browser/android/preferences/browser_prefs_android.cc b/chrom
 diff --git a/chrome/browser/android/preferences/privacy_preferences_manager_impl.cc b/chrome/browser/android/preferences/privacy_preferences_manager_impl.cc
 --- a/chrome/browser/android/preferences/privacy_preferences_manager_impl.cc
 +++ b/chrome/browser/android/preferences/privacy_preferences_manager_impl.cc
-@@ -12,6 +12,26 @@
+@@ -12,6 +12,30 @@
  #include "components/metrics/metrics_pref_names.h"
  #include "components/prefs/pref_service.h"
  
@@ -783,6 +744,10 @@ diff --git a/chrome/browser/android/preferences/privacy_preferences_manager_impl
 +#include "content/common/renderer.mojom.h"
 +#include "chrome/browser/chrome_content_browser_client.h"
 +
++#include "components/embedder_support/content_settings_utils.h"
++#include "components/embedder_support/switches.h"
++#include "components/embedder_support/user_agent_utils.h"
++
 +#include "base/android/jni_android.h"
 +#include "base/android/jni_array.h"
 +#include "base/android/jni_string.h"
@@ -799,7 +764,7 @@ diff --git a/chrome/browser/android/preferences/privacy_preferences_manager_impl
  namespace {
  
  PrefService* GetPrefService() {
-@@ -67,3 +87,97 @@ static void JNI_PrivacyPreferencesManagerImpl_SetNetworkPredictionEnabled(
+@@ -67,3 +91,97 @@ static void JNI_PrivacyPreferencesManagerImpl_SetNetworkPredictionEnabled(
        enabled ? chrome_browser_net::NETWORK_PREDICTION_WIFI_ONLY
                : chrome_browser_net::NETWORK_PREDICTION_NEVER);
  }
@@ -814,10 +779,10 @@ diff --git a/chrome/browser/android/preferences/privacy_preferences_manager_impl
 +
 +  base::CommandLine* parsed_command_line =
 +      base::CommandLine::ForCurrentProcess();
-+  parsed_command_line->RemoveSwitch(switches::kUserAgent);
++  parsed_command_line->RemoveSwitch(embedder_support::kUserAgent);
 +  if (!ua.empty()) {
 +    if (overrideUserAgentEnabled) {
-+      parsed_command_line->AppendSwitchASCII(switches::kUserAgent, ua);
++      parsed_command_line->AppendSwitchASCII(embedder_support::kUserAgent, ua);
 +    }
 +
 +    for (auto iter = content::RenderProcessHost::AllHostsIterator(); !iter.IsAtEnd();
@@ -897,71 +862,10 @@ diff --git a/chrome/browser/android/preferences/privacy_preferences_manager_impl
 +                                              enabled);
 +  UpdateOverrideUserAgent();
 +}
-\ No newline at end of file
-diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_android.cc
---- a/chrome/browser/android/tab_android.cc
-+++ b/chrome/browser/android/tab_android.cc
-@@ -373,7 +373,8 @@ TabAndroid::TabLoadStatus TabAndroid::LoadUrl(
-     jboolean has_user_gesture,
-     jboolean should_clear_history_list,
-     jlong input_start_timestamp,
--    jlong intent_received_timestamp) {
-+    jlong intent_received_timestamp,
-+    jint user_agent_override_option) {
-   if (!web_contents())
-     return PAGE_LOAD_FAILED;
- 
-@@ -430,6 +431,8 @@ TabAndroid::TabLoadStatus TabAndroid::LoadUrl(
-       load_params.input_start =
-           base::TimeTicks::FromUptimeMillis(intent_received_timestamp);
-     }
-+    load_params.override_user_agent = static_cast<NavigationController::UserAgentOverrideOption>(
-+      user_agent_override_option);
-     web_contents()->GetController().LoadURLWithParams(load_params);
-   }
-   return DEFAULT_PAGE_LOAD;
-diff --git a/chrome/browser/android/tab_android.h b/chrome/browser/android/tab_android.h
---- a/chrome/browser/android/tab_android.h
-+++ b/chrome/browser/android/tab_android.h
-@@ -167,7 +167,8 @@ class TabAndroid : public base::SupportsUserData {
-       jboolean has_user_gesture,
-       jboolean should_clear_history_list,
-       jlong omnibox_input_received_timestamp,
--      jlong intent_received_timestamp);
-+      jlong intent_received_timestamp,
-+      jint user_agent_override_option);
-   void SetActiveNavigationEntryTitleForUrl(
-       JNIEnv* env,
-       const base::android::JavaParamRef<jstring>& jurl,
-diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
---- a/chrome/browser/chrome_content_browser_client.cc
-+++ b/chrome/browser/chrome_content_browser_client.cc
-@@ -1286,6 +1286,13 @@ std::string GetPlatformForUAMetadata() {
- blink::UserAgentMetadata GetUserAgentMetadata() {
-   blink::UserAgentMetadata metadata;
- 
-+  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-+  if (command_line->HasSwitch(switches::kUserAgent)) {
-+    std::string ua = command_line->GetSwitchValueASCII(switches::kUserAgent);
-+
-+    return metadata;
-+  }
-+
-   metadata.brand_version_list = GetBrandVersionList();
-   metadata.full_version = version_info::GetVersionNumber();
-   metadata.platform = GetPlatformForUAMetadata();
-@@ -2379,6 +2386,7 @@ void ChromeContentBrowserClient::AppendExtraCommandLineSwitches(
-             switches::kDisableTargetBlankImpliesNoOpener);
-       }
- 
-+
- #if defined(OS_ANDROID)
-       // Communicating to content/ for BackForwardCache.
-       if (prefs->HasPrefPath(policy::policy_prefs::kBackForwardCacheEnabled) &&
 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
-@@ -828,6 +828,9 @@ public final class ChromePreferenceKeys {
+@@ -881,6 +881,9 @@ 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*");
  
@@ -971,7 +875,7 @@ diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/bro
      /**
       * These values are currently used as SharedPreferences keys, along with the keys in
       * {@link GrandfatheredChromePreferenceKeys#getKeysInUse()}. Add new SharedPreferences keys
-@@ -890,7 +893,9 @@ public final class ChromePreferenceKeys {
+@@ -954,7 +957,9 @@ public final class ChromePreferenceKeys {
                  SETTINGS_SAFETY_CHECK_RUN_COUNTER,
                  SIGNIN_PROMO_IMPRESSIONS_COUNT_NTP,
                  TWA_DISCLOSURE_SEEN_PACKAGES,
@@ -1005,7 +909,7 @@ diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/Tab.jav
       */
      void setIsTabStateDirty(boolean isTabStateDirty);
  
-+    void SetOverrideUserAgent(boolean usingDesktopUserAgent);
++    void SetOverrideUserAgent(boolean usingDesktopUserAgent, boolean forcedByUser);
 +
      /**
       * If set to true, any future navigations in the tab automatically get
@@ -1013,19 +917,7 @@ diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/Tab.jav
 diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManager.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManager.java
 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManager.java
 +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManager.java
-@@ -10,6 +10,11 @@ import org.chromium.chrome.browser.tab.Tab;
- import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier;
- import org.chromium.ui.base.WindowAndroid;
- 
-+import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
-+import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
-+
-+import java.util.List;
-+
- /**
-  * Manages multiple {@link TabModelSelector} instances, each owned by different {@link Activity}s.
-  *
-@@ -76,4 +81,7 @@ public interface TabWindowManager {
+@@ -79,4 +79,7 @@ public interface TabWindowManager {
       * @return Specified {@link Tab} or {@code null} if the {@link Tab} is not found.
       */
      Tab getTabById(int tabId);
@@ -1036,7 +928,7 @@ diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browse
 diff --git a/chrome/browser/tabmodel/internal/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerImpl.java b/chrome/browser/tabmodel/internal/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerImpl.java
 --- a/chrome/browser/tabmodel/internal/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerImpl.java
 +++ b/chrome/browser/tabmodel/internal/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerImpl.java
-@@ -119,6 +119,24 @@ public class TabWindowManagerImpl implements ActivityStateListener, TabWindowMan
+@@ -128,6 +128,24 @@ public class TabWindowManagerImpl implements ActivityStateListener, TabWindowMan
          return null;
      }
  
@@ -1051,7 +943,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);
++                        theTab.SetOverrideUserAgent(usingDesktopUserAgent, /*forcedByUser*/ true);
 +                    }
 +                }
 +            }
@@ -1109,7 +1001,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro
 diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
 --- a/chrome/common/pref_names.cc
 +++ b/chrome/common/pref_names.cc
-@@ -418,6 +418,19 @@ const char kAllowJavascriptAppleEvents[] =
+@@ -417,6 +417,19 @@ const char kAllowJavascriptAppleEvents[] =
  
  #endif
  
@@ -1132,7 +1024,7 @@ diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
 diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
 --- a/chrome/common/pref_names.h
 +++ b/chrome/common/pref_names.h
-@@ -1120,6 +1120,14 @@ extern const char kCartModuleWelcomeSurfaceShownTimes[];
+@@ -1135,6 +1135,14 @@ extern const char kSuppressDifferentOriginSubframeJSDialogs[];
  extern const char kIncognitoTabHistoryEnabled[];
  #endif
  
@@ -1168,6 +1060,23 @@ diff --git a/components/browser_ui/widget/android/java/src/org/chromium/componen
      }
  
      /**
+diff --git a/components/embedder_support/user_agent_utils.cc b/components/embedder_support/user_agent_utils.cc
+--- a/components/embedder_support/user_agent_utils.cc
++++ b/components/embedder_support/user_agent_utils.cc
+@@ -134,6 +134,13 @@ std::string GetPlatformForUAMetadata() {
+ blink::UserAgentMetadata GetUserAgentMetadata() {
+   blink::UserAgentMetadata metadata;
+ 
++  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
++  if (command_line->HasSwitch(kUserAgent)) {
++    std::string ua = command_line->GetSwitchValueASCII(kUserAgent);
++
++    return metadata;
++  }
++
+   metadata.brand_version_list = GetBrandVersionList();
+   metadata.full_version = version_info::GetVersionNumber();
+   metadata.platform = GetPlatformForUAMetadata();
 diff --git a/content/browser/renderer_host/navigation_controller_android.cc b/content/browser/renderer_host/navigation_controller_android.cc
 --- a/content/browser/renderer_host/navigation_controller_android.cc
 +++ b/content/browser/renderer_host/navigation_controller_android.cc
@@ -1207,7 +1116,7 @@ diff --git a/content/browser/renderer_host/navigation_controller_android.h b/con
 diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
 --- a/content/browser/renderer_host/render_process_host_impl.cc
 +++ b/content/browser/renderer_host/render_process_host_impl.cc
-@@ -3366,6 +3366,7 @@ void RenderProcessHostImpl::PropagateBrowserCommandLineToRenderer(
+@@ -3430,6 +3430,7 @@ void RenderProcessHostImpl::PropagateBrowserCommandLineToRenderer(
  #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
      switches::kSchedulerBoostUrgent,
  #endif
@@ -1226,16 +1135,18 @@ diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser
  #include "base/threading/thread_task_runner_handle.h"
  #include "base/time/time.h"
  #include "base/trace_event/optional_trace_event.h"
-@@ -2447,7 +2448,8 @@ const blink::web_pref::WebPreferences WebContentsImpl::ComputeWebPreferences() {
-   prefs.threaded_scrolling_enabled =
-       !command_line.HasSwitch(blink::switches::kDisableThreadedScrolling);
+@@ -2510,6 +2511,11 @@ const blink::web_pref::WebPreferences WebContentsImpl::ComputeWebPreferences() {
+       prefs.viewport_meta_enabled = false;
+   }
  
--  if (IsOverridingUserAgent())
 +  if (IsOverridingUserAgent() &&
-+      !command_line.HasSwitch(switches::kDesktopModeViewportMetaEnabled))
-     prefs.viewport_meta_enabled = false;
- 
++      !command_line.HasSwitch(switches::kDesktopModeViewportMetaEnabled)) {
++    prefs.viewport_meta_enabled = false;
++  }
++
    prefs.main_frame_resizes_are_orientation_changes =
+       command_line.HasSwitch(switches::kMainFrameResizesAreOrientationChanges);
+ 
 diff --git a/content/public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java b/content/public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java
 --- a/content/public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java
 +++ b/content/public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java
@@ -1262,7 +1173,7 @@ diff --git a/content/public/android/java/src/org/chromium/content/browser/frameh
 diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
 --- a/content/renderer/render_thread_impl.cc
 +++ b/content/renderer/render_thread_impl.cc
-@@ -1673,7 +1673,6 @@ void RenderThreadImpl::SetWebKitSharedTimersSuspended(bool suspend) {
+@@ -1636,7 +1636,6 @@ void RenderThreadImpl::SetWebKitSharedTimersSuspended(bool suspend) {
  }
  
  void RenderThreadImpl::SetUserAgent(const std::string& user_agent) {